一维信号小波阈值去噪

转载:http://blog.csdn.net/ebowtang/article/details/40481393


一,小波阈值去噪基本理论

      本博文根据小波的分解与重构原理,实现了基于硬阈值和软阈值函数的一维小波阈值去噪的C++版本,最终结果与matlab库函数运算结果完全一致。

1,小波阈值处理基本理论

小波阈值收缩法是Donoho和Johnstone在1995年提出的,以下便是养活不少学者的三篇基础论文,引得无数学者在此基础上优化,或者应用到自己的工程中然后发表相关的论文:

【1】 Donoho D L. De-noising by soft-thresholding. IEEE Trans- actions on Information Theory, 1995, 41(3): 613−627
【2】 Donoho D L, Johnstone I M. Adapting to unknown smooth- ness via wavelet shrinkage. Journal of the American Statistic
Association, 1995, 90(432): 1200−1224
【3】 Donoho D L, Johnstone I M, Kerkyacharian G, Picard D. Wavelet shrinkage: asymptopia? Journal of Royal Statisti-
cal Society Series B, 1995, 57(2): 301−369

所谓阈值去噪简而言之就是对信号进行分解,然后对分解后的系数进行阈值处理,最后重构得到去噪信号。该算法其主要理论依据是:小波变换具有很强的去数据相关性,它能够使信号的能量在小波域集中在一些大的小波系数中;而噪声的能量却分布于整个小波域内.因此,经小波分解后,信号的小波系数幅值要大于噪声的系数幅值.可以认为,幅值比较大的小波系数一般以信号为主,而幅值比较小的系数在很大程度上是噪声.于是,采用阈值的办法可以把信号系数保留,而使大部分噪声系数减小至零.小波阈值收缩法去噪的具体处理过程为:将含噪信号在各尺度上进行小波分解,设定一个阈值,幅值低于该阈值的小波系数置为0,高于该阈值的小波系数或者完全保留,或者做相应的“收缩(shrinkage)”处理.最后将处理后获得的小波系数用逆小波变换进行重构,得到去噪后的信号.


2,阈值函数的选取

  小波分解阈值去噪中,阈值函数体现了对超过和低于阈值的小波系数不同处理策略,是阈值去噪中关键的一步。设w表示小波系数,T为给定阈值,sign(*)为符号函数,常见的阈值函数有:


硬阈值函数:     (小波系数的绝对值低于阈值的置零,高于的保留不变)

     

软阈值函数:   (小波系数的绝对值低于阈值的置零,高于的系数shrinkage处理)

      

扫描二维码关注公众号,回复: 1147661 查看本文章

值得注意的是:

1) 硬阈值函数在阈值点是不连续的,在下图中已经用黑线标出。不连续会带来振铃,伪吉布斯效应等。

2) 软阈值函数,原系数和分解得到的小波系数总存在着恒定的偏差,这将影响重构的精度

同时这两种函数不能表达出分解后系数的能量分布,半阈值函数是一种简单而经典的改进方案。见下图:




                                                                               图1


3,阈值的确定

选取的阈值最好刚好大于噪声的最大水平,可以证明的是噪声的最大限度以非常高的概率低于(此阈值是Donoho提出的),其中根号右边的这个参数(叫做sigma)就是估计出来的噪声标准偏差(根据第一级分解出的小波细节系数,即整个det1绝对值系数中间位置的值),本文将用此阈值去处理各尺度上的细节系数,注意所谓全局阈值就是近似系数不做任何阈值处理外,其他均阈值处理。


最后吐槽一下这个“绝对值系数中间位置的值”

1)如果det1的长度为偶数那么,这个“中值”便是中间位置的两个数之和的平均值,比如【2,2,3,5】,中值即是2.5而不是3

2)如果det1的长度为奇数那么,这个中值就是中间位置的那个数,比如【2,3,5】,中值即3


4,阈值策略

以前写的ppt挪用过来:



5,一维信号的多级分解与重构

以下算法如果用简单的文字描述,可是:先将信号对称拓延(matlab的默认方式),然后再分别与低通分解滤波器和高通分解滤波器卷积,最后下采样,最后可以看出最终卷积采样的长度为floor(n-1)/2+n,如果想继续分解下去则继续对低频系数CA采取同样的方式进行分解。



二,matlab实现一维小波阈值去噪

1,核心库函数说明

1)wnoisest函数

作用:估计一维小波高频系数中的噪声偏差

这个估计值使用的是绝对值中间位置的值(估计的噪声偏差值)除以0.6745(Median Absolute Deviation / 0.6745),适合0均值的高斯白噪声


2)wavedec函数

一维信号的多尺度分解,将返回诸多细节系数和每个系数的长度,在matlab中键入“doc wavedec”具体功能一目了然


3)waverec函数

一维信号小波分解系数的重构,将返回重构后的信号在matlab中键入“doc waverec”具体功能一目了然,也可以键入“open waverec”查看matlab具体是怎么做的。


4)wdencmp函数

这个函数用于对一维或二维信号的压缩或者去噪,使用方法:
1 [XC,CXC,LXC,PERF0,PERFL2] = wdencmp('gbl',X,'wname',N,THR,SORH,KEEPAPP) 
2 [XC,CXC,LXC,PERF0,PERFL2] = wdencmp('lvd',X,'wname',N,THR,SORH) 
3 [XC,CXC,LXC,PERF0,PERFL2] = wdencmp('lvd',C,L,'wname',N,THR,SORH) 
wname是所用的小波函数,

gbl(global的缩写)表示每层都采用同一个阈值进行处理,

lvd表示每层用不同的阈值进行处理,

N表示小波分解的层数,

THR为阈值向量,

对于格式(2)(3)每层都要求有一个阈值,因此阈值向量THR的长度为N,

SORH表示选择软阈值还是硬阈值(分别取为’s’和’h’),

参数KEEPAPP取值为1时,则低频系数不进行阈值量化处理,反之,则低频系数进行阈值量化。

XC是消噪或压缩后的信号,[CXC,LXC]是XC的小波分解结构,

PERF0和PERFL2是恢复和压缩L^2的范数百分比, 是用百分制表明降噪或压缩所保留的能量成分。


3.代码实现
  1. clc;  
  2. clear;  
  3. % 获取噪声信号  
  4. load leleccum;  
  5. indx = 1:3450;  
  6. noisez = leleccum(indx);  
  7.   
  8. %信号的分解  
  9. wname = 'db3';   
  10. lev = 3;  
  11. [c,l] = wavedec(noisez,lev,wname);  
  12.   
  13. %求取阈值  
  14. sigma = wnoisest(c,l,1);%使用库函数wnoisest提取第一层的细节系数来估算噪声的标准偏差  
  15. N = numel(noisez);%整个信号的长度  
  16. thr = sigma*sqrt(2*log(N));%最终阈值  
  17.   
  18. %全局阈值处理  
  19. keepapp = 1;%近似系数不作处理  
  20. denoisexs = wdencmp('gbl',c,l,wname,lev,thr,'s',keepapp);  
  21. denoisexh = wdencmp('gbl',c,l,wname,lev,thr,'h',keepapp);  
  22.   
  23. % 作图  
  24. subplot(311),   
  25. plot(noisez), title('原始噪声信号');  
  26. subplot(312),  
  27. plot(denoisexs), title('matlab软阈值去噪信号') ;  
  28. subplot(313),  
  29. plot(denoisexh), title('matlab硬阈值去噪信号') ;  

猜你喜欢

转载自blog.csdn.net/csu_guo_liang/article/details/78547475