Scipy的signal.find_peaks_cwt被挂断了

时间:2015-01-05 20:10:36

标签: python numpy scipy time-series python-3.4

我有一个简单的问题,我需要找到波形的峰值。现在,我在使用scipy库中的find_peaks_cwt方法之前已经这样做了。但是,在这种情况下,我的程序只是在试图找到峰值时挂起。我认为这与波形中的样本数量或我正在使用的“宽度”参数有关。

在对信号进行下采样之后,我能够正确地找到峰值,然而,需要花费很长时间才能找到它们。大约五分钟。

Here是波形的屏幕截图。

波形有526728个样本。我不认为这是一项复杂的任务,我将耗尽硬件资源(内存,CPU等)

Here是我使用代码处理的波形的屏幕截图:

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

此波包含32000个样本。

非常感谢任何帮助或指向正确的方向。

1 个答案:

答案 0 :(得分:3)

来自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的{​​{1}}:此方法似乎不使用FFT方法进行卷积,对于大型数组而言可能会更快。

如果您可以使用FFT重新实现卷积,您可能会发现性能有所提高。 (您的样本数量为526728,刚刚超过2 ^ 19。如果您使用2 ^ 19 = 524288样本,它会更快)。

要查看是否遇到内存限制,您可以尝试缓慢增加样本大小,看看是否存在性能急剧下降的临界大小。