我可以通过找到一阶导数的零交叉点或其他东西来自己编写一些东西,但它似乎是一个足够常见的函数,可以包含在标准库中。有人知道吗?
我的特定应用程序是一个二维数组,但通常它会用于查找 FFT 等中的峰值。
具体来说,在这类问题中,有多个强峰,然后是许多较小的“峰”,这些峰是由噪声引起的,应该被忽略。这些只是例子;不是我的实际数据:
一维峰:
二维峰:
峰值查找算法会找到这些峰值的位置(而不仅仅是它们的值),并且理想情况下会找到真正的样本间峰值,而不仅仅是具有最大值的索引,可能使用 二次插值 或其他方法。
通常你只关心几个强峰,所以它们要么是因为它们高于某个阈值,要么是因为它们是有序列表的前 n 个 峰,按振幅排名。
正如我所说,我自己知道如何写这样的东西。我只是问是否有已知运行良好的预先存在的功能或包。
更新:
我 翻译了一个 MATLAB 脚本,它适用于一维情况,但可能会更好。
更新更新:
sixtenbe 为一维案例 创建了一个更好的版本。
原文由 endolith 发布,翻译遵循 CC BY-SA 4.0 许可协议
顾名思义,函数
scipy.signal.find_peaks
对此很有用。 But it’s important to understand well its parameterswidth
,threshold
,distance
and above allprominence
to get a good peak extraction.根据我的测试和文档, 突出 的概念是“有用的概念”,可以保留好的峰值,并丢弃嘈杂的峰值。
什么是 (地形)突出?它是 “从山顶下降到任何更高地形所需的最小高度” ,如下所示:
这个想法是:
测试:
我故意使用(嘈杂的)频率变化的正弦波,因为它显示出很多困难。我们可以看到
width
参数在这里不是很有用,因为如果你设置最小值width
太高,那么它将无法跟踪高频中非常接近的峰值部分。如果您将width
设置得太低,您将在信号的左侧部分出现许多不需要的峰值。与distance
相同的问题。threshold
只与直接邻居比较,在这里没有用。prominence
是提供最佳解决方案的解决方案。请注意,您可以组合其中的许多参数!代码: