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