【问题标题】:Determining if a dataset approximates a sine wave确定数据集是否近似正弦波
【发布时间】:2010-11-02 19:30:04
【问题描述】:

是否有一种算法可用于确定以固定时间间隔采集的数据样本是否近似于正弦波?

【问题讨论】:

  • 我相当肯定,给定 any finite 组数据(具有不同的 X 值),您可以找到完全适合的正弦波,如果您不对频率施加某种限制(随着频率的增加,正弦波会接近空间填充曲线)。
  • 那是连续傅里叶变换的定义。在实践中,您只能采用离散傅里叶变换,并且您将被限制在有限的频率范围内(因为傅里叶积分的扩展在连续情况下会持续到无穷大)。大多数“弯曲”函数可以使用傅里叶变换很好地拟合,但“矩形”函数的边缘总是会出现失真,即使扩展持续很长时间也是如此。 (垂直线类似于狄拉克三角洲,所有频率都为 1)。
  • 最好的方法取决于您期望数据如何偏离正弦曲线。随机噪音?波形失真(例如三角形或削峰)?几个正弦的总和与一个纯正弦?
  • 这不一定与进行傅里叶变换相同。它也不仅仅是曲线拟合。它是正弦与非正弦的分类器。对此没有足够的约束。我们关心相位吗?我们关心幅度方向的噪声吗?我们关心幅度或频率漂移吗?我们是否关心增量(微分就像余弦一样)?它只是一类分类器还是我们必须确定的其他类别的非正弦波?这是一个迟到的评论,但需要说明的是,FFT 不一定是解决方案。

标签: algorithm math waveform


【解决方案1】:

采用将数据转换为频率表的傅立叶变换(搜索 fft,快速傅立叶变换,以获得实现。例如,FFTW)。如果是正弦或余弦,频率表将包含一个非常高的值,对应于您正在搜索的频率以及其他频率的一些噪声。

或者,在多个频率上匹配多个窦性信号,并尝试使用互相关来匹配它们:您的信号与您尝试拟合的窦性信号之间差异的平方和。当然,您需要在一定频率范围内为 sinussen 执行此操作。您需要在沿 x 轴平移窦房时执行此操作以找到相位。

【讨论】:

  • 复数似乎也是 sinus... 这就是不使用母语打字时的问题。然后是西奈 :) ?
  • 对质量的良好估计是非常高的峰的高度除以其他峰的高度之和。使用此度量,1 表示完全适合,0 表示完全不适合。
  • Martijn,即所谓的 THD (en.wikipedia.org/wiki/Total_harmonic_distortion) 或 THD+N,具体取决于您包含的内容。
【解决方案2】:

您可以计算傅立叶变换并寻找单个尖峰。这将告诉您数据集在该频率处近似为正弦曲线。

【讨论】:

  • 不幸的是,只有当正弦波与一个 fft-bin 具有完全相同的频率时,它才会起作用。如果它在区间之间的某个位置,您会得到完全不同的光谱。
  • 无论频率如何,您都会得到一个突出的尖峰。该问题不要求确定频率;只是为了确定它是否是正弦。
【解决方案3】:

射入蓝色:您可以利用a*sin(t) 的积分是a*cos(t) 的事实。跟踪数据的最小值/最大值应该让您知道a

【讨论】:

  • ∫(a·sin(k·t+m) + b) dt = (-a/k)·cos(k·t+m) + b·t + C
  • 我不确定这是一个富有成效的方向。但是,注意到正弦的二阶导数与原数成正比且负数可能有用。 d2/dx2)sin(kx) = -k^2 sin(x)。为了减少噪声和舍入误差的影响,请使用平滑导数 - 阅读 Savitzky-Golay 过滤。
【解决方案4】:

检查least squares method

@CookieOfFortune:我同意,但傅里叶级数拟合在最小二乘意义上是最佳的(正如维基百科文章中所说的那样)。

如果您想先使用自己的输入数据,请查看 Wolfram Alpha 上的 Discrete Fourier Transformation (DFT)。如前所述,如果您想要快速实施,您应该查看几个FFT-libraries 之一。

【讨论】:

  • 正弦波可能有相位偏移,这会使使用最小二乘法更难实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
相关资源
最近更新 更多