Scipy 的 signal.find_peaks_cwt 挂断了

Scipy's signal.find_peaks_cwt getting hung up

我有一个简单的问题,我需要找到波形的峰值。现在,我已经在使用 scipy 库中的 find_peaks_cwt 方法之前完成了此操作。但是,在这种情况下,我的程序只是在尝试查找峰值时挂起。我认为这与波形中的样本数或我正在使用的 "widths" 参数有关。

在对信号进行下采样后,我能够正确找到峰值,但是,找到它们需要很长时间。大约五分钟。

Here为波形截图

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

Here 是我使用代码得到的波形截图:

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

这一波包含 32000 个样本。

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

来自以下文档: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]

Attempt to find the peaks in a 1-D array.

The general approach is to smooth vector by convolving it with wavelet(width) for each width in widths. Relative maxima which appear at enough length scales, and with sufficiently high SNR, are accepted.

这种卷积(针对 5 个宽度中的每一个)很可能是导致您的代码花费很长时间才能完成 运行 的原因。查看源代码,find_peaks_cwt 调用 cwt 调用 scipy.signal.convolve:此方法似乎没有使用 FFT 方法进行卷积,这对于大型数组可能会更快。

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

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