Python / SciPy的峰值searchalgorithm

我可以自己写一些东西,通过find一阶导数的零交叉或某些东西,但它似乎是一个普通的function,被包含在标准库中。 任何人都知道吗?

我的具体应用是2D数组,但通常用于查找FFT中的峰值等。

具体而言,在这些问题中,有多个强峰,而且有很多较小的“峰”是由噪声引起的,应该忽略。 这些只是例子。 不是我的实际数据:

1维峰值:

带有峰值的FFT输出

二维峰值:

Radon变换输出带圆圈的峰值

峰值searchalgorithm将find这些峰值的位置(不仅仅是它们的值),理想情况下可以find真正的样本间峰值,而不仅仅是具有最大值的指数,可能使用二次插值或其他。

通常你只关心几个强的峰值,所以他们要么select,因为他们高于一定的阈值,或者因为他们是一个有序列表的前n个峰值,按幅度sorting。

正如我所说,我知道如何自己写这样的东西。 我只是问是否有一个预先存在的function或包已知可以正常工作。

更新:

我翻译了一个MATLAB脚本 ,它适用于一维情况,但可能会更好。

更新更新:

sixtenbe为1-D案例创build了一个更好的版本 。

我不认为你正在寻找的是SciPy提供的。 在这种情况下,我自己写代码。

从scipy.interpolate的样条插值和平滑是相当不错的,可能在拟合峰值,然后find其最大值的位置相当有帮助。

我正在研究一个类似的问题,并且我发现了一些最好的参考文献来自化学(来自质谱数据中的峰值)。 对于峰值查找algorithm的一个很好的彻底审查阅读此 。 这是我遇到过的峰值查找技术最好的最清晰的评论之一。 (小波是在嘈杂的数据中find这种峰值的最佳select)。

它看起来像你的峰值明确定义,并没有隐藏在噪音。 在这种情况下,我build议使用平滑的savtizky-golay衍生物来find峰值(如果您只是区分上面的数据,就会产生大量的误报)。 这是一个非常有效的技术,很容易实现(你需要一个matrix类w /基本操作)。 如果你只是find第一个SG衍生物的过零点,我想你会很高兴。

有一个名为scipy.signal.find_peaks_cwt函数,这听起来像是适合您的需求,但是我没有经验,所以我不能推荐..

http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html

对于那些不确定在Python中使用哪个峰值查找algorithm的人来说,可以在这里快速浏览一下替代方法: https : //github.com/MonsieurV/py-findpeaks

想要自己等同于MatLab findpeaks函数,我发现Marcos Duarte的detect_peaks函数是一个很好的捕获。

很容易使用:

 import numpy as np from vector import vector, plot_peaks from libs import detect_peaks print('Detect peaks with minimum height and distance filters.') indexes = detect_peaks.detect_peaks(vector, mph=7, mpd=2) print('Peaks are: %s' % (indexes)) 

哪个会给你:

detect_peaks结果

以可靠的方式检测谱图中的峰值已经有相当多的研究,例如80年代音乐/audio信号的正弦模拟方面的所有工作。 在文献中寻找“正弦build模”。

如果你的信号像例子一样干净,一个简单的“给我一个比N个邻居更高的振幅”应该工作得很好。 如果信号嘈杂,一个简单而有效的方法就是及时查看峰值,并跟踪它们:然后检测谱线而不是谱峰。 IOW,您可以在信号的滑动窗口上计算FFT,以获得一组时间谱(也称为谱图)。 然后观察谱峰在时间上的演变(即在连续的窗口中)。

有标准的统计function和方法来查找数据exception值,这可能是您在第一种情况下需要的。 使用衍生工具将解决你的第二个 但是,我不确定解决连续function和采样数据的方法。

首先,如果没有进一步的说明,“高峰”的定义是模糊的。 例如,对于下面的系列,你会打5-4-5一个或两个峰吗?

1-2-1-2-1-1-5-4-5-1-1-5-1

在这种情况下,您至less需要两个阈值:1)只有高于阈值的极限值才能logging为峰值; 和2)低的阈值,使得在它下面的小值所分离的极值将变成两个峰值。

在极值理论文献中,峰值检测是一个深入研究的课题,也被称为“极端值的分解”。 其典型应用包括根据环境variables的连续读数识别危险事件,例如分析风速以检测风暴事件。