DCF77解码器与噪声信号

时间:2013-08-03 05:27:06

标签: algorithm language-agnostic arduino signal-processing dcf77

我差不多完成了我的开源DCF77解码器项目。当我注意到标准(Arduino)DCF77库在噪声信号上表现非常差时,一切都开始了。特别是当天线靠近电脑或我的洗衣机运行时,我从来没有能够从解码器中抽出时间。

我的第一种方法是在输入信号中添加(数字)指数滤波器+触发器。

虽然这显着改善了情况,但仍然不是很好。然后我开始阅读一些关于数字信号处理的标准书籍,特别是Claude Elwood Shannon的原创作品。我的结论是,正确的方法是不对信号进行“解码”,因为它是完全已知的先验(闰秒除外)。相反,将接收的数据与本地合成的信号进行匹配并确定适当的相位会更合适。这反过来会使有效带宽减少几个数量级,从而显着降低噪声。

相位检测意味着需要快速卷积。有效卷积的标准方法当然是快速傅里叶变换。但是我正在为Arduino / Atmega 328实现。因此我只有2k RAM。因此,我开始堆叠匹配的锁相环滤波器,而不是使用FFT的直接方法。我在这里记录了不同的项目阶段:

我在互联网上搜索得非常广泛,并没有找到类似的方法。我仍然想知道是否有类似(也许更好)的实现。或者是否存在对这种信号重建的研究。

我不是在寻找:设计优化的代码以接近香农极限。我也没有在DCF77上搜索有关叠加PRNG代码的信息。我也不需要关于“匹配滤波器”的提示,因为我当前的实现是匹配滤波器的近似值。关于Viterbi Decoders或Trellis方法的具体提示不是我要寻找的 - 除非它们解决了严格的CPU和RAM限制问题。

我在寻找:有没有其他非平凡算法的描述/实现,用于解码像DCF77这样的信号,在存在重大噪声的情况下,有限的CPU和RAM ?也许在互联网时代之前的一些书籍或论文中?

2 个答案:

答案 0 :(得分:2)

您是否考虑使用芯片匹配滤波器来执行卷积?

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

它们几乎很容易实现,因为每个芯片/位周期可以实现为n加减法延迟线(使用循环缓冲区)

对于未知序列(但已知频率)的方波(也将起作用,但对其他波形不太理想)的简单方法可以实现如下:

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

正如您所看到的,资源方面,这是相对微不足道的。它有一个特定的波形,您可以将它们级联在一起以提供更长的相关性。

答案 1 :(得分:2)

Ollie B.对匹配过滤器的引用并不是我要求的。我之前已在博客中介绍了这一点。

但是到现在为止,我收到了非常好的私人邮件提示。 Daniel Engeler有一篇论文"Performance Analysis and Receiver Architectures of DCF77 Radio-Controlled Clocks"。这是我正在寻找的东西。

通过从Engeler论文开始的进一步搜索,我发现了以下德国专利DE3733966A1 - Anordnung zum Empfang stark gestoerter Signale des Senders dcf-77DE4219417C2 - Schmalbandempfänger für Datensignale