%本程序实现基于小波变换的QRS波的检测 %
%
clear all;
close all;
points=4096; level=4; sr=360;
%读入ECG信号
load ecgdata.mat;
ecgdata=mydata';
plot(ecgdata(1:points));grid on;axis tight;axis([1,points,-2,5]);
title('ECG信号');
swa=zeros(4,points);
swd=zeros(4,points);
signal=ecgdata(0*4096+1:1*4096);
%算小波系数和尺度系数
for i=1:points-3
swa(1,i+3)=1/4*signal(i+3-2^0*0)+3/4*signal(i+3-2^0*1)+3/4*signal(i+3-2^0*2)+1/4*signal(i+3-2^0*3);
swd(1,i+3)=-1/4*signal(i+3-2^0*0)-3/4*signal(i+3-2^0*1)+3/4*signal(i+3-2^0*2)+1/4*signal(i+3-2^0*3);
end
j=2;
while j<=level
for i=1:points-24
swa(j,i+24)=1/4*swa(j-1,i+24-2^(j-1)*0)+3/4*swa(j-1,i+24-2^(j-1)*1)+3/4*swa(j-1,i+24-2^(j-1)*2)+1/4*swa(j-1,i+24-2^(j-1)*3);
swd(j,i+24)=-1/4*swa(j-1,i+24-2^(j-1)*0)-3/4*swa(j-1,i+24-2^(j-1)*1)+3/4*swa(j-1,i+24-2^(j-1)*2)+1/4*swa(j-1,i+24-2^(j-1)*3);
end
j=j+1;
end
%画出原信号和尺度系数,小波系数
figure;
subplot(level,1,1); plot(ecgdata(1:points)); grid on;axis tight;
title('ECG信号及其在j=1,2,3,4尺度下的尺度系数及小波系数');
for i=1:level
subplot(level+1,2,2*(i)+1);
plot(swa(i,:)); axis tight;grid on;xlabel('time');
ylabel(strcat('a ',num2str(i)));
subplot(level+1,2,2*(i)+2);
plot(swd(i,:)); axis tight;grid on;
ylabel(strcat('d ',num2str(i)));
end
%画出原图及小波系数
figure;
subplot(level,1,1); plot(real(ecgdata(1:points)),'b'); grid on;axis tight;
title('ECG信号及其在j=1,2,3,4尺度下的小波系数');
for i=1:level
subplot(level+1,1,i+1);
plot(swd(i,:),'b'); axis tight;grid on;
ylabel(strcat('d ',num2str(i)));
end
%**************************************求正负极大值对*****************************************%
ddw=zeros(size(swd));
pddw=ddw;
nddw=ddw;
%小波系数的大于0的点
posw=swd.*(swd>0);
%斜率大于0
pdw=((posw(:,1:points-1)-posw(:,2:points))<0);
%正极大值点
pddw(:,2:points-1)=((pdw(:,1:points-2)-pdw(:,2:points-1))>0);
%小波系数小于0的点
negw=swd.*(swd<0);
ndw=((negw(:,1:points-1)-negw(:,2:points))>0);
%负极大值点
nddw(:,2:points-1)=((ndw(:,1:points-2)-ndw(:,2:points-1))>0);
%或运算
ddw=pddw|nddw;
ddw(:,1)=1;
ddw(:,points)=1;
%求出极值点的值,其他点置0
wpeak=ddw.*swd;
wpeak(:,1)=wpeak(:,1)+1e-10;
wpeak(:,points)=wpeak(:,points)+1e-10;
%画出各尺度下极值点
figure;
for i=1:level
subplot(level,1,i);
plot(wpeak(i,:)); axis tight;grid on;
ylabel(strcat('j= ',num2str(i)));
end
subplot(4,1,1); %不能缺少,指的是第一幅图上写下面的title
title('ECG信号在j=1,2,3,4尺度下的小波系数的模极大值点');
interva2=zeros(1,points);
intervaqs=zeros(1,points);
Mj1=wpeak(1,:);
Mj4=wpeak(3,:);
%画出尺度3极值点
figure;
plot (Mj4);
title('尺度3下小波系数的模极大值点');
posi=Mj4.*(Mj4>0);
%求正极大值的平均
thposi=(max(posi(1:round(points/4)))+max(posi(round(points/4):2*round(points/4)))+max(posi(2*round(points/4):3*round(points/4)))+max(posi(3*round(points/4):4*round(points/4))))/4;
posi=(posi>thposi/3);
nega=Mj4.*(Mj4<0);
%求负极大值的平均
thnega=(min(nega(1:round(points/4)))+min(nega(round(points/4):2*round(points/4)))+min(nega(2*round(points/4):3*round(points/4)))+min(nega(3*round(points/4):4*round(points/4))))/4;
nega=-1*(nega<thnega/4);
%找出非0点
interva=posi+nega;
loca=find(interva);
for i=1:length(loca)-1
if abs(loca(i)-loca(i+1))<80
diff(i)=interva(loca(i))-interva(loca(i+1));
else
diff(i)=0;
end
end
%找出极值对
loca2=find(diff==-2);
%负极大值点
interva2(loca(loca2(1:length(loca2))))=interva(loca(loca2(1:length(loca2))));
%正极大值点
interva2(loca(loca2(1:length(loca2))+1))=interva(loca(loca2(1:length(loca2))+1));
intervaqs(1:points-10)=interva2(11:points);
count=zeros(1,1);
count2=zeros(1,1);
count3=zeros(1,1);
mark1=0;
mark2=0;
mark3=0;
i=1;
j=1;
Rnum=0;
%*************************求正负极值对过零,即R波峰值,并检测出QRS波起点及终点*******************%
while i<points
if interva2(i)==-1
mark1=i;
i=i+1;
while(i<points&interva2(i)==0)
i=i+1;
end
mark2=i;
%求极大值对的过零点
mark3= round((abs(Mj4(mark2))*mark1+mark2*abs(Mj4(mark1)))/(abs(Mj4(mark2))+abs(Mj4(mark1))));
%R波极大值点
R_result(j)=mark3-10;
count(mark3-10)=1;
%求出QRS波起点
kqs=mark3-10;
markq=0;
while (kqs>1)&&( markq< 3)
if Mj1(kqs)~=0
markq=markq+1;
end
kqs= kqs -1;
end
count2(kqs)=-1;
%求出QRS波终点
kqs=mark3-10;
marks=0;
while (kqs<points)&&( marks<2)
if Mj1(kqs)~=0
marks=marks+1;
end
kqs= kqs+1;
end
count3(kqs)=-1;
i=i+60;
j=j+1;
Rnum=Rnum+1;
end
i=i+1;
end
%************************删除多检点,补偿漏检点**************************%
num2=1;
while(num2~=0)
num2=0;
%j=3,过零点
R=find(count);
%过零点间隔
R_R=R(2:length(R))-R(1:length(R)-1);
RRmean=mean(R_R);
%当两个R波间隔小于0.4RRmean时,去掉值小的R波
for i=2:length(R)
if (R(i)-R(i-1))<=0.4*RRmean
num2=num2+1;
if signal(R(i))>signal(R(i-1))
count(R(i-1))=0;
else
count(R(i))=0;
end
end
end
end
num1=2;
while(num1>0)
num1=num1-1;
R=find(count);
R_R=R(2:length(R))-R(1:length(R)-1);
RRmean=mean(R_R);
%当发现R波间隔大于1.6RRmean时,减小阈值,在这一段检测R波
for i=2:length(R)
if (R(i)-R(i-1))>1.6*RRmean
Mjadjust=wpeak(4,R(i-1)+80:R(i)-80);
points2=(R(i)-80)-(R(i-1)+80)+1;
%求正极大值点
adjustposi=Mjadjust.*(Mjadjust>0);
adjustposi=(adjustposi>thposi/4);
%求负极大值点
adjustnega=Mjadjust.*(Mjadjust<0);
adjustnega=-1*(adjustnega<thnega/5);
%或运算
interva4=adjustposi+adjustnega;
%找出非0点
loca3=find(interva4);
diff2=interva4(loca3(1:length(loca3)-1))-interva4(loca3(2:length(loca3)));
%如果有极大值对,找出极大值对
loca4=find(diff2==-2);
interva3=zeros(points2,1)';
for j=1:length(loca4)
interva3(loca3(loca4(j)))=interva4(loca3(loca4(j)));
interva3(loca3(loca4(j)+1))=interva4(loca3(loca4(j)+1));
end
mark4=0;
mark5=0;
mark6=0;
while j<points2
if interva3(j)==-1;
mark4=j;
j=j+1;
while(j<points2&interva3(j)==0)
j=j+1;
end
mark5=j;
%求过零点
mark6= round((abs(Mjadjust(mark5))*mark4+mark5*abs(Mjadjust(mark4)))/(abs(Mjadjust(mark5))+abs(Mjadjust(mark4))));
count(R(i-1)+80+mark6-10)=1;
j=j+60;
end
j=j+1;
end
end
end
end
%画出原图及标出检测结果
figure;
plot(ecgdata(0*4096+1:1*4096)),grid on,axis tight,axis([1,points,-2,5]);
title('ECG信号的R波峰值及QRS波波段');
hold on
plot(count,'r');
plot(count2,'k');
plot(count3,'k');
for i=1:Rnum
if R_result(i)==0;
break
end
plot(R_result(i),ecgdata(R_result(i)),'bo','MarkerSize',10,'MarkerEdgeColor','g');
end
hold off
没有合适的资源?快使用搜索试试~ 我知道了~
【心电信号ECG】基于matlab小波变换心电信号R波检测【含Matlab源码 3592期】.zip
共13个文件
jpg:6个
m:2个
mat:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 181 浏览量
2023-12-07
10:05:45
上传
评论 1
收藏 1.3MB ZIP 举报
温馨提示
CSDN海神之光上传的代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测
资源推荐
资源详情
资源评论
收起资源包目录
【心电信号ECG】基于matlab小波变换心电信号R波检测【含Matlab源码 3592期】.zip (13个子文件)
【心电信号ECG】基于matlab小波变换心电信号R波检测【含Matlab源码 3592期】
运行结果1.jpg 29KB
运行结果6.jpg 34KB
运行结果5.jpg 32KB
100.dat 1.86MB
100.hea 143B
100.atr 4KB
rddata.m 5KB
ecgdata.mat 6KB
运行结果2.jpg 74KB
ecgdetect.m 7KB
运行结果4.jpg 58KB
graduatedemo.asv 6KB
运行结果3.jpg 70KB
共 13 条
- 1
资源评论
海神之光
- 粉丝: 3w+
- 资源: 2094
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- python-leetcode面试题解之第186题反转字符串中的单词II-题解.zip
- 一个基于python的web后端高性能开发框架,下载可用
- python-leetcode面试题解之第179题最大数-题解.zip
- python-leetcode面试题解之第170题两数之和III数据结构设计-题解.zip
- python-leetcode面试题解之第168题Excel表列名称-题解.zip
- python-leetcode面试题解之第167题两数之和II输入有序数组-题解.zip
- python-leetcode面试题解之第166题分数到小数-题解.zip
- python-leetcode面试题解之第165比较版本号-题解.zip
- python-leetcode面试题解之第163题缺失的区间-题解.zip
- python-leetcode面试题解之第162题寻找峰值-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功