Demodulacja FSK, odzyskiwanie taktowania bitów

10

Obecnie wdrażam akustyczną modulację i demodulację FSK. Nie jestem facetem od przetwarzania sygnałów, więc każda pomoc dotycząca odzyskiwania taktowania bitów byłaby bardzo wdzięczna. Obecnie zaimplementowałem demodulator za pomocą dwóch dopasowanych filtrów dla każdego tonu (z różnicą faz wynoszącą dla niespójnego wykrywania). Zasadniczo mocą wyjściową każdego filtra są piki o różnych amplitudach. Mam dwa pytania:90

  • Jak mogę odzyskać bit timing?
  • Co polecasz do preambuły synchronizacji pakietów (ćwierkanie, kod szczekania, złoty kod itp.)?

Wyszukałem algorytm Gardnera, ale nie jestem pewien, czy ma on zastosowanie i jak. Zastanów się, że obecnie pracuję na 2 częstotliwościach z przepływnością 800 bps przy użyciu karty dźwiękowej.

Piotr
źródło

Odpowiedzi:

8

Obecnie wdrażam akustyczną modulację i demodulację FSK. Nie jestem facetem od przetwarzania sygnałów…

Ponieważ mówisz, że masz dopasowane filtry i wspominasz o niespójnym wykrywaniu, myślę, że jesteś już w dużej mierze osobą do komunikacji cyfrowej - krok do bycia osobą DSP jest dość mały :)

W pełni rozwinięte podejście SDR synchronizatora

Klasycznym sposobem na zrobienie tego jest wzięcie wyników dwóch filtrów ((wielkość) do kwadratu, filtr dolnoprzepustowy wynik powyżej I podczas / po filtrowaniu dziesiętnym (jeśli możliwe), aby nie marnować operacji na sekundę.2fsymbol,max

Zrobiłem sobie szybki demod FSK sygnału pasmowego o wartości rzeczywistej (myślę, że gdybym to zrobił ponownie, zastąpiłbym dwa filtry pasmowe jednym połączonym tłumaczeniem częstotliwości i jednym filtrem dolnoprzepustowym, co dałoby mi złożone pasmo podstawowe, lub rzuciłbym bank filtrów wielofazowych na problem, ale cokolwiek) w GNU Radio przy pomocy towarzysza GNU Radio (plik wykresu przepływu tutaj ):

FSK recv

Chodzi o to, że prawdopodobnie chcemy synchronizować synchronizację symboli między podziałem i blokiem progowym. Moglibyśmy zrobić później - klasycznym podejściem do „mikrokontrolera i projektowania sprzętu cyfrowego” byłby w rzeczywistości zlewozmywak zegarowy Mullera i Muellera, który również działałby tam równie dobrze - ale nie marnujmy informacji o zboczu.

Dodałbym tutaj synchronizację zegara wielofazowego; Muszę przyznać, że nie potrafiłem sformułować tego lepiej niż Tom, uczeń Harrisa, w dokumentacji tytułowego bloku GNU Radio :

Synchronizator synchronizacji za pomocą banków filtrów wielofazowych.

Blok ten wykonuje synchronizację czasową dla sygnałów PAM poprzez minimalizację pochodnej filtrowanego sygnału, co z kolei maksymalizuje SNR i minimalizuje ISI.

Takie podejście polega na skonfigurowaniu dwóch banków filtrów; jeden bank filtrów zawiera dopasowany filtr kształtujący impulsy sygnału (taki jak filtr z podniesionym korzeniem cosinusa), przy czym każda gałąź banku filtrów zawiera inną fazę filtra. Drugi bank filtrów zawiera pochodne filtrów w pierwszym banku filtrów. Myśląc o tym w dziedzinie czasu, pierwszy bank filtrów zawiera filtry, które mają kształt sinc. Chcemy wyrównać sygnał wyjściowy, który ma być próbkowany dokładnie na szczycie kształtu cynku. Pochodna sinc zawiera zero w maksymalnym punkcie ( ). Ponadto obszar wokół punktu zerowego jest stosunkowo liniowy. Wykorzystujemy ten fakt do generowania sygnału błędu.cynk ( 0 ) = 1 ,sincsinc(0)=1,sinc(0)=0

Jeśli sygnał z filtrów pochodnych wynosi dla tego filtra, a wyjście dopasowanego filtra to , błąd obliczamy jako:i x i [ n ]di[n]ixi[n]

e[n]={xi[n]}{di[n]}+{xi[n]}{di[n]}2.0 .

To równanie uśrednia błąd w częściach rzeczywistych i urojonych. Są dwa powody, dla których mnożymy przez sam sygnał. Po pierwsze, jeśli symbol może być dodatni lub ujemny, ale chcemy, aby warunek błędu zawsze mówił nam, abyśmy szli w tym samym kierunku, w zależności od tego, po której stronie punktu zerowego się znajdujemy. Znak dostosowuje termin błędu, aby to zrobić. Po drugie, wielkość skaluje warunek błędu w zależności od amplitudy symbolu, więc większe sygnały dają nam silniejszy warunek błędu, ponieważ mamy większą pewność co do wartości tego symbolu. Zastosowanie wielkości zamiast samego znaku jest szczególnie dobre w przypadku sygnałów o niskim SNR.xi[n]xi[n]xi[n]

Sygnał błędu, , daje nam wartość proporcjonalną do odległości od punktu zerowego w sygnale pochodnym. Chcemy ustawić tę wartość na zero, dlatego utworzyliśmy pętlę drugiego rzędu. Mamy dwie zmienne dla tej pętli; to numer filtra w banku filtrów, w którym się znajdujemy, a to szybkość, przez którą przejeżdżamy przez filtry w stanie ustalonym. To znaczy, ze względu na naturalne różnice zegara między nadajnikiem a odbiornikiem, reprezentuje tę różnicę i przemieściłby ścieżki faz filtra, aby utrzymać odbiornik zablokowany. Myśląc o tym jako o PLL drugiego rzędu, to częstotliwość, a to faza. Więc aktualizujemyd k d wskaźnik d wskaźnik d wskaźnik d k d wskaźnik d k d α d β d α d β wzmocnienie 2e[n]dkdratedratedratedkdrate i przy użyciu standardowych równań pętli opartych na dwóch sygnałach błędów, i . Mamy te dwie wartości ustawione w oparciu o siebie nawzajem dla krytycznie tłumionego systemu, więc w konstruktorze bloku pytamy tylko o „wzmocnienie”, które jest podczas gdy jest równe .dkdαdβdαdβgain24

Uświadomienie sobie tego to częstotliwość dźwięku

Tak więc, odpowiednio sparametryzując ten blok (i prawdopodobnie zmniejszając bpf_decimi lpf_decimaby zapewnić synchronizatorowi więcej miejsca na przesunięcie faz), możesz zbudować bardzo stabilne odzyskiwanie taktowania symboli, co byłoby całkowicie przesadą dla twojej aplikacji 😁

Ponieważ próbujesz z kartą dźwiękową na obu końcach, a ponieważ zakładam, że nie musisz mieć do czynienia z Dopplerem, szybkość symboli ma stały stosunek do częstotliwości nośnych (np. Strona nadawcza ma wyższą nośną z okres 8 próbek kart dźwiękowych, a symbol zawsze przyjmuje, powiedzmy 128 próbek, więc jest stały stosunek), możesz zrobić skrót:

Jeśli znasz stosunek częstotliwości nośnej do prędkości symbolu, po prostu oszacuj jedną, a drugą otrzymasz za darmo! W tym przypadku, FSK, jest to szczególnie łatwe: wystarczy poczekać na okres, kiedy np. Górne pasmo jest aktywne, i użyć demodulatora kwadraturowego (tj. Praktycznie ), aby uzyskać oszacowanie częstotliwości nośnej po filtrze pasmowym dziesiętnym i użyj uzyskanej wartości jako współczynnika korekcji częstotliwości - natychmiast rozwiązujesz problem odzyskiwania częstotliwości nośnej i odzyskiwania prędkości symbolu jednocześnie. Nie sądzę nawet, aby po tym trzeba było odzyskać czas - po przekroczeniu progu, jeśli wystarczająco przesadzisz (co przy tych stawkach nie stanowi problemu), możesz po prostu podjąć decyzję większością głosów w oknie lub zmienić to okno tak długo, jak to konieczne, aby uzyskać maksimum w oknie.darctandt[n]

Odnośnie synchronizacji pakietów

Cóż, ponieważ masz działający demodulator, który prawdopodobnie nie będzie miał zbyt dużej synchronizacji, gdy nie będzie sygnału, po prostu użyj ustalonej znanej sekwencji danych, aby znaleźć swój pakiet.

Marcus Müller
źródło