如何减少峰值检测问题中的错误?

时间:2019-04-30 14:50:17

标签: scipy python-3.6 peakutils

我正在尝试确定ECG的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')

我得到以下输出: enter image description here

但是,通过以下信号,它也无法准确检测到较小的峰值。

enter image description here

是否可以在scipy.signal.find_peaks_cwt中添加任何额外的参数以使其更加准确?还是使用peakutils这样做的任何方式?

现在它已停止错误地检测出小峰,但仍然似乎随机错过了大峰,有人知道为什么吗? enter image description here

1 个答案:

答案 0 :(得分:0)

您应将宽度指定为峰的预期宽度。来自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')

这仅导致全局峰值。 One peak

但是,如果将宽度更改为np.arange(1,100),您还将看到另一个本地峰。

peakind = signal.find_peaks_cwt(data, np.arange(1,100))

此处,由于宽度的差异,这些方法检测到更多的峰。 Two peaks in the same data