Próbuję przesyłać dane binarne z jednego urządzenia do drugiego za pośrednictwem kanału audio (głośnik / mikrofon). Używam AFSK (Audio Frequency Shift Keying) jak w pakiecie Radio, z i dwiema częstotliwościami f m a r k = 1200 Hz i f s p a c e = 2200 Hz . Grałem trochę w Rubim, a moja pierwsza implementacja po prostu imituje klasyczny niespójny demodulator, który do tej pory działa dobrze.
Problem polega na tym, że próbuję przenieść to na platformę mobilną, na której wydajność jest problemem, a moje obecne rozwiązanie jest zbyt wolne. Znalazłem wiele sposobów demodulacji AFSK w oprogramowaniu:
- Przesuwne DFT (FFT)
- Przesuwny filtr Görtzel
- Pętla synchronizacji fazowej
- Zero Crossing
Jaka byłaby droga? Jest po prostu zbyt wiele opcji do wyboru. Jestem pewien, że dostępnych jest jeszcze więcej opcji. Być może istnieją jeszcze lepsze rozwiązania niż te, które wymieniłem powyżej? Czy ktoś ma dla mnie przykłady kodu? Jestem zaniepokojony
- Wydajność (powinna działać na platformie mobilnej, powiedzmy na urządzeniu z systemem iOS lub Android)
- Stabilność (powinna być w stanie obsłużyć trochę hałasu)
Wszelkie sugestie i wskazówki są mile widziane!
źródło
Odpowiedzi:
Myślę, że można uzyskać najlepszą wydajność pod względem wskaźnika błędów bitów demodulatora (BER) z pętlą fazową. Ale musisz być szybki. Myślę, że najlepszym rozwiązaniem dla szybkiego algorytmu, który nadal działa dość dobrze, jest przejście przez zero.
Na marginesie, chciałbym zasugerować zmianę 2200 Hz na 2400 Hz. Naiwna implementacja schematu 1200/2200 Hz przyniosłaby nieciągłości, jak widać około dwóch trzecich na wykresie poniżej, gdzie 2200 Hz przechodzi w 1200 Hz.
Aby zminimalizować używane pasmo i uniknąć nieciągłości, które zniekształcają sygnał, konieczne jest, aby faza była ciągła. Nawet jeśli sprawisz, że faza nadajnika będzie ciągła, nadal będzie problem, że symbole 2200 Hz nie zawsze będą miały taką samą liczbę przejść przez zero z powodu różnych faz. Zwykle będą miały cztery przejścia przez zero, ale czasami będą miały trzy. Z drugiej strony symbole 1200 Hz zawsze będą miały dwa przejścia przez zero, ponieważ szybkość transmisji dzieli się równomiernie na częstotliwość FSK.
Możesz rozwiązać oba te problemy, zmieniając 2200 Hz na 2400 Hz. Wówczas symbole zawsze zaczynają się i kończą na 0 stopniach (co automatycznie powoduje, że faza jest ciągła) i zawsze będą miały tę samą liczbę przejść przez zero - dwa i cztery.
źródło
Zrobiłem dekoder dla AFSK (standard Bell 202), używając odbiorników korelacyjnych dla 1200 Hz i 2200 Hz, z bardzo dobrymi wynikami.
Otrzymana amplituda jest całkowicie niezależna od fazy sygnału, a wyjściowy SNR jest bardzo dobry.
źródło
W przypadku RTTY 45.45 bodów, będziesz mieć również symbole, które nie są liczbami całkowitymi próbek, więc potrzebujesz funkcji, którą można wywołać dla każdej próbki, a następnie zasygnalizować jej wartość zwracaną, gdy ten symbol się skończy. Potrzebujesz akumulatora fazowego, który utrzymuje bieżącą sumę w miejscu, w którym znajduje się faza fali sinusoidalnej.
Aby wysłać symbole, których długość nie jest całkowitą wielokrotnością częstotliwości próbkowania, potrzebujesz tej funkcji ...
Aby go użyć, wygeneruj następną próbkę fali sinusoidalnej i wywołaj tę funkcję, a następnie sprawdź, czy wartość zwracana NIE jest równa dwa. Jeśli nie jest równy dwa, przejdź do następnego symbolu i zdecyduj, czy wysyłasz znak spacji, a następnie wywołaj tę funkcję ponownie w bloku kodu, który jest wykonywany, gdy dowiesz się, że zwracana wartość nie jest równa dwa.
A oto akumulator fazowy z oprogramowania Rockbox, ze zmianą pozwalającą na zmiany amplitudy (pełna objętość to 32767, 180 stopni poza fazą to pełna głośność -32768).
źródło