如何找到峰值和周期?

信息处理 噪音 自相关 峰值检测
2022-02-17 06:54:28

我正在查看这样的数据:

在此处输入图像描述

源数据:http ://pastebin.com/raw.php?i=L6cd8d5K

数据是准周期性的,有明显的周期但不是精确的重复,周期变化很大。我想为每个周期找到准确的峰值位置和周期持续时间。理想情况下,峰值位置将与准确峰值所在位置的直观概念相匹配。

是什么让这变得困难:

  • 噪音:虽然它可能不完全是噪音!当值很高时,变化要大得多,因此最高尖峰往往出现在“真实”峰值附近。

  • 波形不对称:既不是从左到右也不是上下。做一些像高通滤波器这样的事情会上下移动峰值,这取决于它们的持续时间和两者之间的形状。

什么不太可能运作良好:

  • 带通滤波器与传统的峰值拾取相结合:由于(不对称)上下斜率的值被添加到峰值所在的位置,因此峰值的位置将发生偏移。真正高的值在结果中不会有很高的权重,因为带通滤波器的低通部分会将它们的能量传播到相邻的值。

  • 自相关:连续循环的形状差异太大。

  • 从一个周期的前沿(或后沿)到下一个周期测量的周期持续时间:再次形状差异太大。

3个回答

就个人而言,我只会使用低通滤波器,尽量保持它尽可能小,以减少不对称的影响。

存在显着噪声的事实已经意味着峰值位置存在一些不确定性,我预计这将与滤波器引入的任何偏差具有相似或更大的幅度。

如果您真的担心偏差,您可以考虑使用形态打开和关闭过滤器。这基本上是在表面上方/下方运行一个球,因此任何一个都会高估/低估峰高。然后,您可以获得 2 条线来给出峰值所在位置的包络线。如果噪声频率适当高,则两条曲线的平均值可能是对“真实”曲线的一个不错的估计。

您可以尝试使用 Savitzky-Golay 过滤器,然后进行标准峰值检测。SG 过滤器将保留峰的位置。如果您使用的是 Matlab,它带有信号处理工具箱。这里如果您使用的是 python,我在这里写过它们

正如@Aaron 所说,您的峰值定义不是很清楚,但是如果您想找到满足特定阈值条件的最高幅度的时间位置,那么我认为提取该信息的有用工具是 STFT,特别是如果您正在处理带噪声的 Gabor 变换。