我在试着识别心电图的R峰。我使用了以下代码行来完成此操作:
peaks=signal.find_peaks_cwt(signal_slice, widths=np.arange(1,80))
fig, ax = plt.subplots()
ax.set_title('Detect R peak')
ax.plot(signal_slice)
for peak in peaks:
ax.axvline(x=peak, color='r')我得到了以下输出:

然而,对于下面的信号,它也不能准确地检测到较小的峰值。

有没有什么额外的参数可以添加到scipy.signal.find_peaks_cwt中以使其更准确?或者使用peakutils这样做的任何方法?
现在它已经停止了错误地检测小峰值,但似乎仍然随机错过了大峰值,有人知道为什么吗?

发布于 2019-04-30 23:18:43
您应该将宽度指定为峰值的预期宽度。从Scipy documentation
用于计算CWT矩阵的一维宽度数组。通常,此范围应覆盖感兴趣的峰值的预期宽度。
这里有一个例子来说明宽度的效果。
from scipy import signal
xs = np.arange(0, 20*np.pi, 0.05)
xs2 = np.arange(0, 20*np.pi, 0.025)
data = np.sin(xs)
data2 = np.sin(xs2)
data= data + data2[:1257]
peakind = signal.find_peaks_cwt(data, np.arange(1,200))
peakind, xs[peakind], data[peakind]
fig, ax = plt.subplots()
ax.set_title('Detect R peak')
ax.plot(data)
for peak in peakind:
ax.axvline(x=peak, color='r')这只会产生全局峰值。

但是,如果将宽度更改为np.arange(1,100),您还将看到另一个局部峰值。
peakind = signal.find_peaks_cwt(data, np.arange(1,100))在这里,由于宽度的差异,这些方法检测到更多的峰值。

https://stackoverflow.com/questions/55923540
复制相似问题