一维信号去噪:提升小波阈值去噪


小波变换是现在研究的比较多的时(空)频域分析理论,离散的小波变换(DWT)的快速算法时最近研究的热点.Swelden提出的一种不依赖于傅立叶变换
的新的小波构造方案-----lifting scheme,其复杂度只有原来卷积方法的一半左右,因此成为计算离散小波变换的主流方法.
      其实lifting scheme就是为了构造第二代小波,使得不像第一代小波那样构造,非常依赖Fourier变换.同时已经证明了提升方式可以实现所有的第一代小波变换.
      提升方式的特点:
1. 继承了第一代小波的多分辨率的特性
2. 不依赖傅立叶变换
3.不占用系统内存
4.反变换很容易从正变换得到,只是改变了数据流的方向和正负号


本文是基于matlab实现的一维信号的提升小波去噪算法实现。

实现步骤:1.用小波提升方案lifting scheme提升小波;

                  2.对该小波进行多层小波分解;

                  3.对每层的高频系数进行阈值设定,进行消噪处理;

                  4.一层一层地进行小波重构,得到消噪后的信号。


阈值设置:阈值公式:

:每层小波高频系数绝对值按照从小到大顺序排列后的中值/0.6745;

N:每层小波高频系数长度值;

说明:1.该阈值公式是Donoho发明的,经过证明后发现噪声的最大限度在很高的概率上是低于Thr()阈值的,所以可以用该阈值公式得到的阈值来区别噪 声和信号分量,将二者分离,得到去噪后信号。

2.Thr()这个阈值不是最佳的阈值,而是最佳阈值上限,我们在设置时可以自由设置每层阈值(根据信号特点)。


去噪方法:

这里介绍软阈值和硬阈值去噪算法,一般硬阈值去噪比软阈值去噪所得信号去噪效果更粗糙。

小波阈值去噪的具体处理过程:选择一个小波并确定分解层数,然后将含噪信号在各尺度上进行小波分解,保留大尺度低分辨率下的全部小波系数;

对于各尺度高分辨率下的小波系数,可以设定一个阈值,幅值低于该阈值的小波系数置为0,高于该阈值的小波系数或者完整保留,或者作相应的“收缩(shrinkage)”;

最后将处理后获得的小波系数利用逆小波变换进行重构,恢复出有效的信号。


一维信号去噪:提升小波阈值去噪_第1张图片


为阈值,

f(x)为经阈值处理后的高频系数,

x为高频小波系数,







MATLAB程序:

%(程序非原创,只做理解)

%软阈值去噪

%提升小波分解
nx=b1;%一维含噪信号
lsdb4=liftwave('db4');%采用db4小波,得到相应提升方案
els={'p',[-0.125,0.125],0};
lsnew=addlift(lsdb4,els);%添加els到提升方案
xDEC=lwt(nx,lsnew,3);%用lsnew提升小波对信号做3层小波分解
ca1=lwtcoef('ca',xDEC,lsnew,3,1);%ca1、ca2、ca3为小波分解低频系数
ca2=lwtcoef('ca',xDEC,lsnew,3,2);
ca3=lwtcoef('ca',xDEC,lsnew,3,3);
cd1=lwtcoef('cd',xDEC,lsnew,3,1);%cd1、cd2、cd3为小波分解高频系数
cd2=lwtcoef('cd',xDEC,lsnew,3,2);
cd3=lwtcoef('cd',xDEC,lsnew,3,3);
%第一层小波阈值设置
len=length(cd1);%得到一层小波高频系数长度
w=sort(abs(cd1));%对cd1从小至大进行排序

%找cd1系数中值
if rem(len,2)==1%rem函数功能:求余数;判断len/2余数是否为1,确定cd1长度是奇是偶
    v=w((len+1)/2);%长度为奇,取cd1系数中间值
else
    v=(w(len/2)+w(len/2+1))/2;%长度为偶,取中间两个值求平均
end
sigma1=abs(v)/0.6745;%求sigma1
Thr1=sigma1*(2*log(len))^(1/2);%求阈值Thr1

%软阈值处理系数
for ii=1:length(cd1)%for循环
    if(abs(cd1(ii))<=Thr1)%系数绝对值小于阈值,置0
        cd1(ii)=0;
    else if(cd1(ii)>Thr1)%系数绝对值大于阈值
            cd1(ii)=(cd1(ii)-Thr1);%软阈值公式,对绝对值和sgn函数处理后得
        else
            cd1(ii)=(cd1(ii)+Thr1);
        end
    end
end
%第二层小波阈值设置      
len=length(cd2);
w=sort(abs(cd2));
if rem(len,2)==1
    v=w((len+1)/2);
else
    v=(w(len/2)+w(len/2+1))/2;
end
sigma1=abs(v)/0.6745;
Thr1=1/2*sigma1*(2*log(len))^(1/2);
for ii=1:length(cd2)
    if(abs(cd2(ii))<=Thr1)
        cd2(ii)=0;
    else if(cd2(ii)>Thr1)
            cd2(ii)=cd2(ii)-Thr1;
        else
            cd2(ii)=cd2(ii)+Thr1;
        end
    end
end
%第三层小波阈值设置
len=length(cd3);
w=sort(abs(cd3));
if rem(len,2)==1
    v=w((len+1)/2);
else
    v=(w(len/2)+w(len/2+1))/2;
end
sigma1=abs(v)/0.6745;
Thr1=2/3*sigma1*(2*log(len))^(1/2);
for ii=1:length(cd3)
    if(abs(cd3(ii))<=Thr1)
        cd3(ii)=0;
    else if(cd3(ii)>Thr1)
            cd3(ii)=cd3(ii)-Thr1;
        else
            cd3(ii)=cd3(ii)+Thr1;
        end
    end
end
%小波重建
rec1=ilwt(ca3,cd3,lsnew);%对小波系数进行一层一层重构
rec2=ilwt(rec1,cd2,lsnew);
rec3=ilwt(rec2,cd1,lsnew);%rec3为去噪后信号

figure(6);
subplot(2,1,2);
plot(rec3);
title('提升小波软阈值消噪后的信号');grid on;





%硬阈值去噪

更改程序片段为:(每层小波阈值设置时都要更改为下面片段)

for ii=1:length(cd1)
    if(abs(cd1(ii))>=Thr1)
        cd1(ii)=cd1(ii);
    else
        cd1(ii)=0;
    end
end



你可能感兴趣的:(一维信号去噪:提升小波阈值去噪)