分类和过滤来自过零的噪声

信息处理 离散信号 噪音 平滑
2022-01-27 17:27:53

注意:我对零交叉和信号处理一无所知。但是,我正在做需要它们的编程练习。我四处搜索,但我无法理解我得到的大部分信息。希望我在这里得到澄清。如果离题,请随意关闭。

这是计算机科学书籍中的两个练习(计算机程序的结构和解释 - 第 3.5.3 节利用流范式)。我只会包括相关的细节。

练习 3.74:Alyssa P. Hacker 正在设计一个系统来处理来自物理传感器的信号。她希望产生的一个重要特征是描述输入信号过零的信号。也就是说,每当输入信号从负变为正时,结果信号应为 1,每当输入信号从正变为负时,结果信号应为 -1,否则为 0。(假设 0 输入的符号为正。)例如,具有相关过零信号的典型输入信号将是

… 1 2 1.5 1 0.5 -0.1 -2 -3 -2 -0.5 0.2 3 4 …
… 0 0 0 0 0 -1 0 0 0 0 1 0 0 …

...

相关的第二个练习是:

练习 3.75。不幸的是,Alyssa 在练习 3.74 中的过零检测器被证明是不够的,因为来自传感器的噪声信号会导致虚假过零。硬件专家 Lem E. Tweakit 建议 Alyssa 在提取过零之前对信号进行平滑处理以滤除噪声。Alyssa 接受了他的建议,并决定从通过将感测数据的每个值与前一个值进行平均而构建的信号中提取过零。她向她的助手 Louis Reasoner 解释了这个问题,Louis Reasoner 试图实施这个想法,将 Alyssa 的程序修改如下:

(define (make-zero-crossings input-stream last-value)
   (let ((avpt (/ (+ (stream-car input-stream) last-value) 2)))
     (cons-stream (sign-change-detector avpt last-value)
        (make-zero-crossings (stream-cdr input-stream)
                               avpt))))

这并没有正确执行 Alyssa 的计划。找到 Louis 安装的 bug 并在不改变程序结构的情况下修复它。(提示:您需要增加参数的数量以实现零交叉。)

注意:sense-data 是输入信号

我的问题是:

  • 练习 3.75 指的是什么?是大量的 0 吗?
  • 假设我们从“... 0 0 0 0 0 -1 0 0 0 0 1 0 0 ...”中的信号中滤除噪声,得到的滤波信号应该是“... 0 -1 0 1 0 ...”还是“... -1 1……”?
  • 在这个练习中,平滑是通过将输入信号的每个值与前一个值平均来完成的,对于我的生活,我不明白应该做什么以及为什么要这样做?
1个回答

在不知道上下文的情况下,这可能是什么意思:

3.75 指的是更真实的传感器。3.74 中描述的传感器显然被认为是完美的,即只要有负/正传感器数据,真实信号确实具有相关属性。然而,理想的传感器并不存在,3.75 告诉您,您的传感器确实存在缺陷,会导致虚假的错误符号更改。应假定传感器随机产生额外的过零,可能如下所示:

Instead of: 1 0  1 2 3  1 -5 -2 -2 -1 5 3 
You get:    1 3 -2 3 2 -2 -4  3 -2 -1 2 3 

您的示例数据表明,正/负周期通常比一次测量要长。您应该稍微“硬化”您的过滤器以仍然提供有效的过零。这个过滤器永远不会完美,但它应该比您可能为 3.74 实现的朴素过滤器更好。

之间交替,则输出相应的 1 或 -1。可以通过回顾个点来实现强化过滤器,其中个点都具有相同的符号,则吐出 1 或 -1 。但是,这会在您的过滤器中引入延迟,并且会错过比点短的零交叉点。因此,关键是要知道两个过零之间的最短持续时间并选择,并且知道延迟是否可以接受是很重要的。n1nnkk=1,2,3,...kkk

不,噪声不是指信号中的零点;)