很大程度上取決於您的數據實際意味着什麼(或您認爲他們應該表示什麼)。下面是用合成數據的示例:
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 * 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()
做了一個相當可敬的工作,從理想數據中找到峯值。總結這些值是猜測峯值的一種方式。如果你正在求和光譜功率,那麼你應該總結所有的值,而不是像我爲這個快速和骯髒的演示所做的那樣,在一個固定的時間間隔內進行。
我發現功能發現大得多的人的存在小峯的方式尤其令人印象深刻。
這似乎是區分你的峯值搜索的主要特徵是「pwid/4 +零(N)」。你能解釋你是如何選擇的?我不明白你是如何選擇數量的,或者它應該是一個與點數相同長度的數組。 – ericksonla
從文檔中,寬度是:「用於計算CWT矩陣的一維寬度數組,一般來說,這個範圍應該覆蓋感興趣峯值的預期寬度。」在這種情況下,我將sinc()中的時間間隔縮放爲pwid。 「寬度」數組是單側寬度,所以我縮放它來近似峯值的HWHM。 –