% 用小波(包)对MitbihCmprTstExample_08730_01(软硬阈值)进行消噪与压缩
clear all;clc;close all;
disp('用小波(包)对MitbihCmprTstExample_08730_01(软硬阈值)进行消噪和压缩');
load MitbihCmprTstExample_08730_01.mat;
count=length(sig);
x=sig(:,1); y=sig(:,2); z=sig(:,3);
TS=x(2)-x(1); Freq=1/TS; % 心博周期和频率
% 画出原始信号
subplot(3,2,1),plot(y),title('原始信号'),grid;
%用db1小波对原始信号进行3层分解并提取系数
[c,l]=wavedec(y,3,'db1');
ca3=appcoef(c,l,'db1',3); % 1-D approximation coefficients一维近似系数
cd3=detcoef(c,l,3); %提取第3层细节系数;1-D detail coefficient
cd2=detcoef(c,l,2); %提取第2层细节系数
cd1=detcoef(c,l,1); %提取第1层细节系数
% 对信号进行强制去噪
cdd3=zeros(length(cd3),1);
cdd2=zeros(length(cd2),1);
cdd1=zeros(length(cd1),1);
c1=vertcat(ca3,cdd3,cdd2,cdd1); % 垂直方向的矩阵连接
y1=waverec(c1,l,'db1');
subplot(3,2,2),plot(y1),grid;
axis([0 5000 -1 1]);
title('强制去噪后的信号');
% 用默认阈值对信号进行去噪
[thr, sorh, keepapp] = ddencmp('den','wv',y);%获得信号的默认阈值
[y2,CXC,LXC,PERF0,PERFL2] =wdencmp('gbl',c,l,'db1',3,thr,sorh,keepapp);%---perf0=80.4
% y2=wdencmp('gbl',c,l,'db1',3,thr,sorh,keepapp);
subplot(3,2,3),plot(y2),grid;
axis([0 5000 -1 1]);
title('用默认阈值去噪后的信号');
% 用给定的软阈值进行去噪
cd1soft=wthresh(cd1,'s',1.465);
cd2soft=wthresh(cd2,'s',1.823);
cd3soft=wthresh(cd3,'s',2.768);
c2=vertcat(ca3,cd3soft,cd2soft,cd1soft);
y3=waverec(c2,l,'db1');
subplot(3,2,4),plot(y3),grid;
axis([0 5000 -1 1]);
title('用软阈值去噪后的信号');
% 用默认阈值对信号进行(小波)压缩
[thr_cmp,sorh_cmp,keepapp_cmp] = ddencmp('cmp','wv',y);
[y4,CXC_cmp,LXC_cmp,PERF0_cmp,PERFL2_cmp] = wdencmp('gbl',c,l,'db1',3,thr_cmp,sorh_cmp,keepapp_cmp);
%---PERF0_cmp=32.66
subplot(3,2,5),plot(y4),grid,axis([0 5000 -1 1]);
title('用默认阈值进行小波压缩');
%%
%用默认阈值对信号进行小波(包)压缩
% [thr_cmp2,sorh_cmp2,keepapp_cmp2,crit_cmp2] = ddencmp('cmp','wp',y);
% [y5,TREED_cmp2,PERF0_cmp2,PERFL2_cmp2] = ...
% wpdencmp(y,sorh_cmp2,3,'db1',crit_cmp2,thr_cmp2,keepapp_cmp2);
% %---PERF0_cmp2=37.62
% subplot(3,2,6),plot(y5),grid,axis([0 5000 -1 1]);
% title('用默认阈值进行小波包压缩');
% 这与采用默认阈值进行小波压缩效果非常接近