Ultradźwiękowe wykrywanie sygnału

9

Stworzyłem dość prosty system TDOA, który wykorzystuje sygnały ultradźwiękowe emitowane z dwóch głośników do geolokalizacji (w stosunku do głośników) telefonów komórkowych. Dwa sygnały są oddzielone częstotliwością.

System ma następujące ograniczenia:

  • Sygnały muszą być niesłyszalne. W tym celu trzymamy się częstotliwości powyżej 17 kHz. Kilka osób wciąż to słyszy, ale większość nie.
  • Częstotliwość próbkowania wynosi 44,1 kHz.
  • Muzyka zwykle będzie odtwarzana, więc na niższych częstotliwościach jest dużo zakłóceń.
  • Nie mamy kontroli nad tym, jak głośniki i mikrofony działają na wyższych częstotliwościach, dlatego utrzymaliśmy górny limit na poziomie około 20 kHz.

Szczególnym sygnałem, którego używam, jest modulowany przez BPSK 13-bitowy kod Barkera ze względu na ich dobre właściwości autokorelacji. Autokorelacja wygląda następująco: Autokorelacja sygnału

Kiedy jednak koreluję krzyżowo oczekiwany sygnał z odbieranym sygnałem w prawdziwym życiu, to, co otrzymuję, zwykle wygląda tak: Typowa korelacja krzyżowa

Niebieski to korelacja krzyżowa z sygnałem głośnika 1, a czerwony to korelacja krzyżowa z sygnałem głośnika 2. Wygląda na to, że echa są znaczące i niestety często silniejsze niż bezpośredni sygnał ścieżki ze względu na wzmocnienie kierunkowe mikrofonu.

Próbowałem po prostu wykryć najwcześniejszy pojawienie się sygnału, ponieważ jest to prawdopodobnie bezpośrednia ścieżka. To podejście jest bardzo wrażliwe na próg, którego używam do decydowania, kiedy sygnał jest obecny, a więc nie jest wcale solidny.

Chciałbym solidnego podejścia do określania „prawdziwego” czasu przybycia sygnału, tj. Czasu przybycia sygnału ścieżki bezpośredniej. Być może jakaś forma oszacowania kanału i dekonwolucji? Jeśli tak, jak to by działało?

Dane / Kod: Chcę wyjaśnić, że nie oczekuję od nikogo analizowania danych ani sprawdzania mojego kodu. Udostępniłem je na wypadek, gdybyś chciał to zrobić. Najbardziej interesują mnie pomysły.

Udostępniłem nieprzetworzony odebrany sygnał i modulowane oczekiwane sygnały do ​​pobrania. Wszystkie są próbkowane przy 44,1 kHz. Korelacja odbieranego sygnału z oczekiwanymi sygnałami da w wyniku coś podobnego, ale nie identycznego z powyższym obrazem, ponieważ przesuwam odebrane sygnały do ​​pasma podstawowego i deklamuję przed korelacją z oczekiwanymi sygnałami.

Odebrany sygnał

Oczekiwany sygnał nr 1

Oczekiwany sygnał # 2

Skrypty Matlab Skrypty Matlab zawierają zarówno skrypt generowania sygnału (genLocationSig.m), jak i mój skrypt odbierania / przetwarzania (calcTimingOffset.m).

Jim Clay
źródło
Czy możesz udostępniać dane rx1, rx2 i szablonów?
Tarin Ziyaee
@ user4619 Spróbuję to zrobić tego wieczoru.
Jim Clay
Naprawdę szybko: otrzymałem twoje dane i stworzyłem STFT-PSD z kontrastem . Zgaduję, że te 5 sygnałów na dole to dwa sygnały oddzielone częstotliwością. Wygląda na to, że twoje sygnały są przesyłane w porządku, ale nie sądzę, że twoim problemem są echa lub wielościeżka. Jak widać, między impulsami jest co najmniej na początku dużo zakłóceń (szerokopasmowych). Jeśli kompleksowo przesuwasz pasmo, próbkujesz w dół, korelujesz z sekwencją szczekania i patrzysz na kopertę, co widzisz?
Tarin Ziyaee
1
Ok, kilka rzeczy: I) czy zastanawiałeś się nad użyciem ćwierkania liniowego zamiast kodowanych przebiegów takich jak ten? Masz z nimi znacznie większą elastyczność, a części ruchome są znacznie mniejsze. II) Jakie są twoje ograniczenia przepustowości? Na przykład twoje szablony wydają się mieć szerokość około 1 KHz, czy jest jakiś powód? Czy możesz iść wyżej? Z liniowym ćwierkaniem jest to łatwe. III) Chociaż wątpię, czy coś złego dzieje się z twoją demodulacją, postawienie tego pomogłoby. I zaoszczędziłoby mi to kłopotów z pisaniem tego!
Tarin Ziyaee
1
Jeśli chodzi o komentarze do bitów, istnieje nieporozumienie: nazwijmy każdy z 13 stanów kodu szczekania „chipem”. Więc jeśli trochę transmituję, przesyłam 13 żetonów. Jeśli przesyłam 2 bity, przesyłam 26 żetonów itp. Moje pytanie brzmiało: ile bitów przesyłasz? Zakładam, że transmitujesz tylko 1 bit, więc mówię, że możesz również rozważyć przesłanie znacznie więcej, aby zwiększyć swoje zyski z kodowania. Czy to ma sens?
Tarin Ziyaee

Odpowiedzi:

3

To nie są kody, których szukasz ...

Jak wspomniałem w komentarzach, istnieje wiele sposobów na wykonanie solidnego TDOA. (Korelacja krzyżowa z liniowym ćwierkaniem, ćwierkaniem wykładniczym i metodami typu CDMA). Zbudowałeś już system TDOA wykorzystujący kody (i jest to rzeczywiście dobry wybór w porównaniu do ćwierkania liniowego, jeśli potrzebujesz solidności do dopplera), jednak ograniczasz się sztucznie na dwa sposoby:

  • Kody szczekaczy są tylko długie 13. Możemy jednak tworzyć kody sekwencji PN o dowolnej długości, aby uzyskać znacznie większy zysk kodowania.
  • Zastosowanie tylko 1trochę w twojej transmisji. Możemy zakodować całą preambułę wielu bitów do transmisji, zyskując większą odporność na wielościeżkową.

Użyj sekwencji PN:

Tak więc, bardzo prosto, zmień kody, których używasz do modulowania swojego przewoźnika poprzez: Zamiast tego użyj Sekwencji PN. Kody generowane przez PN mogą mieć (prawie) dowolną długość i mogą być generowane za pomocą LFSR . (W niektórych tekstach używają również nazwy „wybielacze”). Oto trzy sekwencje PN długości31, 61, i 127 odpowiednio.

PN_31 = [ 1  1 -1 -1  1  1 -1  1 -1 -1  1 -1 -1 -1 -1  1 -1  1 -1  1  1  1 -1  1  1 -1 -1 -1  1  1  1];

PN_61 = [ 1  1  1 -1  1  1 -1  1 -1 -1  1 -1 -1  1  1  1 -1 -1 -1  1 -1  1  1  1  1 -1 -1  1 ...
     -1  1 -1 -1 -1  1  1 -1 -1 -1 -1  1 -1 -1 -1 -1 -1  1  1  1  1  1  1 -1  1 -1  1 -1 ...
      1  1 -1 -1  1  1 -1];

PN_127 = [-1     1     1     1    -1     1    -1    -1     1    -1     1     1    -1    -1    -1     1     1    -1     1     1     1     1    -1     1     1    -1     1    -1 ...
       1     1    -1     1     1    -1    -1     1    -1    -1     1    -1    -1    -1     1     1     1    -1    -1    -1    -1     1    -1     1     1     1     1     1 ...
      -1    -1     1    -1     1    -1     1     1     1    -1    -1     1     1    -1     1    -1    -1    -1     1    -1    -1     1     1     1     1    -1    -1    -1 ...
       1    -1     1    -1    -1    -1    -1     1     1    -1    -1    -1    -1    -1     1    -1    -1    -1    -1    -1    -1     1     1     1     1     1     1     1 ...
      -1     1    -1     1    -1     1    -1    -1     1     1    -1    -1     1     1     1];

Kołowe i liniowe autokorelacje sekwencji pokazano poniżej. Wyraźnie uzyskają białe widma, ale co więcej, nie jesteśmy już ograniczeni13długości wiórów. W rzeczywistości ostatni kod, PN_127, daje zysk kodowania na poziomie10 log[12713]10 Wzmocnienie dB w stosunku do sekwencji szczekania, gwarantując jednocześnie białe widma.

wprowadź opis zdjęcia tutaj

Prześlij preambułę:

W swojej konkretnej aplikacji wspomniałeś, że transmitujesz tylko jeden bit. Powinieneś spróbować tego uniknąć, jeśli możesz pomóc, i przesłać tyle bitów, ile pozwala twoja aplikacja, aby uzyskać dalsze korzyści kodowania.

Jest to często wykonywane w protokołach komunikacyjnych w celu wyrównania z początkiem pakietu. Przesyłana jest (znana) preambuła złożona z wielu bitów. Każdy bit składa się z wielu żetonów. (W naszym przykładzie31, 61lub 127chipy z jednym z powyższych kodów PN). Wreszcie, sama sekwencja bitów może składać się z jeszcze innej sekwencji PN, a jeśli chcesz, możesz przesłać13 bity tworzące wzór barkera, przy czym każdy bit składa się z jednej z powyższych sekwencji PN.


Wypróbuj jedno lub oba z tych rozwiązań i przedstaw wyniki. Oczekuję, że nastąpią namacalne ulepszenia, nad którymi będziemy mogli powtarzać. (Kształtowanie impulsu, różne / dłuższe sekwencje PN itp.).

Tarin Ziyaee
źródło
1
Tak, planuję wypróbować dłuższe sekwencje. Nie wiedziałem, że okrągłe autokorelacje sekwencji pn były tak ładne - interesujące. Niestety dla mojej aplikacji ważna jest liniowa autokorelacja. Jeśli chodzi o preambułę - cała sekwencja jest niejako „preambułą”, w tym sensie, że użyteczne jest to, że preambuła jest znanym wzorcem danych. Cały mój sygnał jest znany z góry.
Jim Clay
Postanowiłem trochę przesadzić w długości sygnału, używając rzędu 10 lfsr (1023 żetonów), aby albo udowodnić, albo wykluczyć, że problem można rozwiązać poprzez wydłużenie sygnału. Opublikuję co się stanie.
Jim Clay
1
@JimClay Cieszę się, że to słyszę. Jestem ciekawy, jak teraz wyglądają otrzymane sygnały / sygnały. To wspaniale.
Tarin Ziyaee
1
@endolith Tak, doppler jest problemem. Radzę sobie z tym przez wielokrotne korelowanie, za każdym razem przesuwając częstotliwość odbieranego sygnału o inną wartość. Jest to łatwe do zrobienia, jeśli korelujesz w dziedzinie częstotliwości.
Jim Clay
1
@endolith Jak Jim Clay opisał swoją metodę, w zasadzie oblicza tak zwaną funkcję niejednoznaczności . To znaczy wyniki krzyżowe, przy czym drugi wymiar odpowiada częstotliwości podstawowej. Ujawni to szczyt, a zatem, ponieważ znamy pierwotną częstotliwość, jej stopień dopplerowski.
Tarin Ziyaee