现有的峰值检测算法有哪些?我有嘈杂的数据,我想对这些数据进行峰值检测。数据是反向的,其实我是在尝试确定底部。
这是 Excel 中数据的快照。我喜欢检测两个底部。我考虑过将数据通过低通滤波器,然后在移动平均线中确定峰值,然后在移动平均线内进行另一次搜索。我的DSP背景为零;这只是一种常识性的方法。我想听听专家的建议。
现有的峰值检测算法有哪些?我有嘈杂的数据,我想对这些数据进行峰值检测。数据是反向的,其实我是在尝试确定底部。
这是 Excel 中数据的快照。我喜欢检测两个底部。我考虑过将数据通过低通滤波器,然后在移动平均线中确定峰值,然后在移动平均线内进行另一次搜索。我的DSP背景为零;这只是一种常识性的方法。我想听听专家的建议。
Ktuncer,您可以在这里使用多种方法。我推荐的一种方法是使用离散小波变换 (DWT),特别是查看Daubechies Wavelet。我会选择,比如说,Daub-14 / Daub-Tetra。
基本上,您真正需要做的是“趋势”您的信号,然后从那里进行最小或最大选择。这将摆脱你的异常值。daub-14/daub-tetra 小波变换可以帮助您做到这一点,这尤其有帮助,因为您不知道信号的性质。(使用 daub-14,您可以准确地表示 14/2 = 7 次的多项式信号,看起来您不需要更多)。
这种小波变换的计算本质上是将你的能量“压缩”成几个指标。这些指标代表基向量的权重。其余的权重(理想情况下)将接近于零。当您的信号中有噪声时(就像您所做的那样),那些通常为零的权重现在有一些权重,但您可以简单地将它们归零并“去噪”您的信号。完成后,您可以进行简单的最大/最小检测。
涉及更多细节,如果您想讨论如何实现它,可以给我发电子邮件。我以前也做过类似的工作。
编辑:以下是一些说明 Daub-Tetra Denoiser 的图像:
我远非专家,但这是我会做的:
你似乎有一个缓慢变化的信号,叠加着波动。你搜索的峰值是一些更强的波动,所以我会用它来检测它们。
让成为您的原始信号。对适当数量的样本进行移动平均,以创建一个平滑的载体。
如果成功,必须具有零均值。计算的标准偏差。
您可以在,其中通常为 2、3、4。
可以通过去除绝对值并使用适当的测试来具体检测过冲或下冲。那是你要找的吗?
对于一维或多维信号,峰值检测有很多应用。下面是几个例子,展示了这些信号的变化以及它们对峰值的解释:
原海报的一维数据;
对图像进行霍夫变换,每个峰值对应于原始图像中的一条线;
图像的自相关,每个峰值对应一个显示“周期性模式”的频率;
图像和模板的“广义”互相关,每个峰对应于图像中模板的出现(我们可能对只检测最佳峰或几个峰感兴趣);
这些是我遇到的峰的定义和检测技术——当然还有其他我忘记或不知道的,希望其他答案能涵盖它们。
预处理技术包括平滑和去噪。@Mohammad 的答案是关于小波的,您可以在Mathematica 的 WaveletThreshold 的文档中看到它们的各种用法(顺便说一下,我也从中获取了示例)。
然后你搜索最大值。根据您的应用,您只需要全局最大值(例如,图像配准)、一些局部最大值(例如线检测)或多个局部最大值(关键点检测):这可以迭代完成,在数据中寻找最高值然后擦除所选峰值周围的区域等,直到最高剩余值低于阈值。或者,您可以在某个邻域大小内寻找局部最大值,并仅保留那些值高于阈值的局部最大值——有些人建议根据它们与局部最大值其余部分的距离来保留局部最大值(越远更好)。该武器库还具有形态学操作:扩展最大值和顶帽变换都可以适用。
在为哈里斯角过滤的图像上查看其中三种技术的结果:
此外,一些应用程序试图找到亚像素分辨率的峰值。插值可以是特定于应用程序的,非常方便。
据我所知,没有灵丹妙药,数据会告诉我们哪种技术效果最好。
有更多的答案真的很好,尤其是。来自其他学科。
我认为一种典型的峰值检测算法是这样的 where ref
is peak(bottom)
。
for i=1,N {
if i=1 { ref=data(i) }
else { if data(i)<=ref {ref =data(i) }}
}