2017-02-16 117 views
0

我試圖找到一些非常嘈雜的數據,如本峯:尋找峯,find_peaks_cwt

不理解的術語非常好,我定義峯狹窄(寬度< 30 ),比附近地區高出10萬多。

我想使用scipy的find_peaks_cwt,但文檔對我來說很不清楚。我試過find_peaks_cwt(my_data, np.arange(1,30)),但它返回了大量的峯值。然後我嘗試加入noise_perc=60的論點,但這並沒有真正解決問題。我也嘗試過使用其他參數,但我不太瞭解「脊線」是什麼。

我應該做什麼不同? widths=np.arange(1,30)是否像我想的那樣設置我的寬度要求?我如何指定高度要求?

回答

0

很大程度上取決於您的數據實際意味着什麼(或您認爲他們應該表示什麼)。下面是用合成數據的示例:

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()做了一個相當可敬的工作,從理想數據中找到峯值。總結這些值是猜測峯值的一種方式。如果你正在求和光譜功率,那麼你應該總結所有的值,而不是像我爲這個快速和骯髒的演示所做的那樣,在一個固定的時間間隔內進行。

ploted as in example

我發現功能發現大得多的人的存在小峯的方式尤其令人印象深刻。

+0

這似乎是區分你的峯值搜索的主要特徵是「pwid/4 +零(N)」。你能解釋你是如何選擇的?我不明白你是如何選擇數量的,或者它應該是一個與點數相同長度的數組。 – ericksonla

+0

從文檔中,寬度是:「用於計算CWT矩陣的一維寬度數組,一般來說,這個範圍應該覆蓋感興趣峯值的預期寬度。」在這種情況下,我將sinc()中的時間間隔縮放爲pwid。 「寬度」數組是單側寬度,所以我縮放它來近似峯值的HWHM。 –