18

Я почти завершил проект декодера DCF77 с открытым исходным кодом. Все началось, когда я заметил, что стандартные (Arduino) библиотеки DCF77 работают очень плохо на шумных сигналах. Особенно, когда антенна была близка к компьютеру или когда моя стиральная машина работала, я никогда не мог вывести время из декодеров.DCF77 декодер против шумного сигнала

Мой первый подход состоял в том, чтобы добавить (цифровой) экспоненциальный фильтр + триггер к входящему сигналу.

Хотя это значительно улучшило ситуацию, все равно это было не очень хорошо. Затем я начал читать некоторые стандартные книги по цифровой обработке сигналов и особенно оригинальные работы Клода Элвуда Шеннона. Мой вывод заключался в том, что правильным подходом было бы не «декодировать» сигнал вообще, потому что он (за исключением секунд прыжка) полностью известен априори. Вместо этого было бы более подходящим сопоставить полученные данные с локально синтезированным сигналом и просто определить правильную фазу. Это, в свою очередь, уменьшит эффективную пропускную способность на несколько порядков и тем самым значительно снизит шум.

Определение фазы подразумевает необходимость быстрой свертки. Стандартным подходом для эффективной свертки является, конечно, быстрое преобразование Фурье. Однако я реализую для Arduino/Atmega 328. Таким образом, у меня есть только 2k RAM. Поэтому вместо простого подхода с FFT я начал складывать согласованные фильтры с фазовой автоподстройкой. Я задокументированы различные стадии проекта здесь:

Я искал в Интернете довольно широко и не нашел подобного подхода. Тем не менее мне интересно, есть ли аналогичные (и, возможно, лучшие) реализации. Или, если существуют исследования по этому виду реконструкции сигнала.

Я не ищу: проектирование оптимизированных кодов для приближения к пределу Шеннона. Я также не ищу информацию о наложенном PRNG-коде DCF77. Мне также не нужны намеки на «сопоставленные фильтры», так как моя текущая реализация является приближением согласованного фильтра. Конкретные намеки на подходы Viterbi Decoders или Trellis - это не то, что я ищу, - если они не затронут проблему жестких ограничений ЦП и ОЗУ.

Что я ищу: есть ли какие-либо описания/реализации других нетривиальных алгоритмов для декодирования сигналов типа DCF77 с ограниченным ЦП и ОЗУ при наличии значительного шума? Может быть, в некоторых книгах или в газетах из интернет-эры?

+0

Это не моя область знаний, но вы подумали о замене фильтра нижних частот и триггера на алгоритм [Витерби] (http://en.wikipedia.org/wiki/Viterbi_algorithm) на двух состояниях Марковская цепь? –

+0

Это похоже на самые переработанные часы, которые я когда-либо видел, но мне это очень нравится. Должно быть, это был забавный проект. Приходится читать все записи в блоге, когда у меня больше времени. Вид свертки с предсказанной формой волны близок к оптимальному решению. Вы прочитали [фильтрацию Калмана] (http://en.wikipedia.org/wiki/Kalman_filter)? Это имеет некоторое сходство с тем, что вы сделали, идея грубо имитирует систему, которую вы наблюдаете, а затем сравниваете моделируемые измерения с реальными измерениями, чтобы обновить состояние вашей модели на основе разницы. –

+0

Что касается алгоритма Витерби и фильтрации Камлмана, вы правы. Это возможные пути расследования. Однако я не пробовал их из-за жесткой памяти и ограничений процессора. Если кто-то попробовал это на таком слабом процессоре, я бы очень хотел узнать о реализации. Что касается более инженерного: в нем есть странное удовлетворение. «Все, что стоит делать, стоит переусердствовать;») Подход к свертке с полностью узнаваемым сигналом также известен как «оптимальный фильтр». Единственная проблема заключается в том, что из-за ограничений памяти я могу только аппроксимировать ее. –

ответ

1

Ссылка на согласованные фильтры Олли Б. - это не то, о чем я просил. Я уже рассказывал об этом раньше в своем блоге.

Однако к настоящему времени я получил очень хороший совет по почте. Существует документ "Performance Analysis and Receiver Architectures of DCF77 Radio-Controlled Clocks" Даниэля Энгелера. Это тот материал, который я ищу.

С дальнейшими поисками, начиная с бумаги Engeler, я нашел следующие немецкие патенты DE3733966A1 - Anordnung zum Empfang stark gestoerter Signale des Senders dcf-77 и DE4219417C2 - Schmalbandempfänger für Datensignale.

2

Считаете ли вы использование фильтра с фильтром для сверления?

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

Они почти тривиальные легко осуществить, так как каждый чип/битовый период может быть реализован в виде линии задержки добавить вычитает (использовать циклический буфер)

просты для квадратной волны (также будет работать, но менее оптимальный с другими формами волны) неизвестной последовательности (но известная частоты) может быть реализовано что-то вроде этого:

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

Как вы можете видеть, ресурс мудрых, это относительно тривиальное. Это конкретная форма сигнала, после которой вы можете каскадировать их вместе, чтобы дать более длинную корреляцию.

+0

Я уже реализую рекурсивный стек согласованных фильтров. Я знаю об этом. Однако прямой подход, который вы предлагаете, не подходит для жестких ограничений памяти. С 2k ваш подход позволит пробовать не более 1000, что было бы хуже, чем я в настоящее время могу сделать. –

+0

Мне интересно, как вы построили согласованный фильтр для работы на более чем 1000 без хранения данных на 1000 центов. Кроме того, ваше SNR должно быть ужасным, если вам требуется 1000. Это прибыль в 40 дБ не так ли? – OllieB

+0

Весь смысл эксперимента заключался в том, чтобы максимально приблизить SNR. Подробности читайте в моем блоге. Я документировал все. Ключ в том, что начало данных всегда начинается в начале второго. Поэтому я могу сопоставить это, а затем рекурсивно все остальное. Однако я бы сказал, что 1000s - цифровой коэффициент усиления 30 дБ вместо 40. –