注意:我对零交叉和信号处理一无所知。但是,我正在做需要它们的编程练习。我四处搜索,但我无法理解我得到的大部分信息。希望我在这里得到澄清。如果离题,请随意关闭。
这是计算机科学书籍中的两个练习(计算机程序的结构和解释 - 第 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……”?
- 在这个练习中,平滑是通过将输入信号的每个值与前一个值平均来完成的,对于我的生活,我不明白应该做什么以及为什么要这样做?