2013-08-03 15 views
18

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:

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?

+0

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? –

+0

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. –

+0

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ć. –

Odpowiedz

1

Odniesienie do dopasowanych filtrów przez Ollie B. nie jest tym, o co prosiłem. Już to omówiłem na blogu.

Jednak do tej pory otrzymałem bardzo dobrą wskazówkę od prywatnej poczty. Istnieje artykuł autorstwa Daniela Engelera: "Performance Analysis and Receiver Architectures of DCF77 Radio-Controlled Clocks". Tego rodzaju rzeczy szukam.

W przypadku dalszych wyszukiwań zaczynając od artykułu Engeler, znalazłem następujące niemieckie patenty: DE3733966A1 - Anordnung zum Empfang stark gestoerter Signale des Senders dcf-77 i DE4219417C2 - Schmalbandempfänger für Datensignale.

2

Czy rozważałeś użycie filtra dopasowanego do wiórów, aby wykonać splot?

http://en.wikipedia.org/wiki/Matched_filter

są prawie trywialny łatwe do wykonania, a każdy układ/nieco okres ten może być realizowany jako linię opóźniającą dodatku odejmuje (użyć kołowy bufor)

prosta o prostokątnym (będzie również działać, ale mniej optymalne z innymi przebiegami) o nieznanej sekwencji (ale znanej częstotliwości) może być realizowane tak:

// Filter class 
template <int samples_per_bit> 
class matchedFilter(
    public: 
     // constructor 
     matchedFilter() : acc(0) {}; 

     // destructor 
     ~matchedFilter() {}; 

     int filterInput(int next_sample){ 
     int temp; 
     temp = sample_buffer.insert(nextSample); 
     temp -= next_sample; 
     temp -= result_buffer.insert(temp); 
     return temp; 
     }; 

    private: 
    int acc; 
    CircularBuffer<samples_per_bit> sample_buffer; 
    CircularBuffer<samples_per_bit> result_buffer; 
); 

// Circular buffer 
template <int length> 
class CircularBuffer(
    public: 
     // constructor 
     CircularBuffer() : element(0) { 
     buffer.fill(0); 
     }; 
     // destructor 
     ~CircularBuffer(){}; 

     int insert(int new_element){ 
     int temp; 
     temp = array[element_pos]; 
     array[element_pos] = new_element; 
     element_pos += 1; 
     if (element_pos == length){ 
      element_pos = 0; 
     }; 
     return temp; 
     } 

    private: 
     std::array<int, length> buffer; 
     int element_pos; 
); 

jak widać, zasobów mądry, to jest stosunkowo błahe. Jest pewien konkretny kształt fali, po którym można kumulować, aby dać dłuższą korelację.

+0

Już wdrażam rekursywny stos dopasowanych filtrów. Jestem świadomy tego podejścia. Jednak sugerowane podejście bezpośrednie do przodu zawodzi w przypadku ograniczonych ograniczeń pamięci. Przy 2k Twoje podejście umożliwiłoby próbkowanie przez co najwyżej 1000, co byłoby gorsze niż to, co obecnie mogę zrobić. –

+0

Interesuje mnie, w jaki sposób zbudujesz dopasowany filtr do pracy na ponad 1000 bez przechowywania danych o wartości 1000. Również twój SNR musi być okropny, jeśli potrzebujesz 1000. To zysk 40dB, prawda? – OllieB

+0

Cały punkt eksperymentu polegał na przesunięciu SNR tak daleko, jak to możliwe. Po szczegóły przeczytaj mój blog. Udokumentowałem wszystko. Kluczowe jest to, że początek danych jest zawsze na początku drugiego. Mogę dopasować to, a następnie rekursywnie resztę. Powiedziałbym jednak, że 1000 to cyfrowy zysk 30 dB zamiast 40. –