算法 – DCF77解码器与噪声信号 - 代码日志

算法 – DCF77解码器与噪声信号

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

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

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

相位检测意味着需要快速卷积。用于高效卷积的标准方法当然是快速傅里叶变换。但是我正在为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

我相当广泛地搜索了互联网,发现没有类似的方法。仍然我想知道是否有类似(或许更好)的实现。或者如果存在对这种信号重建的研究。

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

我正在寻找什么:有没有其他用于解码信号的非平凡算法的描述/实现,如DCF77,在存在显着噪声的情况下,CPU和RAM有限?也许在网络时代的一些书籍或文章?

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

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

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

http://stackoverflow.com/questions/18029614/dcf77-decoder-vs-noisy-signal

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:算法 – DCF77解码器与噪声信号