算法思路:

这是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点坐标相关推荐

  1. 【ECG理论篇】(3)AI实现心律失常判别:心电信号的波形识别与特征提取

    心电图中的各个波形都包含了非常多的信息,例如RR间期可以反映心动周期的时限:相邻心动周期的 RR 间期的比值可以反映室性早搏:R 波和 S 波幅值的比值和 R 波和 S 波之间的时限可以反映房性早搏等 ...

  2. matlab零交叉块,[MATLAB基础] 关于心电信号奇异点与其小波变换模极大值对的零交叉点的关系?请教下面程序应该如何理解哈...

    关于心电信号奇异点与其小波变换模极大值对的零交叉点的关系?请教下面程序应该如何理解哈 %**************************************求正负极大值对*********** ...

  3. 心电信号去噪(part3)--数学形态学

    本系列上一篇(中值滤波器)指路:https://blog.csdn.net/m0_37422217/article/details/90739660 注:这里是以小型手持心电图机为研究对象的(单导联) ...

  4. arma模型谱估计matlab_基于机器学习的心律失常分类(四)——心电信号特征提取[MATLAB]...

    目前比较常用的特征提取是提取心电信号的各波形间期长度.波峰高度等,本文是使用ARMA模型对心电信号进行处理,使用其系数来作为特征. 一.心拍划分 大多伴有异常波形的心律失常信号,通常都会具体表现在单个 ...

  5. 【心电信号】基于matlab心率检测【含Matlab源码 1993期】

    一.心电信号简介 0 引言 心电信号是人类最早研究的生物信号之一, 相比其他生物信号更易于检测, 且具有直观的规律.心电图的准确分析对心脏病的及早治疗有重大的意义.人体是一个复杂精密的系统, 有许多不 ...

  6. 根据心电信号计算心率的matlab代码

    先说说现有的资料: [1][2]弄了FIR1还有hamming窗,搞得老麻烦了,扔一边先. --------------------------------------------------自己另外 ...

  7. matlab心电信号处理,基于Matlab的心电信号自动处理系统的设计与开发 毕业论文设计.doc...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspmatlab 基于Matlab的心电信号自动处理系统的设计与开发 ...

  8. 【C4】基于深度学习的心电信号分析

    ★★★ 本文源自AI Studio社区精品项目,[点击此处]查看更多精品内容 >>> 基于深度学习的心电信号分析 一.项目背景 近年来,随着人工智能和算法的发展,以机器学习和深度学习 ...

  9. 基于matlab模拟心电信号,附赠代码

    matlab官方链接:https://www.mathworks.com/matlabcentral/fileexchange/10858-ecg-simulation-using-matlab 心电 ...

最新文章

  1. silverlight实现2D人物动画
  2. 敏捷开发_全面解析瀑布式开发和敏捷式开发
  3. 信息系统项目管理师:第4章:项目整体管理与变更管理(3)
  4. 为什么Netty这么火?与Mina相比有什么优势?
  5. OpenStack Nova核心组件和RabbitMQ通信流程分析
  6. 《Go语言程序设计》读书笔记(七)基于共享变量的并发
  7. mysql新增列并同时增加数据_图解MySQL | 「原理解析」 MySQL 为表添加列 是怎么立刻完成的...
  8. 解决问题 xcrun: error: invalid active developer path
  9. MFileServer管理员用户名密码配置
  10. ECS Linux 服务器解除ssh登陆后被锁定或暂停输入输出的终端
  11. Kinect2.0 vs2013的配置
  12. createdroptargets_拖拽神器React DnD你真的了解了吗?
  13. webUploader大文件断点续传学习心得 多文件
  14. 去NM的OKR,大坑,得把人逼疯!
  15. html 调用es2015模块,在浏览器中懒加载ES2015模块
  16. NGUI动态字体教程
  17. 读论文 Automatic generation and detection of highly reliable fiducial markersnunder occlusion
  18. google map for Android
  19. 开启cdn后导致websocket10秒直接断开连接 报错1006
  20. 启动项目报错 Failed to bind properties under

热门文章

  1. 派对屋3000效果器怎样调试_前级效果器的调试方法
  2. linux强制卸载光盘,linux如何挂载光盘linux卸载光盘的方法
  3. 设计药品medicine 类 —— 代码篇
  4. 【AUTOSAR】【Lin通信】Lin
  5. gcc编译error adding symbols错误
  6. FPGA零基础学习:在FPGA中,同步信号、异步信号和亚稳态的理解
  7. 关于“打开数据库时出错: 用户 ‘sa‘ 登录失败。”的解决方法
  8. 【钉钉-场景化能力包】如何设计一款OKR酷应用
  9. 如何让matlab全速运行,提高matlab代码运行效率
  10. Windows下 OpenAcs测试平台搭建