python寻峰算法_PythonSciPy的寻峰算法
函数^{},顾名思义,对此很有⽤。但了解其参数width、threshold、distance以及最重要的参数prominence是获得良好峰提取的重要条件。
根据我的测试和⽂档,突出度的概念是“有⽤的概念”,它可以保留好的峰值,并丢弃有噪声的峰值。
什么是(topographic) prominence?它是从⼭顶到任何更⾼地形所需的最低下降⾼度,如图所⽰:
想法是:The higher the prominence, the more "important" the peak is.
测试:
我特意⽤了⼀个(有噪声的)频率变化的正弦波,因为它显⽰出许多困难。我们可以看到,width参数在这⾥不是很有⽤,因为如果设置的最⼩值width太⾼,那么它将⽆法跟踪⾼频部分⾮常接近的峰值。如果将width设置得太低,则信号左侧会出现许多不需要的峰值。与distance相同的问题。threshold只与直接邻居进⾏⽐较,这在这⾥是不有⽤的。prominence是最好的解决⽅案。请注意,您可以组合这些参数中的许多!
代码:import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks
x = np.sin(2*np.pi*(2**np.linspace(2,10,1000))*np.arange(1000)/48000) + al(0, 1, 1000) * 0.15
peaks, _ = find_peaks(x, distance=20)
peaks2, _ = find_peaks(x, prominence=1) # BEST!
peaks3, _ = find_peaks(x, width=20)
peaks4, _ = find_peaks(x, threshold=0.4) # Required vertical distance to its direct neighbouring samples, pretty useless
plt.subplot(2, 2, 1)
linspace函数pythonplt.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()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论