DCF77 解码器与噪声信号

2024-02-20

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

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

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

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

  • 第一次尝试:指数过滤器 http://blog.blinkenlight.net/experiments/dcf77/binary-clock/
  • 更好方法的开始:信号锁相/秒滴答 http://blog.blinkenlight.net/experiments/dcf77/phase-detection/
  • 锁相至分钟 http://blog.blinkenlight.net/experiments/dcf77/second-decoder/
  • 解码分钟和小时数据 http://blog.blinkenlight.net/experiments/dcf77/decoding-time-data//
  • 解码整个信号 http://blog.blinkenlight.net/experiments/dcf77/decoding-everything/
  • 添加本地时钟来处理信号丢失 http://blog.blinkenlight.net/experiments/dcf77/local-clock/
  • 使用本地合成信号在信号丢失后更快地重新获取锁定 http://blog.blinkenlight.net/experiments/dcf77/the-clock/

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

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

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


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

http://en.wikipedia.org/wiki/Matched_filter 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;
);

正如您所看到的,从资源角度来看,这是相对微不足道的。如果您需要特定的波形,您可以将它们级联在一起以提供更长的相关性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DCF77 解码器与噪声信号 的相关文章

  • 所有可能的骑士在普罗梅拉的棋盘上移动

    是否有可能用马从初始位置 I J 绕过大小为 N N 的棋盘 并且只访问每个方格一次 define A True A I J false active proctype method bit I 4 bit J 3 bit K 1 bit
  • 将整数列表划分为总和相等的 K 个子列表

    类似的问题还有1 https stackoverflow com questions 27322804 partition of a set into k disjoint subsets with equal sum and 2 http
  • 寻找下一个素数的最佳方法(Java)

    我被要求编写一个程序以最佳方式找到下一个素数 我编写了这段代码 但找不到最佳答案 有什么建议么 public static int nextPrime int input input now find if the number is pr
  • 为什么《破解编码面试》这个例子的时间复杂度是O(k c^k)?

    该问题来自 破解编码面试 第 6 版 问题 V1 11 以下代码打印长度为 k 的所有字符串 其中字符 是按排序顺序排列的 它通过生成所有长度的字符串来做到这一点 k 然后检查每个是否已排序 什么是运行时间 package QVI 11 P
  • 用于计算三角函数、对数或类似函数的算法。仅限加减法

    我正在修复 Ascota 170 古董机械可编程计算机 它已经开始工作了 现在我正在寻找一种算法来展示其功能 例如计算三角或对数表 或类似的东西 不幸的是 从数学运算来看 计算机只能进行整数的加减法 从 1E12到1E12的55个寄存器 甚
  • 计算具有 3 个循环的算法的复杂度

    我尝试解决以下练习 以下代码片段最坏情况运行时间的增长顺序是什么 作为 N 的函数 int sum 0 for int i 1 i lt N i for int j 1 j lt i i j for int k 1 k lt j j k s
  • 运行时间为 O(n) 且就地排序的排序算法

    有没有运行时间为O n 并且还分类到位 在某些情况下 最好的情况是 O n 但这可能是因为项目集合已经排序 你正在看 O nlogn 一些较好的平均值 话虽如此 排序算法的 Wiki 还是相当不错的 有一个表格比较了流行的算法 说明了它们的
  • 如何检查无向图是否有奇数环

    我试图找到一个 O V E 时间算法来检查是否已连接 无向图有或没有奇数环 我正在考虑对图进行广度优先搜索 并尝试将顶点标记为黑色和白色 以便没有两个标记为相同颜色的顶点相邻 是否有任何已知的更简洁的算法可以在线性时间内解决这个问题 你的方
  • 当平方和为N时,如何找到四个变量的所有可能值?

    A 2 B 2 C 2 D 2 N给定一个整数N 打印出整数值的所有可能组合ABCD求解方程 我猜我们可以比暴力做得更好 天真的暴力会是这样的 n 3200724 lim sqrt n 1 for a 0 a lt lim a for b
  • Arduino 引导加载程序

    有人可以解释一下如何Arduino引导加载程序 http code google com p arduino source browse tags 0019 hardware arduino bootloaders atmega ATmeg
  • 在 3d 网格中转发(绘制)线

    我需要类似 Bresenham 算法的东西 但是 对于 3d 网格空间来说不完全是这样 我需要 3d 单元网格 边缘尺寸 1 0 从 S 点开始 前进到 K 点 接触 该线接触的所有单元格 即使只有边缘 点被触摸我需要触摸所有 8 个单元
  • 关于Marching Cubes算法的澄清

    关于Marching Cubes 我对其算法和实现有一些疑问 我已经阅读了 Marching Cubes 的 Paul Bourke 优秀文章以及网站上可用的源代码 但是 我在理解以及如何以自己的方式实现算法方面仍然遇到了一些问题 问题如下
  • 检查有效的 IMEI

    有人知道如何检查有效的 IMEI 吗 我找到了一个可以检查此页面的功能 http www dotnetfunda com articles article597 imeivalidator in vbnet aspx http www do
  • 定点数学比浮点运算快吗?

    多年前 即 20 世纪 90 年代初期 我构建了图形软件包 该软件包基于定点算术和预先计算的 cos sin 表格以及使用牛顿近似方法进行 sqrt 和对数近似的缩放方程来优化计算 这些先进技术似乎已经成为图形和内置数学处理器的一部分 大约
  • 如何为多边形创建内部螺旋?

    对于任何形状 我如何在其内部创建类似形状的螺旋 这与边界 使用 Minkowski 和 类似 尽管它会是相同形状的螺旋 而不是在形状内部创建相同的形状 我找到了这个 http www cis upenn edu cis110 13su le
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现
  • heapq.nlargest 的时间复杂度是多少?

    我在看演讲者说 获得t列表中最大的元素n元素可以在O t n 这怎么可能 我的理解是创建堆将是O n 但是复杂度是多少nlargest本身就是O n t or O t 实际的算法是什么 在这种情况下 说话者是错误的 实际成本是O n log
  • Java 2d 游戏中的路径查找?

    本质上它是我正在开发的一款吃豆人克隆游戏 我有一个 Enemy 类 并创建了该类的 4 个实例 它们都代表游戏的 4 个幽灵 所有幽灵都会在屏幕的随机区域启动 然后它们必须朝着吃豆人角色前进 当玩家控制吃豆人并移动它时 他们应该跟随它并尽可
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是

随机推荐

  • 在 C++11 上下文中使用 std::Optional

    我正在编写一个小型 C 11 库 我相信其中std optional在某些可以返回的函数中将是一个很好的补充nullptr 然而 std optional是 C 17 的一项功能 由于 C 11 是一项要求 我正在寻找使用方法std opt
  • 获取数据后reactjs useEffect清理功能

    我已经阅读了一些使用 useEffect 的 Reactjs 良好实践 我遇到一种情况 我将函数分开来获取数据并在 useEffect 挂钩上调用它 在这种情况下我怎样才能做一些清理功能呢 我见过一些像这样的 useEffect 清理 us
  • Google Data Studio 中社区连接器配置的多个选项

    无论如何 在配置过程中是否可以根据第一个分组中的内容生成一个列表 例如 我知道 Google Analytics 连接器有 帐户 gt 属性 gt 视图 您必须在设置之前选择它 我想创建一个连接器 如果您输入一个网址 它会拉入 json 文
  • PHP 接受所有组合

    我看到了这个算法将采用数字或单词并找到所有可能的组合 https stackoverflow com questions 1256117 algorithm that will take numbers or words and find
  • 如何使用OpenCV在Android中调整图像亮度?

    我创建了一个在 Android 中调整亮度的示例图像 我使用Bitmap来调整亮度 但是运行时间很长 相反 我想使用 OpenCV 在 Android 中设置图像亮度 这是我的示例代码 但它只改变图像的颜色 Bitmap bmp Bitma
  • 如何在reactJS中的嵌套状态对象中使用reduce函数?

    我的状态值为 this state content text tag1 line data1 tag2 line data2 我怎样才能使用JavaScriptreduce 函数来改变值line两者的tag1 and tag2 to cha
  • 安装节点版本高于当前系统节点版本的 NPM 包时,如何抛出“包中发现较低节点版本”错误?

    如果该模块支持的节点版本低于 高于系统 服务器节点版本 我想在安装 NPM 包时抛出错误 我的用例是 我不想安装任何支持 8 及以下版本的 npm 模块 任何帮助表示赞赏 尽管文档相反 但此功能显然不起作用 无论如何我都无法让它触发 如果您
  • 如何在 Excel VSTO 插件中将 WPF 窗口居中

    问题是 WPF 窗口仅采用 system form window 因此我无法将 Excel 设置为 VSTO 应用程序中的所有者对象 因为 VSTO 插件仅公开 Excel 的 hwnd 或其活动窗口作为本机窗口 因为它是COM 这意味着当
  • CLR 如何定位 pdb 符号文件

    我想知道 CLR 如何定位 pdb 符号文件 以及是否可以覆盖此行为 我上网查看 MSDN 和其他资源 但找不到好的答案 在我的应用程序中 我将 DLL 放置在主 EXE 路径的几个子目录中 我想要一个 Symbols 目录 其中包含我的应
  • 在 R 中具有负值的 3d 黄土平滑上设置上限 0

    我有一个有点奇怪的问题 但希望有人能帮助我 我正在尝试创建湖底的表面图 然后添加一些显示植物频率的点 以便直观地了解整个湖中水生植物的分布情况 现在 我正在分别使用 R 中的 scatterplot3d 和lattice 包在 scatte
  • SceneKit - 向场景添加新的 SCNNode 会导致严重的滞后

    我发现向场景中添加 SCNNode 使用 SCNGeometry 会导致严重的滞后峰值 根据时间分析器 它必须生成几何图形 至少函数 方法是这样调用的 它是在节点添加到场景时执行的 而不是在创建节点时执行的 因此 使用 SCNNode 创建
  • 保存下载但不带文件引用

    无论如何 是否可以使用 URLLoader 下载文件 然后将其保存到磁盘而不使用文件引用或任何使用对话框的内容 这是我拥有但不起作用的 public function onDownloadComplete e Event void Down
  • Golang 中 logrus 的 CustomFormatter 显示文件名和行号

    我在用github com sirupsen logrus用于登录我的 golang 脚本 但是我想获取记录消息的文件名和行号 我可以使用下面的代码得到它 package main import fmt os runtime strings
  • Monodevelop 2.8、XCode 3.2.6、界面生成器:出口和操作

    编辑 由于我还没有安装 XCode 4 我想知道 MD 2 8 是否与 XCode 3 2 6 完全兼容 特别是 我是否能够将插座和操作与中描述的新过程连接起来机器翻译文档 http docs xamarin com ios tutoria
  • 如何在 swift 3+ 中调整键盘的滚动视图

    如何调整滚动视图以垂直补偿键盘 继续阅读 是的 我知道这是一些基本信息 但今天我随机注意到 我看到的关于这个主题的所有答案都充满了信息 版本和 或到处使用刘海 但对于 Swift 来说没有什么可靠的3 斯威夫特 4 2 代替滚动视图对于 U
  • Android ExpandableListView:单击时设置所选项目的背景颜色

    当用户单击我的子项目时 我试图为项目设置背景颜色expandableListView 这是代码 expListView setOnChildClickListener new OnChildClickListener Override pu
  • 在 FluentValidation 中覆盖默认 ASP.NET MVC 消息

    我收到验证消息 值 xxx 对于 yyy 无效 当我为双精度类型发布错误的值时 就会发生这种情况 我不知道如何改变它 不幸的是 FluentValidation 无法覆盖这一点 MVC 验证的可扩展性模型在许多地方都受到一定限制 而且我无法
  • iOS - 通过渲染从 UIView 生成 PDF 会降低质量

    我使用以下方法从 UIView 生成 PDF 它们都创建了 PDF 但质量下降了 方法一 implementation UIView PDFWritingAdditions void renderInPDFFile NSString pat
  • 如何在validationif装饰器nestjs类验证器中使用else条件?

    我需要有条件地验证在 Nestjs 类验证器中提交的输入 有一个 validateif 装饰器 但如何在 else 部分添加另一个验证 例如 如果第一个输入是电子邮件 则使用电子邮件装饰器 如果它是电话 则与我的正则表达式匹配 IsNotE
  • DCF77 解码器与噪声信号

    我几乎完成了我的开源 DCF77 解码器项目 当我注意到标准 Arduino DCF77 库在噪声信号上表现非常差时 这一切就开始了 特别是当天线靠近计算机或洗衣机正在运行时 我永远无法从解码器中获取时间 我的第一个方法是向输入信号添加 数