如何减少峰值检测问题中的误差?
How to reduce error in peak detection problem?
我正在尝试识别心电图的 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 的任何方式?
现在已经不再误测小峰了,但是好像还是随机漏掉了大峰,有谁知道为什么吗?
您应该将宽度指定为峰的预期宽度。来自 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))
由于宽度的差异,这里的方法检测到更多的峰。
我正在尝试识别心电图的 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 的任何方式?
现在已经不再误测小峰了,但是好像还是随机漏掉了大峰,有谁知道为什么吗?
您应该将宽度指定为峰的预期宽度。来自 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))
由于宽度的差异,这里的方法检测到更多的峰。