algorithm language-agnostic arduino signal-processing dcf77

algorithm - Decodificador DCF77 vs. señal ruidosa



language-agnostic arduino (2)

¿Has considerado usar un filtro de chip combinado para realizar tu convolución?

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

Son casi trivialmente fáciles de implementar, ya que cada período de chip / bit se puede implementar como una línea de retardo de suma y resta (use un búfer circular)

Uno simple para una onda cuadrada (también funcionará, pero menos óptimo con otras formas de onda) de secuencia desconocida (pero con una frecuencia conocida) se puede implementar algo como esto:

// 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; );

Como puede ver, en lo que respecta a los recursos, esto es relativamente trivial. Si busca una forma de onda específica, puede conectarlas en cascada para obtener una correlación más larga.

Casi he completado mi proyecto de decodificador DCF77 de código abierto. Todo comenzó cuando noté que las bibliotecas DCF77 estándar (Arduino) funcionan muy mal en señales ruidosas. Especialmente nunca pude sacar el tiempo de los decodificadores cuando la antena estaba cerca de la computadora o cuando mi lavadora estaba funcionando.

Mi primer enfoque fue agregar un filtro exponencial (digital) + disparador a la señal entrante.

Aunque esto mejoró significativamente la situación, todavía no era realmente bueno. Luego comencé a leer algunos libros estándar sobre procesamiento de señales digitales y, especialmente, las obras originales de Claude Elwood Shannon. Mi conclusión fue que el enfoque adecuado sería no "descodificar" la señal en absoluto porque es (a excepción de segundos de salto) completamente conocido a priori. En su lugar, sería más apropiado hacer coincidir los datos recibidos con una señal sintetizada localmente y simplemente determinar la fase adecuada. Esto, a su vez, reduciría el ancho de banda efectivo en algunos órdenes de magnitud y, por lo tanto, reduciría significativamente el ruido.

La detección de fase implica la necesidad de una rápida convolución. El enfoque estándar para una convolución eficiente es, por supuesto, la rápida transformación de Fourier. Sin embargo, estoy implementando para Arduino / Atmega 328. Por lo tanto, solo tengo 2k de RAM. Entonces, en lugar de la aproximación directa con FFT, comencé a apilar filtros de bucle de fase sincronizada. Aquí documenté las diferentes etapas del proyecto:

Busqué en Internet bastante extensamente y no encontré ningún enfoque similar. Todavía me pregunto si hay implementaciones similares (y quizás mejores). O si existen investigaciones sobre este tipo de reconstrucción de señales.

Lo que no estoy buscando: diseñar códigos optimizados para acercarse al límite de Shannon. Tampoco estoy buscando información sobre el código PRNG superpuesto en DCF77. Tampoco necesito sugerencias sobre "filtros coincidentes" ya que mi implementación actual es una aproximación de un filtro coincidente. No estoy buscando sugerencias específicas sobre los decodificadores de Viterbi o los enfoques de Trellis, a menos que aborden el problema de las restricciones estrictas de CPU y RAM.

Lo que estoy buscando: ¿hay descripciones / implementaciones de otros algoritmos no triviales para decodificar señales como DCF77, con CPU y RAM limitadas en presencia de ruido significativo? Tal vez en algunos libros o papeles de la era pre internet?


La referencia a los filtros combinados de Ollie B. no es lo que estaba pidiendo. Ya he cubierto esto antes en mi blog.

Sin embargo a estas alturas recibí una muy buena pista por correo privado. Existe un artículo "Análisis de rendimiento y arquitecturas de receptor de relojes controlados por radio DCF77" de Daniel Engeler. Este es el tipo de cosas que estoy buscando.

Con más búsquedas a partir del artículo de Engeler, encontré las siguientes patentes alemanas DE3733966A1 - Anordnung zum Empfang stark gestoerter Signale des Senders dcf-77 y DE4219417C2 - Schmalbandempfänger für Datensignale .