心电信号求qrs点坐标
算法思路:
这是2020年江苏省电赛A题的一部分设计要求,计算ADS1292模块传出的心电信号值,找到QRS坐标,ADS1292是一个24位高精度的ADC,通过两路的差分放大接收激励引脚产生的电压变化(心电信号的变化)。
ECG信号为准周期信号,R为一个波段的最大值,Q为R前的最小值,S为整个波段最小值(R后最小值),信号建议使用SG滤波,可以保留信号变化的一种类似于最小二乘法的滤波,然后对数组取差值,前后差值最大的点为R,R前差值为正,直到Q点,R后插值为负,直到S点。
代码:
提示:这是对一组250个采样点,分区间找最大值,判断组内有效心电信号波段个数,计算相应QRS坐标的简易算法,用的一组处理后的心电数据txt里的。
#include <stdio.h>
#include <math.h>
int main(void)
{int i,j,max_piont[6]={0},min1_piont[6]={0},min2_piont[6]={0},sz[461],max[6]={0},min1[6]={0},min2[6]={0};int len = 85;//real = 85 , org = 461(460)int base = 500;//651:b,1563:c ,, real = 0int a[85]={0};int max_buf[5] = {0};int max_buf_val[5] = {0};int box[250] ={0};int box_len = 250;int window = 50;int window_cnt =0;int max_temp=0;int temp;int ture=0;float xinglv=0, time = 0.004 ,xinglv_jiange1=0,xinglv_jiange2=0;//time要按采样时间算
//从TXT中读250个数字FILE *fpRead=fopen("box2.txt","r");//b,c ,, real = real_1if(fpRead==NULL){return 0;}for(i=0;i<box_len;i++){fscanf(fpRead,"%d ",&box[i]);//printf("%d ",a[i]);}
//把250分成5个区间,取最大值for(i=0;i<5;i++){max_temp = 0;for(j = i*window;j < i*window+window;j++){max_temp=(max_temp>box[j])?max_temp:box[j];if(max_temp==box[j]) {max_buf[i]=j;max_buf_val[i]=box[j];}}window_cnt = window_cnt + 1;}
//排序 for(i=0;i<5;i++){for(j=i+1;j<5;j++){if(max_buf_val[i]<max_buf_val[j]){temp=max_buf_val[i];max_buf_val[i]=max_buf_val[j];max_buf_val[j]=temp;temp=0;temp=max_buf[i];max_buf[i]=max_buf[j];max_buf[j]=temp;}}}for(i=0;i<5;i++)//计算有效的波峰{if(max_buf_val[i]>max_buf_val[0]-5) ture++;}
//取前有效个,算qsfor(i=0;i<ture;i++){ for(j=max_buf[i];j<max_buf[i]+10;j++){min1[i]=(min1[i]<box[i])?min1[i]:box[j];if(min1[i]==box[j]) min1_piont[i]=j;//S}for(j=max_buf[i]-12;j<max_buf[i];j++){min2[i]=(min2[i]<box[j])?min2[i]:box[j];if(min2[i]==box[j]) min2_piont[i]=j;//R}}//算心率,心律不齐xinglv = 60/(((max_buf[1]-max_buf[0])+(max_buf[2]-max_buf[1]))/2*time); // (time)not have value !!! just testxinglv_jiange1 = max_buf[1]-max_buf[0];xinglv_jiange2 = max_buf[2]-max_buf[1];//输出printf(" %d %d %d %d %d , %d\n",max_buf[0],max_buf[1],max_buf[2],max_buf[3],max_buf[4],window_cnt);printf(" %d %d %d %d %d , %d\n",max_buf_val[0],max_buf_val[1],max_buf_val[2],max_buf_val[3],max_buf_val[4],window_cnt);printf(" R-R间距 %f %f \n",xinglv_jiange1,xinglv_jiange2);printf(" 心率 %f 间隔误差 %f \n",xinglv,(max_buf[1]-max_buf[0])/(max_buf[2]-max_buf[1]));for(i=0;i<ture;i++){printf(" 输入%d个整数中Q%d是:%d \n其数组下标是:%d 是第:%d个\n",box_len,i,min2[i],min2_piont[i],min2_piont[i]+base);printf(" 输入%d个整数中R%d是:%d \n其数组下标是:%d 是第:%d个\n",box_len,i,max_buf_val[i],max_buf[i],max_buf[i]+base);printf(" 输入%d个整数中S%d是:%d \n其数组下标是:%d 是第:%d个\n",box_len,i,min1[i],min1_piont[i],min1_piont[i]+base);}ture = 0;return 0;
}
结果对于处理过的数据还是比较准的
误差分析:
提示:还是需要处理两最大值采样点x坐标过近的问题,滤除可能的误差。
心电信号求qrs点坐标相关推荐
- 【ECG理论篇】(3)AI实现心律失常判别:心电信号的波形识别与特征提取
心电图中的各个波形都包含了非常多的信息,例如RR间期可以反映心动周期的时限:相邻心动周期的 RR 间期的比值可以反映室性早搏:R 波和 S 波幅值的比值和 R 波和 S 波之间的时限可以反映房性早搏等 ...
- matlab零交叉块,[MATLAB基础] 关于心电信号奇异点与其小波变换模极大值对的零交叉点的关系?请教下面程序应该如何理解哈...
关于心电信号奇异点与其小波变换模极大值对的零交叉点的关系?请教下面程序应该如何理解哈 %**************************************求正负极大值对*********** ...
- 心电信号去噪(part3)--数学形态学
本系列上一篇(中值滤波器)指路:https://blog.csdn.net/m0_37422217/article/details/90739660 注:这里是以小型手持心电图机为研究对象的(单导联) ...
- arma模型谱估计matlab_基于机器学习的心律失常分类(四)——心电信号特征提取[MATLAB]...
目前比较常用的特征提取是提取心电信号的各波形间期长度.波峰高度等,本文是使用ARMA模型对心电信号进行处理,使用其系数来作为特征. 一.心拍划分 大多伴有异常波形的心律失常信号,通常都会具体表现在单个 ...
- 【心电信号】基于matlab心率检测【含Matlab源码 1993期】
一.心电信号简介 0 引言 心电信号是人类最早研究的生物信号之一, 相比其他生物信号更易于检测, 且具有直观的规律.心电图的准确分析对心脏病的及早治疗有重大的意义.人体是一个复杂精密的系统, 有许多不 ...
- 根据心电信号计算心率的matlab代码
先说说现有的资料: [1][2]弄了FIR1还有hamming窗,搞得老麻烦了,扔一边先. --------------------------------------------------自己另外 ...
- matlab心电信号处理,基于Matlab的心电信号自动处理系统的设计与开发 毕业论文设计.doc...
您所在位置:网站首页 > 海量文档  > 计算机 > matlab 基于Matlab的心电信号自动处理系统的设计与开发 ...
- 【C4】基于深度学习的心电信号分析
★★★ 本文源自AI Studio社区精品项目,[点击此处]查看更多精品内容 >>> 基于深度学习的心电信号分析 一.项目背景 近年来,随着人工智能和算法的发展,以机器学习和深度学习 ...
- 基于matlab模拟心电信号,附赠代码
matlab官方链接:https://www.mathworks.com/matlabcentral/fileexchange/10858-ecg-simulation-using-matlab 心电 ...
最新文章
- silverlight实现2D人物动画
- 敏捷开发_全面解析瀑布式开发和敏捷式开发
- 信息系统项目管理师:第4章:项目整体管理与变更管理(3)
- 为什么Netty这么火?与Mina相比有什么优势?
- OpenStack Nova核心组件和RabbitMQ通信流程分析
- 《Go语言程序设计》读书笔记(七)基于共享变量的并发
- mysql新增列并同时增加数据_图解MySQL | 「原理解析」 MySQL 为表添加列 是怎么立刻完成的...
- 解决问题 xcrun: error: invalid active developer path
- MFileServer管理员用户名密码配置
- ECS Linux 服务器解除ssh登陆后被锁定或暂停输入输出的终端
- Kinect2.0 vs2013的配置
- createdroptargets_拖拽神器React DnD你真的了解了吗?
- webUploader大文件断点续传学习心得 多文件
- 去NM的OKR,大坑,得把人逼疯!
- html 调用es2015模块,在浏览器中懒加载ES2015模块
- NGUI动态字体教程
- 读论文 Automatic generation and detection of highly reliable fiducial markersnunder occlusion
- google map for Android
- 开启cdn后导致websocket10秒直接断开连接 报错1006
- 启动项目报错 Failed to bind properties under
热门文章
- 派对屋3000效果器怎样调试_前级效果器的调试方法
- linux强制卸载光盘,linux如何挂载光盘linux卸载光盘的方法
- 设计药品medicine 类 —— 代码篇
- 【AUTOSAR】【Lin通信】Lin
- gcc编译error adding symbols错误
- FPGA零基础学习:在FPGA中,同步信号、异步信号和亚稳态的理解
- 关于“打开数据库时出错: 用户 ‘sa‘ 登录失败。”的解决方法
- 【钉钉-场景化能力包】如何设计一款OKR酷应用
- 如何让matlab全速运行,提高matlab代码运行效率
- Windows下 OpenAcs测试平台搭建