在没有任何用户交互的情况下,程序如何识别来自 ADC 的记录中存在什么类型的波形?
为了这个问题:恒定频率的三角波、方波、正弦波、半正弦波或锯齿波。电平和频率是任意的,它们会有噪音、少量失真和其他缺陷。
我也会提出一些(天真的)想法,你可以投票赞成或反对。
在没有任何用户交互的情况下,程序如何识别来自 ADC 的记录中存在什么类型的波形?
为了这个问题:恒定频率的三角波、方波、正弦波、半正弦波或锯齿波。电平和频率是任意的,它们会有噪音、少量失真和其他缺陷。
我也会提出一些(天真的)想法,你可以投票赞成或反对。
您肯定想从采用自相关来找到基本面开始。
这样,取波形的一个周期(大约)。
现在对该信号进行 DFT,并立即补偿第一个 bin 的相移(第一个 bin 是基频,如果所有相位都是相对的,您的任务会更简单)。现在对所有的 bin 进行归一化,使基波具有单位增益。
现在将其余的 bin(表示谐波)与您有兴趣测试的一组预先存储的波形进行比较和对比。接受最接近的,如果它不能满足由本底噪声测量确定的某个准确度阈值,则整体拒绝。
进行 FFT,找到奇数和偶数谐波峰值,并将它们降低的速率与常见波形库..峰值...比率进行比较。
执行自相关以找到基频,测量 RMS 电平,找到第一个过零,然后尝试减去该频率、相位和电平的常见波形。哪个取消了最好的(并且超过了某个阈值)获胜。
这个答案假定没有噪音,这是一个简单的学术练习。
在时域中,逐个采样波形的差异。直方图结果。如果分布在零处有一个明确定义的峰值(众数),则它是一个方波。如果分布在正值处有一个明确定义的峰值,则它是锯齿形。如果分布有两个明确定义的峰,一个负一个正,它是一个三角形。如果分布很宽并且在任一侧达到峰值,则它是正弦波。
用更多信息武装自己...
我假设您已经知道理论上完美的正弦波没有谐波部分(即只有基波)......但是由于您正在通过 ADC,您可以将理论上完美的正弦波的想法抛到窗外...... .您必须与混叠作斗争并确定什么是“真实”局部以及什么是伪影......祝你好运。
以下信息来自这个关于 csound 的链接。
(*) 锯齿波包含(理论上)无限数量的谐波部分,每个部分都与部分数的倒数成比例。因此,基波(1)的幅度为1,第二部分为1/2,第三部分为1/3,第n为1/n。
(**) 方波包含(理论上)无限数量的谐波部分,但只有奇数谐波(1,3,5,7,...) 幅度是部分数的倒数的比率,就像锯齿波一样。因此,基波(1)的幅度为1,第三部分为1/3,第五部分为1/5,和第n部分为1/n。
我认为到目前为止所有这些答案都非常糟糕(包括我自己以前的......)在仔细考虑了这个问题之后,我会提出以下建议:
1)对输入信号进行1秒的采样(不需要那么大,但它简化了一些事情)
2) 在整个秒内,计算过零次数。此时你有cps(每秒周期数)并且知道振荡器的频率。(如果这是你想知道的)
3) 现在取一小部分样本进行处理:精确取 7 个过零值。(因此,如果可视化,您的工作缓冲区现在应该看起来像您在原始问题中发布的图形表示之一。)使用这个小的工作缓冲区来执行以下测试。(此时标准化工作缓冲区可以让生活更轻松)
4)测试方波:方波的零交叉总是非常大的差异,寻找一个大的信号增量,然后几乎没有移动,直到下一个零交叉。
5) 锯齿波测试:类似于方波,但一个大的信号增量将跟随一个线性常数信号增量。
6) 三角波测试:线性常数(小)信号增量。找到峰值,除以它们之间的距离并计算三角波应该是什么样子(理想情况下)现在测试实际信号的偏差。设置偏差容差阈值,您可以确定您查看的是三角形还是正弦(或抛物线)。
首先找到基频和相位。你可以用 FFT 做到这一点。规范化样本。然后用您要测试的波形样本(相同频率和相同相位)减去每个样本。将结果平方加起来,然后除以样本数。最小的数字是您寻找的波形。