|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
仿照着《小波去噪中软硬阈值的一种改良折衷法》一文写的程序,对比了软、硬以及软硬阈值折衷法的信噪比及均方根误差。仿真出来之后,原信号的信噪比是负的,不知道为什么?均方根误差的值也比较大,不知何解?信噪比和均方根误差是参照《基于matlab的小波去噪仿真》:吴伟,《信息与电子工程》 一文写的。
不知道此程序有没有问题,望高手给予指正!!
close all;
clc;
clear;
format short g;
Fs=50*128;
N=1024;
n=[0:1:N-1];
A= [220 2 15 9];
Ph=[20 60 45 80 ];
ff=[50 100 150 250];
Num=length(A);
y=zeros(1,length(n));
for i=1:Num
myt=A(i)*cos(2*pi*ff(i)*n./Fs+Ph(i)*pi/180);
y=y+myt;%%构造原始信号
end
figure(1);
subplot(511);
plot(y);
ylabel('幅值 A');
title('原始信号');
s=awgn(y,20,'measured');%加入高斯白噪声
subplot(512);
plot(s);
ylabel('幅值 A');
title('加噪信号');
wname='db3';%选db3小波基
lev=5;%5层分解
[c,l]=wavedec(s,lev,wname);
a5=appcoef(c,l,wname,lev);
d5=detcoef(c,l,5);
d4=detcoef(c,l,4);
d3=detcoef(c,l,3);
d2=detcoef(c,l,2);
d1=detcoef(c,l,1);
a=8500;%%%
b=13;%%%%a和b两值是根据《小波去噪中软硬阈值的一种改良折衷法》一文给出的
cD=[d1,d2,d3,d4,d5];
sigma=median(abs(cD))/0.6475;
%-----------软阈值处理--------------------------
thr1=(sigma*sqrt(2*(log10(N))))/(log10(2));
cD1=wthresh(d1,'s',thr1);
thr2=(sigma*sqrt(2*(log10(N))))/(log10(3));
cD2=wthresh(d2,'s',thr2);
thr3=(sigma*sqrt(2*(log10(N))))/(log10(4));
cD3=wthresh(d3,'s',thr3);
thr4=(sigma*sqrt(2*(log10(N))))/(log10(5));
cD4=wthresh(d4,'s',thr4);
thr5=(sigma*sqrt(2*(log10(N))))/(log10(6));
cD5=wthresh(d5,'s',thr5);
cd=[a5,cD5,cD4,cD3,cD2,cD1];
c=cd;
ys=waverec(c,l,wname);
subplot(513)
plot(ys);
title('软阈值处理');
%---------硬阈值处理-------------------------
thr1=(sigma*sqrt(2*(log10(N))))/(log10(2));
cD1=wthresh(d1,'h',thr1);
thr2=(sigma*sqrt(2*(log10(N))))/(log10(3));
cD2=wthresh(d2,'h',thr2);
thr3=(sigma*sqrt(2*(log10(N))))/(log10(4));
cD3=wthresh(d3,'h',thr3);
thr4=(sigma*sqrt(2*(log10(N))))/(log10(5));
cD4=wthresh(d4,'h',thr4);
thr5=(sigma*sqrt(2*(log10(N))))/(log10(6));
cD5=wthresh(d5,'h',thr5);
cd=[a5,cD5,cD4,cD3,cD2,cD1];
c=cd;
yh=waverec(c,l,wname);
subplot(514)
plot(yh);
title('硬阈值处理');
%%%%根据《小波去噪中软硬阈值的一种改良折衷法》一文来写程序 作者为:郭晓霞,杨惠中《智能系统学报》
thr1=(sigma*sqrt(2*(log10(length(d1)))))/(log10(1+1));
for i=1:length(d1)
if(abs(d1(i))>=thr1)
cD1(i)=sign(d1(i))*(abs(d1(i))-b*thr1/(a^(abs(abs(d1(i))-thr1))+b-1));%估计第一层小波系数
else
cD1(i)=0;
end
end
thr2=(sigma*sqrt(2*(log10(length(d2)))))/(log10(2+1));
for i=1:length(d2)
if(abs(d2(i))>=thr2)
cD2(i)=sign(d2(i))*(abs(d2(i))-b*thr2/(a^(abs(abs(d2(i))-thr2))+b-1));%估计第二层小波系数
else
cD2(i)=0;
end
end
thr3=(sigma*sqrt(2*(log10(length(d3)))))/(log10(3+1));
for i=1:length(d3)
if(abs(d3(i))>=thr3)
cD3(i)=sign(d3(i))*(abs(d3(i))-b*thr3/(a^(abs(abs(d3(i))-thr3))+b-1));%估计第三层小波系数
else
cD3(i)=0;
end
end
thr4=(sigma*sqrt(2*(log10(length(d4)))))/(log10(4+1));
for i=1:length(d4)
if(abs(d4(i))>=thr4)
cD4(i)=sign(d4(i))*(abs(d4(i))-b*thr4/(a^(abs(abs(d4(i))-thr4))+b-1));%估计第四层小波系数
else
cD4(i)=0;
end
end
thr5=(sigma*sqrt(2*(log10(length(d5)))))/(log10(5+1));
for i=1:length(d5)
if(abs(d5(i))>=thr5)
cD5(i)=sign(d5(i))*(abs(d5(i))-b*thr5/(a^(abs(abs(d5(i))-thr5))+b-1));%估计第五层小波系数
else
cD5(i)=0;
end
end
%%%%开始重构
cd=[a5,cD5,cD4,cD3,cD2,cD1];
c=cd;
yhs=waverec(cd,l,wname);
subplot(515);
plot(ys,'LineWidth',1);
ylabel('幅值 A')
title('软硬阈值折衷去噪');
y1=sum(s.^2);
yxn=sum((s-y).^2);%
yys=sum((s-ys).^2);
yyh=sum((s-yh).^2);
yyhs=sum((s-yhs).^2);
snrxn=10*log10((y1/yxn));%原加噪信号信噪比
fprintf('原加噪信号信噪比%4.4f\n',snrxn);
snrys=10*log10((y1/yys));%软阈值去噪信号信噪比
fprintf('软阈值去噪信号信噪比%4.4f\n',snrys);
snryh=10*log10((y1/yyh));%硬阈值去噪信号信噪比
fprintf('硬阈值去噪信号信噪比%4.4f\n',snryh);
snrys=10*log10((y1/yyhs));%软硬阈值处理后的信噪比
fprintf('软硬阈值处理后的信噪比%4.4f\n',snrys);
REMxn=sqrt(yxn/N);%原加噪信号均方差
fprintf('原加噪信号均方差%4.4f\n',REMxn);
REMys=sqrt(yys/N);%软阈值去噪信号均方差
fprintf('软阈值去噪信号均方差%4.4f\n',REMys);
REMyh=sqrt(yyh/N);%硬阈值去噪信号均方差
fprintf('硬阈值去噪信号均方差%4.4f\n',REMyh);
REMys=sqrt(yyhs/N);%软硬阈值处理后均方根误差
fprintf('软硬阈值处理后均方根误差%4.4f\n',REMys);
[ 本帖最后由 dsfire 于 2010-3-10 21:12 编辑 ] |
|