2015-01-05 40 views
0

我有一個簡單的問題,我需要找到波形的峯值。現在,我使用scipy庫中的find_peaks_cwt方法完成了此操作。但是,在這種情況下,我的程序只是試圖找到峯值時掛起。我認爲這與波形中的樣本數量或我正在使用的「寬度」參數有關。Scipy的signal.find_peaks_cwt掛起

下采樣信號後,我能夠正確地找到峯值,但是,它花了很長時間才找到它們。大約五分鐘。

Here是波形的屏幕截圖。

波形有526728個樣本。我不認爲這是一個複雜的任務,我將耗盡硬件資源(內存,CPU等)

Here是我使用該代碼的波形截圖:

iMaxPeaks = signal.find_peaks_cwt(signal, np.arange(35,40), min_snr=2) 

此波包含32000個樣本。

任何幫助或指針在正確的方向非常感謝。

回答

2

從文檔爲:find_peaks_cwt

scipy.signal.find_peaks_cwt(vector, widths, wavelet=None, max_distances=None, gap_thresh=None, min_length=None, min_snr=1, noise_perc=10)[source]

試圖找到在1-d陣列的峯。

一般的方法是通過對每個寬度寬度的小波(寬度)進行卷積來平滑矢量。在足夠的長度尺度上出現並且具有足夠高的SNR的相對最大值被接受。

這種卷積(對於5個寬度中的每一個)很可能是導致代碼花費很長時間運行的原因。仔細查看源代碼,find_peaks_cwt調用cwt,它調用scipy.signal.convolve:此方法似乎不使用FFT方法進行卷積,對於大型陣列來說可能會更快。

如果您可以使用FFT重新實現卷積,則可能會看到性能有所提高。 (你的樣本數量526728,剛剛超過2^19,如果你用2^19 = 524288個樣本過來,它會更快)。

要查看您是否遇到了內存限制,可以嘗試緩慢增加樣本大小,查看是否存在性能急劇下降的臨界大小。

+0

謝謝你的解釋。我會嘗試使用FFT來平滑它,看看是否有幫助。 –