2015-01-05 39 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来平滑它,看看是否有帮助。 –