峰值检测方法


24

现有的峰值检测算法是什么?我有嘈杂的数据,我想对此数据进行峰值检测。数据是相反的,实际上我正在尝试确定底部。

这是Excel中数据的快照。我喜欢同时探底。我考虑过将数据通过低通滤波器,然后做一个移动平均,确定峰值,然后在移动平均范围内进行另一次搜索。我的DSP背景为零;这只是常识方法。我想听听专家的建议。

在此处输入图片说明


2
您要检测的两个底部是什么?我只看到一个明显的。您知道您有什么样的噪音,或它来自哪里吗?
杰森

我想知道您是否要在任何特定的硬件(资源限制)上实现它,因为这会影响我的峰值检测策略。
anasimtiaz'2

@JasonR紫色是显而易见的。但是,尖锐的边缘存在异常值。理想情况下,我希望将其剃光并计算出最低点。(因此,在我的方法中使用LP过滤器)浅蓝色上不明显的一个是紫色峰的最小点右侧。紫色不是真正的问题,但浅蓝色是。Excel绘图无法正常工作,但这是来自4096为2V的12位ADC。
Ktuncer

@anasimtiaz信不信由你,它可以在iPhone / Android上运行,所以我想可以说,它就像一台PC。没有硬件限制。
Ktuncer

@Ktuncer我添加了一些图像供您自己查看。
Spacey 2012年

Answers:


12

Ktuncer,您可以在此处使用多种方法。我推荐的一种方法是使用离散小波变换(DWT),尤其是查看Daubechies小波。我会选择Daub-14 / Daub-Tetra。

基本上,您真正需要做的是“趋势”您的信号,然后从那里进行最小或最大选择。那将摆脱您的异常值。daub-14 / daub-tetra小波变换可以帮助您做到这一点,这特别有用,因为您不知道信号的性质。(使用daub-14,您可以准确地表示14/2 = 7的多项式信号,看起来您将不需要更多的东西了)。

该小波变换的计算实质上将您的能量“压缩”为几个指标。这些指标代表基于基向量的权重。其余权重(理想情况下)将接近零。当您的信号中有噪声时(如您所愿),那些通常为零的权重现在具有一些权重,但是您可以将它们归零并“消噪”您的信号。完成此操作后,即可进行简单的最大/最小检测。

涉及更多细节,如果您想讨论如何实现它,可以给我发送电子邮件。我以前也做过类似的工作。

编辑:这是一些说明Daub-Tetra Denoiser的图片:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明


1
我喜欢这样。matlab中是否有为此提供的参考库?
Ktuncer

@Ktuncer向我发送电子邮件。
Spacey 2012年

4

我远不是专家,但是我会做的是:

您似乎在一个缓慢变化的信号上叠加了波动。您搜索的峰是一些较强的波动,因此我将使用这些波动来检测它们。

  1. 令为原始信号。对适当数量的样本进行移动平均,以创建平滑载波。X(T)Y(t)

  2. 如果成功,必须具有零均值。计算标准偏差的。XYσXY

  3. 当时,您可以检测到峰 ,其中通常为2、3、4。|(XY)(t)|>α×σα

通过去除绝对值并使用适当的测试,可以专门检测出过冲或下冲。那是您要找的东西吗?


1
有趣的方法。什么是σ?(标准开发人员?)。此外,撇开数学,背后的逻辑是什么?
Ktuncer

@ user4749:有趣的名称:)好的。是的,是标准偏差。我们将其用作波动幅度的度量。在您的数据上,随着时间的推移,它看起来相当稳定,因此表明这是正确的方法。逻辑上说,当峰大于这些波动时,就会检测到峰,因此我们的检测能力很强。你做MATLAB吗?如果我们收到您的信号,我们至少可以非常轻松地标记峰。σ
Jean-Yves

@ user4749基本上这里发生了什么,您的Y(t)将成为“仅趋势”信号。也表示平均值。因此,现在您要从信号中减去信号的平均值。那就是X(t)-Y(t)部分。所以现在剩下的就是您的声音。现在,(假设您的噪声是高斯噪声),​​则采用std&\ sigma&。现在查看abs(X(t)-Y(t))>所有值。为什么?这基本上用英语表示:“丢弃所有可能是噪声的值的99.99%,仅保留不是由于噪声引起的值”。4σ
Spacey 2012年

@ user4749这将帮助您获得离群峰,尽管我不确定它是否会得到您想要的整体峰((我假设您正在寻找“宽幅”峰?)
Spacey 2012年

1
@ Jean-Yves你好!:-)您是否假设这里的噪音是高斯噪声?(这就是为什么我们可以标准阈值)。我很好奇,如果噪声被着色怎么办?
Spacey 2012年

4

峰值检测在1D或多维信号方面有很多应用。以下是一些示例,显示了这些信号及其对峰值的解释可能有多大变化:

  • 原始海报的一维数据;

  • 图像的霍夫变换,每个峰对应于原始图像中的一条线; 在此处输入图片说明

  • 图像的自相关,每个峰对应于显示“周期性模式”的频率; 在此处输入图片说明

  • 图像和模板的“广义”互相关,每个峰对应于图像中模板的出现(我们可能只检测最佳峰或几个峰);

在此处输入图片说明

  • 为哈里斯角过滤图像的结果,每个峰对应于原始图像中的一个角。

在此处输入图片说明

这些是我遇到的峰的定义和检测技术-肯定还有我忘记或不知道的其他峰,希望其他答案能涵盖它们。

预处理技术包括平滑和去噪。@Mohammad的答案是关于小波的,您可以在Mathematica的WaveletThreshold文档中看到它们的各种用法(顺便说一下,我也在其中取了例子)。

然后,您搜索最大值。根据您的应用程序,您只需要全局最大值(例如,图像配准),一些局部最大值(例如,行检测)或许多局部最大值(关键点检测):这可以迭代地完成,在数据中寻找最大值然后擦除所选峰值附近的区域,依此类推,直到最高剩余值低于阈值。或者,您可以在某个邻域大小内寻找局部最大值,并仅保留那些值大于阈值的局部最大值-有些建议根据它们与其余局部最大值的距离来保持局部最大值(进一步更好)。该军械库还具有形态学操作:扩展最大值和高帽转换都可能适用。

在针对Harris角进行滤波的图像上查看以下三种技术的结果:

在此处输入图片说明

而且,一些应用试图在亚像素分辨率下找到峰值。插值(可能是特定于应用程序的)非常方便。

据我所知,没有灵丹妙药,而数据将证明哪种技术最有效。

特别是,有更多答案将是非常好的。来自其他学科。


您如何提取问题正文的数据供您使用?我找不到干净的表格。
莱奥波德·赫兹(LéoLéopoldHertz)2016年

1
是吗 我用其他例子。今天再次查看问题,我看不到如何从问题中干净地提取数据。
马提亚斯·奥迪西奥

-1

我认为,一个典型的峰值检测算法是这样的地方refpeak(bottom)

for i=1,N   {
       if i=1   {  ref=data(i) }
       else { if data(i)<=ref {ref =data(i) }}
}

3
我没有否决您的答案,但我认为那些人认为它是题外话。该草图检测序列的绝对最小值。OP正在寻找峰值,需要处理局部性和噪声的峰值。
Matthias Odisio '02年

las,对“规范答案”的悬赏根本没有任何回应。在这方面,所有答案都同样“无关紧要”;我为这个答案提供了赏金,因为它是最古老的。
马提亚斯·奥迪西奥
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.