我试图在一些非常嘈杂的数据中找到峰值,例如:

在没有很好地理解术语的情况下,我将峰定义为窄(宽度
我正在尝试使用 scipy 的 find_peaks_cwt 但文档对我来说很不清楚。我试过 find_peaks_cwt(my_data, np.arange(1,30)) 但它返回了大量的峰值。然后我尝试添加 noise_perc=60 参数,但这并没有真正解决问题。我也尝试过使用其他参数,但我真的不明白“脊线”是什么。

我应该怎么做? widths=np.arange(1,30) 是否像我想的那样设置了我的宽度要求?如何指定高度要求?

最佳答案

在很大程度上取决于您的数据的实际含义(或您认为它们应该意味着什么)。这是合成数据的示例:

from scipy.signal import find_peaks_cwt
from matplotlib.pyplot import plot, ylim
from numpy import *
N = 2000
x = arange(N)
pwid = 200.
zideal = sinc(x/pwid - 2)**2 # Vaguely similar to yours
z = zideal * random.randn(N)**2 # adding noise
plot(x, zideal, lw=4)
ylim(0, 1)
zf = find_peaks_cwt(z, pwid/4+zeros(N))
plot(x[zf], zideal[zf], '*', ms=20, color='green')
# Create averaging zones around peaks
xlow = maximum(array(zf) - pwid/2, 0)
xhigh = minimum(array(zf) + pwid/2, x.max())
zguess = 0*xlow # allocate space
for ii in range(len(zf)):
   zguess[ii] = z[xlow[ii]:xhigh[ii]].mean()
plot(x[zf], zguess, 'o', ms=10, color='red')
pwidth 缩放 sinc() 函数中的峰宽。在对 find_peaks_cwt() 的调用中,使用较大的 widths 值会产生较少的峰值(较低的峰值密度)。最好的结果似乎是将 widths 中的值缩放到峰值的大约半峰宽 (HWHM)。
find_peaks_cwt() 在从理想数据中找到峰值方面做得非常出色。围绕这些值求和是一种猜测峰值的方法。如果您要对频谱功率求和,您可能应该对两者之间的所有值求和,而不是像我在这个快速而肮脏的演示中所做的那样固定间隔。

python - 使用 find_peaks_cwt 在嘈杂数据中查找峰值-LMLPHP

我发现该功能特别令人印象深刻的是它在存在更大峰值的情况下找到较小峰值的方式。

关于python - 使用 find_peaks_cwt 在嘈杂数据中查找峰值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42280725/

10-12 23:53