Я почти завершил проект декодера DCF77 с открытым исходным кодом. Все началось, когда я заметил, что стандартные (Arduino) библиотеки DCF77 работают очень плохо на шумных сигналах. Особенно, когда антенна была близка к компьютеру или когда моя стиральная машина работала, я никогда не мог вывести время из декодеров.DCF77 декодер против шумного сигнала
Мой первый подход состоял в том, чтобы добавить (цифровой) экспоненциальный фильтр + триггер к входящему сигналу.
Хотя это значительно улучшило ситуацию, все равно это было не очень хорошо. Затем я начал читать некоторые стандартные книги по цифровой обработке сигналов и особенно оригинальные работы Клода Элвуда Шеннона. Мой вывод заключался в том, что правильным подходом было бы не «декодировать» сигнал вообще, потому что он (за исключением секунд прыжка) полностью известен априори. Вместо этого было бы более подходящим сопоставить полученные данные с локально синтезированным сигналом и просто определить правильную фазу. Это, в свою очередь, уменьшит эффективную пропускную способность на несколько порядков и тем самым значительно снизит шум.
Определение фазы подразумевает необходимость быстрой свертки. Стандартным подходом для эффективной свертки является, конечно, быстрое преобразование Фурье. Однако я реализую для Arduino/Atmega 328. Таким образом, у меня есть только 2k RAM. Поэтому вместо простого подхода с FFT я начал складывать согласованные фильтры с фазовой автоподстройкой. Я задокументированы различные стадии проекта здесь:
- 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
Я искал в Интернете довольно широко и не нашел подобного подхода. Тем не менее мне интересно, есть ли аналогичные (и, возможно, лучшие) реализации. Или, если существуют исследования по этому виду реконструкции сигнала.
Я не ищу: проектирование оптимизированных кодов для приближения к пределу Шеннона. Я также не ищу информацию о наложенном PRNG-коде DCF77. Мне также не нужны намеки на «сопоставленные фильтры», так как моя текущая реализация является приближением согласованного фильтра. Конкретные намеки на подходы Viterbi Decoders или Trellis - это не то, что я ищу, - если они не затронут проблему жестких ограничений ЦП и ОЗУ.
Что я ищу: есть ли какие-либо описания/реализации других нетривиальных алгоритмов для декодирования сигналов типа DCF77 с ограниченным ЦП и ОЗУ при наличии значительного шума? Может быть, в некоторых книгах или в газетах из интернет-эры?
Это не моя область знаний, но вы подумали о замене фильтра нижних частот и триггера на алгоритм [Витерби] (http://en.wikipedia.org/wiki/Viterbi_algorithm) на двух состояниях Марковская цепь? –
Это похоже на самые переработанные часы, которые я когда-либо видел, но мне это очень нравится. Должно быть, это был забавный проект. Приходится читать все записи в блоге, когда у меня больше времени. Вид свертки с предсказанной формой волны близок к оптимальному решению. Вы прочитали [фильтрацию Калмана] (http://en.wikipedia.org/wiki/Kalman_filter)? Это имеет некоторое сходство с тем, что вы сделали, идея грубо имитирует систему, которую вы наблюдаете, а затем сравниваете моделируемые измерения с реальными измерениями, чтобы обновить состояние вашей модели на основе разницы. –
Что касается алгоритма Витерби и фильтрации Камлмана, вы правы. Это возможные пути расследования. Однако я не пробовал их из-за жесткой памяти и ограничений процессора. Если кто-то попробовал это на таком слабом процессоре, я бы очень хотел узнать о реализации. Что касается более инженерного: в нем есть странное удовлетворение. «Все, что стоит делать, стоит переусердствовать;») Подход к свертке с полностью узнаваемым сигналом также известен как «оптимальный фильтр». Единственная проблема заключается в том, что из-за ограничений памяти я могу только аппроксимировать ее. –