很大程度上取决于您的数据的实际含义(或您认为它们应该表示的含义)。下面是一个合成数据的例子:
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() 在从理想数据中找到峰值方面做得非常出色。对这些值求和是一种猜测峰值的方法。如果您要对光谱功率求和,您可能应该将两者之间的所有值相加,而不是像我在这个快速而肮脏的演示中所做的那样,对固定间隔进行求和。
我发现该功能特别令人印象深刻,因为它可以在存在较大峰的情况下找到较小的峰。