代码之家  ›  专栏  ›  技术社区  ›  endolith

识别常见的周期波形(平方、正弦、锯齿等)

  •  7
  • endolith  · 技术社区  · 15 年前

    在没有任何用户交互的情况下,程序如何识别ADC记录中存在的波形类型?

    为了这个问题:三角形波,正方形波,正弦波,半正弦波,或等频率锯齿波。电平和频率是任意的,它们会有噪声、少量失真和其他缺陷。

    Various waveforms

    我也会提出一些(天真的)想法,你可以投赞成票或反对票。

    7 回复  |  直到 10 年前
        1
  •  7
  •   Dave Gamble    15 年前

    你肯定想从一个自相关开始找出基本的。

    然后,取波形的一个周期(大约)。

    现在,对该信号进行DFT,并立即补偿第一个仓位的相移(第一个仓位是基本的,如果所有的相都是相对的,那么您的任务将更简单)。 现在将所有的容器归一化,这样基本面就有了统一增益。

    现在,将其余的存储桶(表示谐波)与一组您感兴趣测试的预先存储的波形进行比较和对比。接受最近的,如果不满足通过噪声地板测量确定的精度阈值,则拒绝整体。

        2
  •  4
  •   endolith    15 年前

    做一个快速傅立叶变换,找出奇次和偶次谐波峰值,并将其降低的速率与一个公共波形库进行比较。峰。。。比率。

        3
  •  3
  •   endolith    15 年前

    执行自相关以查找基频,测量rms电平,找到第一个过零,然后尝试减去该频率、相位和电平下的常见波形。无论哪一个取消了最好的(并且超过了某个阈值),都会赢。

        4
  •  2
  •   Joh    15 年前

    这个答案假定没有噪音,这是一个简单的学术练习。

    在时间域中,对波形的采样差进行采样。对结果进行柱状图。如果分布在零处有一个清晰定义的峰值(模式),则它是一个方波。如果分布在正值处有一个清晰定义的峰值,则它是锯齿形的。如果分布有两个清晰定义的峰,一个负峰和一个正峰,则它是三角形。如果分布很宽,并且在两边都达到峰值,那么它就是一个正弦波。

        5
  •  0
  •   kent    15 年前

    用更多信息武装自己…

    我假设你已经知道理论上完美的正弦波没有谐波分量(即只有基波)。但是,既然你正在经历一个ADC,你可以把理论上完美的正弦波的想法抛到窗外…你必须与混叠做斗争,确定什么是“真实的”部分,什么是工件……祝你好运。

    以下信息来自 this link about csound.

    (*)锯齿波包含(理论上)无限多个谐波分量,每个谐波分量的比例为偏数的倒数。因此,基本(1)的振幅为1,第二部分为1/2,第三部分为1/3,第n部分为1/n。

    (**)方波(理论上)包含无限多的谐波分量,但只有奇数谐波(1,3,5,7,…)振幅与部分数的倒数之比,就像锯齿波一样。因此,基本(1)的振幅为1,第三部分为1/3,第五部分为1/5,第n部分为1/n。

        6
  •  0
  •   kent    15 年前

    我认为到目前为止所有这些答案都很糟糕(包括我自己以前的…) 在多考虑了一点问题之后,我建议如下:

    1)对输入信号进行1秒采样(不需要太大,但可以简化一些事情)

    2)在整秒钟内,计算零交叉点。在这一点上,你有CPS(每秒周期数)并且知道振荡器的频率。(如果你想知道的话)

    3)现在取一个较小的样本段来处理:精确地取7个零交叉值。(因此,如果可视化的话,您的工作缓冲区现在应该看起来像是用原始问题发布的图形表示形式之一。)使用这个小的工作缓冲区来执行以下测试。(此时规范化工作缓冲区可以使生活更轻松)

    4)方波测试:方波的过零点总是非常大的差异,在下一个过零点之前,寻找一个大的信号增量,然后再小到无移动。

    5)声表面波测试:类似于方波,但大信号增量后面是线性恒定信号增量。

    6)三角波测试:线性常数(小)信号增量。找到峰值,除以它们之间的距离,然后计算三角形波应该是什么样子(理想情况下),现在测试实际信号的偏差。设置偏差容限阈值,您可以确定查看的是三角形还是正弦(或抛物线)。

        7
  •  0
  •   Tymenyel    10 年前

    首先找出基频和相位。你可以用快速傅立叶变换来实现。标准化样本。然后用要测试的波形样本(相同频率和相同相位)减去每个样本。将结果平方加起来,除以样本数。最小的数字就是你寻找的波形。