首页  >  文章  >  后端开发  >  如何在Python/SciPy中有效利用find_peaks函数进行准确的峰识别?

如何在Python/SciPy中有效利用find_peaks函数进行准确的峰识别?

Patricia Arquette
Patricia Arquette原创
2024-10-22 19:26:34160浏览

How to Effectively Utilize the find_peaks Function for Accurate Peak Identification in Python/SciPy?

Python/SciPy 的寻峰算法

问题陈述

识别峰值的任务出现在各种应用中,从在傅里叶中查找峰值变换(FFT)以从 2D 阵列中提取峰值。一个常见的挑战是区分真正的峰值和噪声引起的波动。

Python/SciPy 中现有的峰值查找函数

与其从头开始实现峰值查找算法,不如考虑利用 scipy .signal.find_peaks 函数。此函数提供了根据特定条件过滤和识别峰值的选项。

了解 find_peaks 参数

要有效利用 find_peaks 的强大功能,了解其参数至关重要:

  • 宽度:峰的最小宽度。
  • 阈值:峰与其相邻峰之间的最小差异。
  • 距离:连续山峰之间的最小距离。
  • 突出度:从山峰下降到更高地形所需的最小高度。

强调突出度

在所有参数中,突出度 是区分真实峰值和噪声的最有效参数。它的定义涉及达到更高峰值所需的最小垂直下降。

示例应用:变频正弦曲线

为了说明其实用性,请考虑一个被噪声污染的变频正弦曲线。理想的解决方案是准确识别峰值,而不会屈服于虚假噪声峰值。

代码演示

以下代码演示了如何使用具有各种参数组合的 find_peaks 函数:

<code class="python">import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks

# Generate signal
x = np.sin(2*np.pi*(2**np.linspace(2,10,1000))*np.arange(1000)/48000) + np.random.normal(0, 1, 1000) * 0.15

# Find peaks using different parameters
peaks, _ = find_peaks(x, distance=20)
peaks2, _ = find_peaks(x, prominence=1)
peaks3, _ = find_peaks(x, width=20)
peaks4, _ = find_peaks(x, threshold=0.4)

# Plot results
plt.subplot(2, 2, 1)
plt.plot(peaks, x[peaks], "xr"); plt.plot(x); plt.legend(['distance'])
plt.subplot(2, 2, 2)
plt.plot(peaks2, x[peaks2], "ob"); plt.plot(x); plt.legend(['prominence'])
plt.subplot(2, 2, 3)
plt.plot(peaks3, x[peaks3], "vg"); plt.plot(x); plt.legend(['width'])
plt.subplot(2, 2, 4)
plt.plot(peaks4, x[peaks4], "xk"); plt.plot(x); plt.legend(['threshold'])
plt.show()</code>

从结果中观察到,使用突出度(第二个子图中的蓝线)可以有效地隔离真正的峰值,而距离、宽度和阈值在存在噪声的情况下提供低于标准的性能。

以上是如何在Python/SciPy中有效利用find_peaks函数进行准确的峰识别?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn