Matlab心电信号的PQRST模拟-实验报告
心电信号处理算法设计-实验要求
- data4 是一段实际采样得到的心电数据, 采样频率为 100Hz, 波形如下图所示。设计相应的算法, 计算心率, 单位为: 次/分钟。可能会用到的知识为数字滤波器的设计, 离散傅里叶变换等。要求该算法复杂度尽量简单, 可以移植到 Cortex-M3性能的单片机上实现(本次不需要做移植, 只需要考虑算法的复杂度即可)。可选择自己熟悉的语言进行算法设计, 建议选择 Matlab 进行算法设计。
- 同样是 data4 实际采样得到的心电数据, 对该数据进行相应的处理, 得到标准的心电波形。要求能够显示完整的 PQRST 的心脏跳动过程, 能够清楚的看到处理后的心电信号显示 P 波、R 波和 T 波。幅值(y 轴)可以不做处理, 或者为了计算方便也可以做归一化处理, 不做具体要求。
- 认真撰写设计报告, 要求有详细的算法设计说明, 可以选择文字、流程图等图文配合对算法进行说明。若参考了学术论文, 请注明参考文献。
准备工作:
数据 | 备注 |
---|---|
采样频率 | 100Hz |
数据数量 | 1868条 |
Matlab版本 | 2015b |
操作系统 | XUbuntu20.04 |
流程图绘制工具 | LibreOffice Draw |
原始信号组成:
信号 | 频带范围 | 滤波器 |
---|---|---|
心电信号 | 5~20HZ[1] | - |
肌电噪声 | 30~300Hz[1] | 低通 |
工频噪声 | 50Hz[1] | 低通 |
基线漂移噪声 | 0.03Hz[2] | 零相移滤波器 |
实验总流程图:
#########第1部分.设计相应的算法, 计算心率####################
概述:
①肌电噪声和工频噪声处理
主要代码来自[1],[1]中滤除肌电噪声和工频噪声各自用了一个滤波器,
属于多余,保留最低截止频率的低通滤波器即可.
过滤后效果如下:
fp=10;%通带截止
fs=15;%阻带截止频率
可以看到:
①50Hz工频被滤除
②20Hz以上信号被削弱
③之所以两边呈现对称都有是因为傅里叶变换有双边效果.
----------------------------------------------------------------------
②基线漂移噪声处理
[1]中的零相移(分子分母各自的相位偏移理论计算上一致称为零相移)
滤波器代码不完整,且没给截止角频率和阶数
[2]中式(4)为:
H(z)=09876z−0.9876z−0.9752H(z)=\frac{09876 \mathrm{z}-0.9876}{z-0.9752}H(z)=z−0.975209876z−0.9876
可知零相移滤波器的阶数为1
∵基线漂移噪声的频率远远低于心电信号,
∴基线漂移滤波器的截止频率设为比"心电信号的频率下限"小一些即可.
----------------------------------------------------------------------
③经过上面的两步处理,最终得到如下波形:
在上面两图中对比波峰,可以看到波峰所在时刻点位置对应,所以确实是零相移。
----------------------------------------------------------------------
④对比[3]中的心患波形与③中波形(为了便于比较,经过放大处理):
实验结果 | [3]房扑图 |
---|---|
依据上述比较可以判断:
该心电信号来源于患有"房扑"的心脏病人.
----------------------------------------------------------------------
⑤波峰检测:
采样时刻(s) | 波峰 |
---|---|
0.0100 | 229.6991 |
0.8600 | 62.4065 |
1.7100 | 72.1880 |
2.7900 | 82.7408 |
3.9400 | 81.1390 |
5.0200 | 72.2794 |
6.1200 | 65.1390 |
7.2800 | 55.6109 |
8.4200 | 62.6077 |
9.5300 | 75.2257 |
10.6400 | 71.2959 |
11.7800 | 69.1398 |
12.8900 | 66.7628 |
13.9900 | 58.2763 |
15.1600 | 86.7839 |
16.2800 | 64.3633 |
17.4000 | 77.9292 |
18.5800 | 76.4417 |
对照③中的图,确实是18个波峰,说明代码输出正确。
数据清洗:
①第一条数据是异常数据,删除.
②第二条数据和第三条数据时间间隔小于1s,所以也要删除。
计算心率的处理步骤:
①计算第一列的其余数据的相对于上一条数据的时间间隔(详细细节请见[6]),得到一个序列
②将①中的序列计算加权平均,得到心跳一次的耗时
③60s/心跳一次的耗时,可以得到平均心率(每分钟心跳多少次)。
实验第1部分结论:
该心电信号的心率为53.35次/分
算法复杂度分析:
这个要看底层被调用的代码有哪些地方用for循环了,
没有来得及去看。
第1部分代码不靠谱的地方:
使用了零相移滤波器,
实际中不可能零相移(不知道硬件中效果如何),
以及阶数512(硬件开销较大),
可能需要后面再改。
#############-第2部分-PQRST模拟#############
根据[4],目前没有能直接处理实验第1部分中③中结果的波形.查看了文献[5],都是很理想很光滑的输入波形,不适合本例。
[4][5]的共同特点都是对光滑密集的输入波形进行PQRST模拟。③中波形布满噪声,故下面试图处理该问题。
开始观察波形并进行分析:
∵实验报告第1部分的③最终判定该心电信号属于"房扑"
∴所以上述除了最高尖峰以外的部分波形中,
判定波谷属于有效信号,予以保留,
高频波峰视为需要去除或平滑的噪声.
这里有个矛盾:
峰值(心拍)所处的位置,至少有两种谐波,
一种是窄谐波,一种是宽谐波。
窄谐波(高频):构成峰值的形状.
宽谐波(低频):构成心率周期波形
信号分析:
①
∵因为窄谐波和噪声谐波宽度很接近,也就意味着两者频率接近。
∴如果滤除图中标记的噪声,那么窄谐波也会被"误伤"滤除,“误伤”会导致心率难以计算.
所以只能是先计算心率,再进行PQRST模拟,不可能反着来
②如果不滤除图中标记的噪声,那么会导致无法使用[4]中的方式进行PQRST模拟,想要进行PQRST模拟必须滤掉房扑部分的噪声,同时不能误伤峰值(心拍).
下面考虑几种方案来设法平滑该信号:
可能的方案 | 存在的问题 |
---|---|
峰值信号增强+低通滤波 | 肯定不行,滤波器无视幅值,只认频率 |
多项式拟合后再恢复峰值(心拍) | 阶数会很高,肯定不靠谱 |
指数平滑+峰值(心拍)恢复 |
①会滞后一个采样时刻,需要恢复 ②需要恢复峰值(心拍) |
小波变换+峰值(心拍)恢复 |
需要恢复峰值(心拍) 好处是滤噪后没有相移 |
零相移低通滤波+峰值(心拍)恢复 | 不靠谱,硬件上不可能完美零相移(实际效果不明) |
最省事的目前想到的应该是小波变换了。
要如何恢复被小波变换误伤的峰值信号(心拍)呢?
我们观察到波峰到波谷大概是3~4个采样间隔,如下:
①实验第1部分峰值(心拍)检测时,留下了峰值(心拍)对应的时刻位置
②小波变换过滤噪声
③通过①中的峰值(心拍)位置,在该位置±3个采样间隔(本实验中±0.03s),对信号进行增强处理。增强处理办法如下:
峰值中心增强70mv,
峰值中心±0.01s处增强45mV
峰值中心±0.02s处增强25mV
峰值中心±0.03s处增强10mV
小波变换处理后效果如下:
峰值信号(心拍)增强后效果:
为什么不消除上图中标记的噪声谐波?是不是实验处理有问题?
因为您提供的是"房扑"心电信号,而不是"健康"心电信号。
如果去除了,会把心脏病误诊为心脏健康。
所以不应该去除。
实验第2部分结论-总体效果
实验第2部分结论-局部放大效果
除了上面论述的通过小波变换进行PQRST模拟,
还可以通过指数平滑进行PQRST模拟,相关实验报告请见参考文献[7]
可以得到与上面类似的效果.
附录
原始数据、完整代码、运行步骤:
https://gitee.com/fastsource/heart_rate_pqrst
Reference:
[1]基于MATLAB的心电信号预处理
[2]Filters in the ECG Signal Processing
[3]常见的14种异常心电图的波形特点
[4]心电信号的PQRST模拟matlab代码(转载+自己调研汇总)
[5]傅里叶级数在心电信号模拟中的应用
[6]根据心电信号计算心率的matlab代码
[7]基于指数平滑对心电信号进行PQRST模拟
Matlab心电信号的PQRST模拟-实验报告相关推荐
- 基于指数平滑对心电信号进行PQRST模拟(第二种方案)
基于指数平滑对心电信号进行PQRST模拟,对下面的流程中的橙色部分进行实现. 第一种方案流程请见[1] 最终结果如下: 上述圆圈处是异常信号(幅度异常,以及与其他心拍距离异常),删除. 局部放大效果如 ...
- 心电信号的PQRST模拟matlab代码(转载+自己调研汇总)
目前PQRST网上现成的代码有两份[1][2] 我们采用[2],原因是[1]中采用了lowpass这个函数, [3]中提到:"注意,只有2018年之后的matlab才有lowpass, ba ...
- Matlab重建信号实验总结,实验三信号采样与重建(实验报告).doc
实验三信号采样与重建(实验报告) <信号与系统>实验报告 学院 专业 班级 姓名 学号 时间 实验三 信号采样与重建 一.实验目的 1.进一步学习MATLAB的函数及其表示. 2.掌握及验 ...
- matlab fft谱分析实验报告,基于matlab的fft频谱分析及应用实验报告.docx
基于matlab的fft频谱分析及应用实验报告 实验三用FFT对信号进行频谱分析 一实验目的 1能够熟练掌握快速离散傅立叶变换的原理及应用FFT进行频谱分析的基本方法:2了解用FFT进行频谱分析可能出 ...
- 无穷大功率电源matlab仿真,MATLAB-Simulink系统建模与仿真-实验报告
MATLAB/Simulink 电力系统建模与仿真 实验报告 姓名: ****** 专业:电气工程及其自动化 班级: ******************* 学号:****************** ...
- 电力系统matlab实验报告,基于matlab语言计算电力系统暂态稳定仿真程序实验报告.docx...
基于matlab语言计算电力系统暂态稳定仿真程序实验报告 BeijingJiaotongUniversity 电力系统分析 暂态稳定分析实验 学院:电气工程学院 班级:xxxxxxxx 学号:xxxx ...
- 使用计算机模拟抛硬币实验动画课件,概率论与数理统计实验2抛硬币实验的随机模拟实验报告...
概率论与数理统计实验2抛硬币实验的随机模拟实验报告 (4页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 <概率论与数理统计> ...
- 【代码补全】matlab心电信号R波提取
对Matlab心电信号QRS波检测中代码的补充,使其完整可用. 补充内容来自基于matlab的心电信号QRS波检测与分析. x=iswt(swa,swd,'db3'); %--心电信号去噪完成后-- ...
- 蝴蝶效应matlab程序,实验:使用Matlab对蝴蝶效应进行仿真的实验报告.doc
实验:使用Matlab对蝴蝶效应进行仿真的实验报告.doc 使用Matlab对"蝴蝶效应"(初值敏感性)进行仿真 一. 实验目的 1.掌握MATLAB工具的安装方法: 2.掌握常用 ...
最新文章
- Cygwin的安装及在Android jni中的简单使用举例
- 内存泄露从入门到精通三部曲之常见原因与用户实践
- MySQL配置文件my.cnf中文版
- linux 查看入侵日志,linux入侵日志记录清除
- SAP UI5 函数节流和异步完成令牌的应用
- .NET Core计划弃用project.json
- numpy方法读取加载mnist数据集
- oracle00333,Oracle数据库REDO损坏ora-00333修复手札
- javaweb使用 window.location.href 传中文参数 乱码问题
- 软件版本中的release,stable,alpha,beta,pre,snapshot
- 基于微信小程序的毕业设计题目(33)PHP校园失物招领小程序(含开题报告、任务书、中期报告、答辩PPT、论文模板)
- Thingsboard hierachy widget 和同一个dashboard不同数据的联动控制
- Win7 配置 Git 客户端 图文详解
- 【新书推荐】【2017.07】创新的雷达技术与应用第一卷:实孔径阵列雷达、成像雷达与无源多基地雷达
- 使用CDN后网页无法访问怎么解决
- 如何快速将磁盘写满!!!
- C#蓝牙连接及传输数据的三种方式(蓝牙传输文件、二进制数据)
- 仅改变rowspan背景_山西耗资10亿的小镇,人称长治“小周庄”,距市中心仅16公里...
- oj2448: 分离正整数中的各位数
- 使用Travis-CI自动部署博客
热门文章
- Django扩展自定义manage命令
- 【nginx运维基础(4)】Nginx的日志管理(日志格式与定时分割日志)
- sql注入一点小心得
- Windwos中system、System32、SysWOW64区别
- WEB前端学习六 js什么是闭包
- 计算机技术朝着那个方面发展,目前,信息系统在朝着哪个方面发展?
- 计算机应用在开始栏显示乱码,大神解决win10系统应用程序和开始菜单出现乱码的详细方案...
- 学习使用bilstm_crf_model出现的bug
- 一个简单的if else优化
- Python如何读取文件