scipy - 如何减少峰值检测问题中的错误?
问题描述
我正在尝试识别心电图的 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 文档:
用于计算 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))
推荐阅读
- postgresql - 将 postgres 表主键 UUID 更改为 Character Varying
- data-structures - TCL/ITCL - 使用现有数据结构实现独特的数据结构
- android - BottomSheet 动画持续时间
- typescript - 有没有办法将 `jsdoc` 与 `.ts` 文件一起使用?也许用 babel 转译然后使用 jsdoc?
- angular - 无法从 nativescript worker 访问角度服务
- javascript - 限制输入 0.00 - javascript
- python - 如何让“python -m venv”直接安装最新的 pip 版本
- mysql - 添加新行后如何在数据库表中自动排序 ID?
- simple-html-dom - 使用简单的 html dom 解析 html 的逻辑
- vuejs2 - 即使在重新加载页面后也使侧边栏子菜单处于活动状态