首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何减少峰值检测问题中的误差?

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

Stack Overflow用户
提问于 2019-04-30 22:50:17
回答 1查看 139关注 0票数 0

我在试着识别心电图的R峰。我使用了以下代码行来完成此操作:

代码语言:javascript
复制
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这样做的任何方法?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-30 23:18:43

您应该将宽度指定为峰值的预期宽度。从Scipy documentation

用于计算CWT矩阵的一维宽度数组。通常,此范围应覆盖感兴趣的峰值的预期宽度。

这里有一个例子来说明宽度的效果。

代码语言:javascript
复制
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),您还将看到另一个局部峰值。

代码语言:javascript
复制
peakind = signal.find_peaks_cwt(data, np.arange(1,100))

在这里,由于宽度的差异,这些方法检测到更多的峰值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55923540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档