level=4; sr=360; ecg_i=DenoisingSignal'; swa=zeros(4,points);%存储近似信息 swd=zeros(4,points);%存储细节信息 %计算近似系数和细节系数 %低通滤波器 1/4 3/4 3/4 1/4 %高通滤波器 -1/4 -3/4 3/4 1/4 %二进样条小波 for i=1:points-3 swa(1,i+3)=1/4*ecg_i(i+3-2^0*0)+3/4*ecg_i(i+3-2^0*1)+3/4*ecg_i(i+3-2^0*2)+1/4*ecg_i(i+3-2^0*3); swd(1,i+3)=-1/4*ecg_i(i+3-2^0*0)-3/4*ecg_i(i+3-2^0*1)+3/4*ecg_i(i+3-2^0*2)+1/4*ecg_i(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 %*********************求正负极大值对**********************% 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); %斜率小于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; interva2=zeros(1,points); intervaqs=zeros(1,points); Mj1=wpeak(1,:); Mj3=wpeak(3,:); Mj4=wpeak(4,:); %使用Mj3 3 层细节系数判断R 波 posi=Mj3.*(Mj3>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=Mj3.*(Mj3<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*(nega1)&&( markq< 3) if Mj1(kqs)~=0 markq=markq+1; end kqs= kqs -1; end countQ(kqs)=-1; %求出QRS 波终点 kqs=mark3;%-10 marks=0; while (kqsecg_i(R(i-1)) countR(R(i-1))=0; else countR(R(i))=0; end end end end num1=2; while(num1>0) num1=num1-1; R=find(countR); 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*(adjustnega0); %求正极大值的平均 Mj4thposi=(max(Mj4posi(1:round(points/4)))+max(Mj4posi(round(points/4):2*round(points/4)))+max(Mj4posi(2*round(points/4):3*round(points/4)))+max(Mj4posi(3*round(points/4):4*round(points/4))))/4; Mj4posi=(Mj4posi>Mj4thposi/3); Mj4nega=Mj4.*(Mj4<0); %求负极大值的平均 Mj4thnega=(min(Mj4nega(1:round(points/4)))+min(Mj4nega(round(points/4):2*round(points/4)))+min(Mj4nega(2*round(points/4):3*round(points/4)))+min(Mj4nega(3*round(points/4):4*round(points/4))))/4; Mj4nega=-1*(Mj4nega0); %windowthposi=(max(Mj4(windowBegin:windowBegin+windowSize/2))+max(Mj4(windowBegin+windowSize/2+1:windowEnd)))/2; [windowMax,maxindex]=max(Mj4(windowBegin:windowEnd)); [windowMin,minindex]=min(Mj4(windowBegin:windowEnd)); if minindex < maxindex &&((maxindex-minindex)0.01&&windowMin<-0.1 flag=1; mark4=round((maxindex+minindex)/2+windowBegin); countPMj4(mark4)=1; countP(mark4-20)=1; countPbegin(windowBegin+minindex-20)=-1; countPend(windowBegin+maxindex-20)=-1; end if flag==1 break; end end if mark4==0&&flag==0 %假设没有P 波,在R 波左间隔1/3 处赋值-1 mark4=round(Rlocated(i)-RRinteral/3); countP(mark4-20)=-1; end end %plot(countPMj4,'g'); %********************T 波检測********************% clear windowBegin windowEnd maxindex minindex windowMax windowMin mark4 RRinteral; windowSizeQ=60; for i=1:length(Rlocated)-1; flag=0; mark5=0; RRinteral=Rlocated(i+1)-Rlocated(i); for j=1:5:(RRinteral*2/3) % windowBegin=Rlocated(i)+30+j; windowBegin=Slocated(i)+j; windowEnd =windowBegin+windowSizeQ; if windowEnd >Rlocated(i+1)-RRinteral/4 break; end %%%%%求窗体内的极大极小值 [windowMax,maxindex]=max(Mj4(windowBegin:windowEnd)); [windowMin,minindex]=min(Mj4(windowBegin:windowEnd)); if minindex < maxindex &&((maxindex-minindex)0.1&&windowMin<-0.1 flag=1; mark5=round((maxindex+minindex)/2+windowBegin); countTMj4(mark5)=1; countT(mark5-20)=1;%找到T 波峰值点 %%%%%确定T 波起始点和终点 countTbegin(windowBegin+minindex-20)=-1; countTend(windowBegin+maxindex-20)=-1; end if flag==1 break; end end if mark5==0 %假设没有T 波。在R 波右 间隔1/3 处赋值-2 mark5=round(Rlocated(i)+ RRinteral/3); countT(mark5)=-2; end end %plot(countTMj4,'g'); %hold off; figure(4); plot(ecg_i(0*points+1:1*points)),grid on,axis tight,axis([1,points,-2,5]); title('ECG 信号的各波波段检测'); hold on plot(countR,'r'); plot(countQ,'k'); plot(countS,'k'); for i=1:Rnum if R_result(i)==0; break end plot(R_result(i),ecg_i(R_result(i)),'bo','MarkerSize',10,'MarkerEdgeColor','g'); end plot(countP,'r'); plot(countT,'r'); plot(countPbegin,'k'); plot(countPend,'k'); plot(countTbegin,'k'); plot(countTend,'k'); hold off