function [QQ,SS,RR,T,P,pup,pdown,tdown,xd]=locationP_QRS_T(signal)
% -------------- 信号降噪去毛刺
wname='sym6';lev=5;
[c,l]=wavedec(signal,lev,wname);
sigma=wnoisest(c,l,1);
alpha=2;
thr=wbmpen(c,l,sigma,alpha);
keepapp=1;
xd=wdencmp('gbl',c,l,wname,lev,thr,'s',keepapp);
% figure(1)
% subplot(211);plot(signal);xlabel('原始信号 ');
% hold on
% subplot(212);plot(xd);xlabel('去除毛刺信号 ');
%--------------------
x1=xd;
L=length(x1);
[c,l]=wavedec(x1,8,'db6');
d8=wrcoef('d',c,l,'db6',8);
d7=wrcoef('d',c,l,'db6',7);
d6=wrcoef('d',c,l,'db6',6);
d5=wrcoef('d',c,l,'db6',5);
d4=wrcoef('d',c,l,'db6',4);
d3=wrcoef('d',c,l,'db6',3);
d2=wrcoef('d',c,l,'db6',2);
d1=wrcoef('d',c,l,'db6',1);
y=d1+d2+d3+d4;
% figure()
% subplot(211);plot(xd);xlabel('去除毛刺信号 ');
% hold on
% subplot(212);plot(y);xlabel('重构信号 ');
y1=zeros(1,L);
for i=1:L
if y(i)>=0
y1(i)=y(i);
end
end
may=max(y1);%不考虑不正常的幅值太大的R峰,以免干扰阈值的选取
for i=1:200
n=find(y1>may);
if size(n,2)>20
break
else may=may*0.9;
end
end
for i=1:L
if y1(i)>=may
y1(i)=may;
end
end
% Th=may*0.4;
y_std=std(y1);
y_mean=mean(y1);
if y_std>0.1
Th=y_std*3+y_mean;
dianshu=50;
else Th=y_std*3.3+y_mean;
dianshu=70;
end
t=Th*ones(1,L);
% figure
% subplot(2,1,1);
% plot(y1);
% subplot(2,1,2)
% plot(y1);
% hold on
% plot(t,'m','linewidth',3);
% xlabel('(b)The location signal')
% legend('the location signal','threshold')
k=1;
i=10;
while(i<L-26)
if y1(i)>Th
m=0;
r=1;
for n=0:25
if m<y1(i+n)
m=y1(i+n);
r=i+n;
end
end
if r~=1
R(k)=r;
k=k+1;
i=i+dianshu;
else i=i+1;
end
else i=i+1;
end
end
b=length(R);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
inter=diff(R);%当r间隔小于90时,认为是噪声引起的,把此时的R波描点去掉
for i=1:b-1
if inter(i)<90
for j=i+1:b-3
if inter(j)>90&&inter(j+1)>90&&inter(j+2)>90
break
end
end
if i-2>0
for g=i:j
R(g)=0;
end
else R(1)=0;R(2)=0;
end
end
end
k=1;
for i=1:b
if R(i)~=0;
R1(k)=R(i);
k=k+1;
end
end
rb=length(R1);
% subplot(3,1,3);
% plot(x1);
% for i=1:rb
% xx=R1(i);
% hold on
% plot(xx,x1(xx),'m.','Markersize',20);
% end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%检测Q,S波
%用拐点来检测
k1=1;
for i=1:rb
if i==1
scal=2;
else scal=R1(i)-40;
end
flag=1;
for j=R1(i)-5:-1:scal
if x1(j)<=x1(j-1)&&x1(j)<=x1(j+1)
flag=0;
end
if flag==0
break;
end
end
Q(k1)=j;
k1=k1+1;
end
b1=length(Q);
for i=1:b1
xx=Q(i);
hold on
plot(xx,x1(xx),'r.','Markersize',20);
end
k2=1;
for i=1:rb
scal=R1(i)+40;
flag=1;
for j=R1(i)+1:scal
if x1(j)<=x1(j-1)&&x1(j)<=x1(j+1)
flag=0;
end
if flag==0
break;
end
end
S(k2)=j;
k2=k2+1;
end
b2=length(S);
for i=1:b2
xx=S(i);
hold on
plot(xx,x1(xx),'g.','Markersize',20);
end
title('(c)The location of QRS')
%检测P波
k3=1;
for i=1:b1
n=Q(i);cc=-100;
for kk=1:40
if n-kk==0
n1=kk-1;
break
else n1=40;
end
end
p=1;
for j=n-5:-1:n-n1
if cc<x1(j);
cc=x1(j);
p=j;
end
end
if p~=1
P(k3)=p;
k3=k3+1;
end
end
b3=length(P);
k4=1;
for i=1:b2
n=S(i);cc=-100;
for kk=1:55
if n+kk==L
n1=kk;
break
else n1=55;
end
end
t=1;
for j=n+10:n+n1
if cc<x1(j);
cc=x1(j);
t=j;
end
end
if t~=1
T(k4)=t;
k4=k4+1;
end
end
b4=length(T);
for i=1:b4
xx=T(i);
hold on
plot(xx,x1(xx),'m.','Markersize',20);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%截取数据前后端
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for kk=1:15
if P(1)-kk==0
nn=kk-1;
break
else nn=15;
end
end
n1=P(1)-nn;
n2=P(b3)-10;
j=1;
for i=n1:n2
x2(j)=x1(i);
j=j+1;
end
LL=length(x2);
k=1;
for i=1:rb
if R1(i)-n1+1>0
RR(k)=R1(i)-n1+1;
k=k+1;
end
end
r=length(RR);
if RR(r)>LL
R2=RR(1:r-2);
end
clear RR
RR=R2;
aa=length(RR);
subplot(2,1,2)
plot(x2);
for i=1:aa
xx=RR(i);
hold on
plot(xx,x2(xx),'m.','Markersize',20);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%重新定位Q,S,P波
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
k=1;
for i=1:b1
if Q(i)-n1+1>0
QQ(k)=Q(i)-n1+1;
k=k+1;
end
end
q=length(QQ);
if QQ(q)>LL
Q2=QQ(1:q-2);
end
clear QQ
QQ=Q2;
aa1=length(QQ);
for i=1:aa1
xx=QQ(i);
hold on
plot(xx,x2(xx),'y.','Markersize',20);
end
k=1;
for i=1:b2
if S(i)-n1+1>0
SS(k)=S(i)-n1+1;
k=k+1;
end
end
s=length(SS);
if SS(s)>LL
S2=SS(1:s-2);
end
clear SS;
SS=S2;
aa2=length(SS);
for i=1:aa2
xx=SS(i);
hold on
plot(xx,x2(xx),'r.','Markersize',20);
end
k=1;
for i=1:b3
if P(i)-n1+1>0
PP(k)=P(i)-n1+1;
k=k+1;
end
end
p=length(PP);
if PP(p)>LL
P2=PP(1:p-2);
end
clear PP
PP=P2;
aa3=length(PP);
for i=1:aa3
xx=PP(i);
hold on
plot(xx,x2(xx),'g.','Markersize',20);
end
k=1;
for i=1:b4
if T(i)-n1+1>0
TT(k)=T(i)-n1+1;
k=k+1;
end
end
t=length(TT);
if TT(t)>LL
TT=TT(1:t-1);
end
aa4=length(TT);
for i=1:aa4
xx=TT(i);
hold on
plot(xx,x2(xx),'b.','Markersize',20);
end
%平滑去噪
note=zeros(1,LL);
for i=1:aa
for j=QQ(i):SS(i)+10
note(j)=1;
end
end
for kk=1:3
for i=2:LL-1
if note(i)~=1
x2(i)=(x2(i+1)+x2(i-1))/2;
end
end
end
%%%%%%%%%%%%%%检测T波
k4=1;
for i=1:aa
for i=1:aa
xx=SS(i);
hold on
plot(xx,x2(xx),'r.');
end
n=SS(i);cc=-100;
for kk=1:55
if n+kk==LL
n1=kk;
break
else n1=55;
end
end
t=1;
for j=n+20:n+n1
if cc<x2(j);
cc=x2(j);
t=j;
end
end
if t~=1
T(k4)=t;
k4=k4+1;
end
end
yyy=length(T);
if T(yyy)==LL
QQ
clear P
end
%检测P波
k3=1;
for i=1:aa
n=QQ(i);cc=-100;
for kk=1:25
if n-kk==0
n1=kk-1;
break
else n1=25;
end
end
p=1;
for j=n-5:-1:n-n1
if cc<x2(j);
cc=x2(j);
p=j;
end
end
P(k3)=p;
k3=k3+1;
end
yyy=length(T);
clear R1
if T(yyy)==LL
S1=SS(1:yyy-1)
Q1=QQ(1:yyy-1);
R1=RR(1:yyy-1);
P1=P(1:yyy-1);
T1=T(1:yyy-1);
clear SS QQ RR P T
SS=S1;
QQ=Q1;
RR=R1;
P=P1;
T=T1;
end
figure()
plot(x2)
for i=1:aa-1
xx=P(i);
hold on
plot(xx,x2(xx),'y.','Markersize',15);
end
pause
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%检验T波的下降沿
k5=1;
for i=1:length(T)
n=T(i);cc=10;
for kk=0:40
if n+kk==LL
n1=kk;
break
else
n1=40;
end
end
t=1;
for j=n+5:n+n1
if cc>x2(j);
cc=x2(j);
t=j;
end
end
if t~=1
tdown(k5)=t;
k5=k5+1;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%检验P波的上升沿和下降沿
%上升沿
k=1;
for i=1:length(T)
if i==1
基于小波变换的方法识别ECG信号的中的PT波程序
3星 · 超过75%的资源 需积分: 48 65 浏览量
2019-03-17
10:05:05
上传
评论 6
收藏 24KB RAR 举报
润语无声
- 粉丝: 18
- 资源: 1