algorithm - DCF77 解码器与噪声信号

标签 algorithm language-agnostic arduino signal-processing

我几乎完成了我的开源 DCF77 解码器项目。当我注意到标准 (Arduino) DCF77 库在嘈杂信号上的表现非常差时,一切就开始了。特别是当天线靠近计算机或洗衣机运行时,我永远无法从解码器中获取时间。

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

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

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

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

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

我在寻找什么:是否有任何其他非平凡算法的描述/实现,用于在存在显着噪声的情况下使用 有限的 CPU 和 RAM 解码 DCF77 等信号?也许在前互联网时代的一些书籍或论文中?

最佳答案

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

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

如您所见,就资源而言,这是相对微不足道的。如果您需要特定的波形,您可以将它们级联在一起以提供更长的相关性。

关于algorithm - DCF77 解码器与噪声信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18029614/

相关文章:

java - 卡住了从 Arduino 以字节为单位获取图像,并使用 Java 将它们恢复为图像

algorithm - COBOL 冒泡排序仅对表的最后一个元素进行排序

algorithm - 通过插入一个括号最大化表达式的计算

math - float 学有问题吗?

language-agnostic - 数学概念如何帮助我进行 Web 开发?

c++ - 如何在没有运行时开销的情况下轻松配置类?

java - 使用红黑树的字典 - 删除错误

c++ - 需要算法方面的建议

java - 将表示数学表达式的树转换为没有多余括号的字符串

arduino - 有没有适用于 IPv6 的 arduino 以太网扩展板或库?