jcsnwpu 发表于 2007-7-11 11:20

恳求小波域值法和空域相关法去噪重构信号的程序

恳求小波域值法和空域相关法去噪重构信号的程序,想好好研究一下小波在去噪降噪中的应用,请各位能多多帮助.

skating 发表于 2009-2-19 10:39

回复 楼主 jcsnwpu 的帖子

close all;
clc;
clear;
snr=5;
init=2055615866;
=wnoise(1,10,snr,init);
signal=x;
points=1024;level=5;wf='bior 1.5'; %sym8,bior 1.5
=wfilters(wf);
= swt(signal,level,Lo_D,Hi_D);%swd是细节系数,swa是近似系数
Swd_n=swd;
swd_org=swd;
mask_n=zeros(size(Swd_n)); %先把系数处理矩阵设置为全0。

for j=1:(level-1)
    %在1:(level-1)分解层次上对高频系数处理,最后一层无法求相关系数,所以不作处理。
    Noise_d1=swd_org(j,:);
    Noise_d1=Noise_d1(1:80);
    Noise_var=var(Noise_d1); %以信号的前80个只含有噪声的点估计噪声在各层的方差。
    Pw_var=var(swd_org(j,:));
    Corr=swd_org(j,:).*swd_org(j+1,:); %定义相关系数为相邻两层的乘积。
      
    cc=1.7; %_______用以设定停止迭代的 噪声能量阈值,需要根据情况调节。________%
    while Pw_var>cc*Noise_var
    Pw=sum(abs(swd(j,:)).^2); %计算小波能量
    Pcorr=sum(abs(Corr).^2); %计算相关系数能量
    Corr_new=Corr.*((Pw/Pcorr)^0.5); %归一化
   
    corr_mod=abs(Corr_new);
    w_mod=abs(swd(j,:));
    swd_n=swd(j,:).*(corr_mod>w_mod);%(corr_mod>w_mod)返回0或者1
    swd_n1=(swd_n~=0);
    mask_n(j,:)=mask_n(j,:)+swd_n1;%将选出的点赋给系数处理矩阵相应位置。
    swd_n0=ones(size(swd_n1));
    swd_n0=swd_n0-swd_n1;
   
    swd(j,:)=swd(j,:).*swd_n0; %将高频系数选出大值后的地方置0。
    Pw_var=var(swd(j,:));
    Corr_new=Corr_new.*swd_n0; %将相关系数选出大值后的地方置0。
    Corr=Corr_new;
    end
end
   
mask_max=ones(1,length(mask_n));
mask_n=; %最后一层系数处理矩阵全置1。
Swd_reg=swd_org.*mask_n;

signal_n=iswt(swa,Swd_reg,wf);
% S_mix=wden(signal_n,'sqtwolog','s','sln',5,'sym8'); %rigrsure;heursure;sqtwolog;minimaxi
xcrr=signal_n-xref; %求滤波误差信号。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%画图:
figure; %空域法处理后的高频系数。
subplot(level+1,1,1); plot(real(signal)); grid on;axis tight;
title('空域法处理后的高频系数');
for i=1:level
    subplot(level+1,1,i+1);
    plot(Swd_reg(i,:)); axis tight;grid on;
ylabel(strcat('j=   ',num2str(i)));
end

figure; %高频系数处理前后的比较。
for i=1:level
    subplot(level,2,2*(i)-1);
    plot(swd_org(i,:)); axis tight;grid on;
    ylabel(strcat('d   ',num2str(i)));
    subplot(level,2,2*(i));
    plot(Swd_reg(i,:)); axis tight;grid on;
    ylabel(strcat('j=   ',num2str(i)));
end

figure; %信号滤波前后比较。
subplot(3,1,1);
plot(signal); axis tight;grid on;
axis();
title('原始信号');
subplot(3,1,2);
plot(signal_n); axis tight;grid on;
axis();
title('空域法滤波后信号');
subplot(3,1,3);
plot(xcrr); axis tight;grid on;
axis();
title('滤波误差信号');

lzcc 发表于 2009-2-19 10:58

我只知道4种阈值小波去噪的方法,像启发式,极大极小等等(书上写的),请教楼上的,你的程序是什么阈值法,和那些相比有什么先进的地方?有什么联系?

skating 发表于 2009-2-21 11:10

回复 板凳 lzcc 的帖子

这不是阈值法,是于其并列的空域相关去噪。他们的去噪原理是不一样的。
空域相关滤波是基于小波系数尺度之间相关性原理。
比较适用于高信噪比信号

lj2tt 发表于 2009-2-26 18:33

谢谢楼主分享,先收了慢慢看:loveliness:

changzhengno.1 发表于 2009-3-21 09:29

首先十分感谢朋友的分享
本人也正在从事这个方面的研究
不过
看了该程序
还是有点不懂
诚然该程序对该信号的处理相当的好
但与原算法有很多相悖的地方
下面我就我迷惑的地方载入
希望朋友能不吝赐教
Pw_var=var(swd_org(j,:));
在判断条件时用剩余信号边缘的方差代替能量与原算法好象相悖
Noise_d1=Noise_d1(1:80);
    Noise_var=var(Noise_d1); %以信号的前80个只含有噪声的点估计噪声在各层的方差。
另外,各层能量阈值直接取前80个数据的方差
cc=1.7; 在各个尺度上取同一个值值得商讨

skating 发表于 2009-4-3 15:00

回复 6楼 changzhengno.1 的帖子

1。Pw_var=var(swd_org(j,:));
不是剩余信号,而是j层全部信号,用的就是方差来判断。
2。 Noise_d1=Noise_d1(1:80);
    Noise_var=var(Noise_d1); %以信号的前80个只含有噪声的点估计噪声在各层的方差。
这个是假定前80个点还没有信号,只有系统噪声信号,进行方差的估计。如果你能确定你的前900点都还没信号,也可以换成900。
3。 cc=1.7;
这个可以根据你信号的实际情况进行调整,我实际处理的信号用这个值也是偏大。
在空域相关的改进算法中对这个情况有介绍。

qiuyang957 发表于 2012-10-6 23:01

skating 发表于 2009-4-3 15:00 static/image/common/back.gif
1。Pw_var=var(swd_org(j,:));
不是剩余信号,而是j层全部信号,用的就是方差来判断。
2。 Noise_d1=Nois ...

你的程序写的很好!

我不明白的一点是孙延奎在相关去噪算法中判断停止迭代的条件是PW(j)<=(N-K)tao2
是用尺度小波能量和噪声方差的倍数相比较。

你的停止迭代条件是用尺度小波的方差与噪声方差的倍数相比较。

方差和能量是什么关系啊?用哪个条件判断好呢?
页: [1]
查看完整版本: 恳求小波域值法和空域相关法去噪重构信号的程序