Prawie zakończyłem mój projekt dekodera DCF77 o otwartym źródle. Wszystko zaczęło się, gdy zauważyłem, że standardowe biblioteki Arduino DCF77 działają bardzo słabo na hałaśliwych sygnałach. W szczególności nigdy nie byłem w stanie wydobyć czasu z dekoderów, gdy antena znajdowała się blisko komputera lub kiedy pracowała moja pralka.Dekoder DCF77 a hałaśliwy sygnał
Moim pierwszym podejściem było dodanie (cyfrowego) filtra ekspotencjalnego + wyzwalacza do sygnału wejściowego.
Chociaż poprawiło to znacznie sytuację, nadal nie było zbyt dobre. Potem zacząłem czytać standardowe książki o cyfrowym przetwarzaniu sygnału, a zwłaszcza oryginalne prace Claude'a Elwooda Shannona. Mój wniosek był taki, że właściwym podejściem byłoby nie "dekodowanie" sygnału w ogóle, ponieważ jest on (z wyjątkiem sekund przestępnych) całkowicie znany a priori. Zamiast tego lepiej byłoby dopasować odebrane dane do sygnału zsyntetyzowanego lokalnie i po prostu określić odpowiednią fazę. To z kolei zmniejszyłoby efektywną szerokość pasma o kilka rzędów wielkości, a tym samym znacznie zmniejszyło hałas.
Wykrywanie faz oznacza konieczność szybkiego splotu. Standardowym podejściem do efektywnego splatania jest oczywiście szybka transformata Fouriera. Jednak implementuję Arduino/Atmega 328. W ten sposób mam tylko 2k RAM. Zamiast więc prostego podejścia z FFT, zacząłem układać dopasowane filtry z pętlą fazową. I udokumentować różne etapy projektu tutaj:
- First try: exponential filter
- Start of the better apprach: phase lock to the signal/seconds ticks
- Phase lock to the minutes
- Decoding minute and hour data
- Decoding the whole signal
- Adding a local clock to deal with signal loss
- Using local synthesized signal for faster lock reacquisition after signal loss
Przeszukałem internet dość szeroko i nie znalazłem podobnego podejścia. Wciąż zastanawiam się, czy istnieją podobne (i być może lepsze) implementacje. Lub jeśli istnieją badania nad tego rodzaju rekonstrukcją sygnału.
Czego nie szukam: zaprojektowanie zoptymalizowanych kodów zbliżających się do limitu Shannon. Nie szukam również informacji o nałożonym kodzie PRNG na DCF77. Nie potrzebuję też podpowiedzi dotyczących "dopasowanych filtrów", ponieważ moja obecna implementacja jest przybliżeniem dopasowanego filtra. Konkretne wskazówki dotyczące dekoderów Viterbiego i kratownic nie są tym, czego szukam - o ile nie rozwiązują problemu ograniczeń procesora i pamięci RAM.
Czego szukam: czy są jakieś opisy/implementacje innych nietrywialnych algorytmów do dekodowania sygnałów takich jak DCF77, z ograniczonym procesorem i pamięcią RAM w obecności znacznego szumu? Może w niektórych książkach lub gazetach z epoki przed Internetem?
To nie jest moja dziedzina wiedzy, ale czy rozważasz zastąpienie filtra dolnoprzepustowego i wyzwalacza algorytmem Viterbiego (http://en.wikipedia.org/wiki/Viterbi_algorithm) w dwustanowym Łańcuch Markowa? –
Wydaje mi się, że jest to najbardziej skomplikowany zegar, jaki kiedykolwiek widziałem, ale bardzo go lubię. To musiał być zabawny projekt. Czytać wszystkie wpisy w blogu, gdy mam więcej czasu. Rodzaj splotu z przewidywanym kształtem fali wydaje się bliski optymalnemu rozwiązaniu. Czy czytałeś o [Filtrowaniu Kalmana] (http://en.wikipedia.org/wiki/Kalman_filter)? Ma to pewne podobieństwo do tego, co zrobiłeś, chodzi o symulację systemu, który obserwujesz, a następnie porównanie symulowanych pomiarów z rzeczywistymi pomiarami, aby zaktualizować stan swojego modelu na podstawie różnicy. –
W odniesieniu do algorytmu Viterbiego i filtrowania Kamlmana masz rację. Są to możliwe drogi dochodzenia. Jednak nie próbowałem ich z powodu ograniczonej pamięci i ograniczeń procesora. Jeśli ktoś próbował tego na tak słabym procesorze, byłbym chętny do zapoznania się z implementacjami. W odniesieniu do nadmiernej inżynierii: w tym jest pewna dziwna satysfakcja. "Wszystko, co warto robić, jest warte przesady;)" Metoda splotu z w pełni znanym sygnałem nazywana jest również "filtrem optymalnym". Jedynym problemem jest to, że ze względu na ograniczenia pamięci mogę je tylko przybliżać. –