1、小波閾值處理基本理論
所謂閾值去噪簡而言之就是對信號進行分解,然后對分解后的系數進行閾值處理,最后重構得到去噪信號。該算法其主要理論依據是:小波變換具有很強的去數據相關性,它能夠使信號的能量在小波域集中在一些大的小波系數中;而噪聲的能量卻分布于整個小波域內。因此,經小波分解后,信號的小波系數幅值要大于噪聲的系數幅值??梢哉J為,幅值比較大的小波系數一般以信號為主,而幅值比較小的系數在很大程度上是噪聲。于是,采用閾值的辦法可以把信號系數保留,而使大部分噪聲系數減小至零。小波閾值收縮法去噪的具體處理過程為:將含噪信號在各尺度上進行小波分解,設定一個閾值,幅值低于該閾值的小波系數置為0,高于該閾值的小波系數或者完全保留,或者做相應的“收縮(shrinkage)”處理。最后將處理后獲得的小波系數用逆小波變換進行重構,得到去噪后的信號。
2、閾值函數的選取
小波分解閾值去噪中,閾值函數體現了對超過和低于閾值的小波系數不同處理策略,是閾值去噪中關鍵的一步。設w表示小波系數,T為給定閾值,sign(*)為符號函數,常見的閾值函數有:
硬閾值函數:(小波系數的絕對值低于閾值的置零,高于的保留不變)
軟閾值函數:(小波系數的絕對值低于閾值的置零,高于的系數shrinkage處理)
式(3-8)和式(3-9)用圖像表示即為:
值得注意的是:
1)硬閾值函數在閾值點是不連續的,在下圖中已經用黑線標出。不連續會帶來振鈴,偽吉布斯效應等。
2)軟閾值函數,原系數和分解得到的小波系數總存在著恒定的偏差,這將影響重構的精度
同時這兩種函數不能表達出分解后系數的能量分布,半閾值函數是一種簡單而經典的改進方案。見下圖:
3、閾值的確定
選取的閾值最好剛好大于噪聲的最大水平,可以證明的是噪聲的最大限度以非常高的概率低于(此閾值是Donoho提出的),其中根號右邊的這個參數(叫做sigma)就是估計出來的噪聲標準偏差(根據第一級分解出的小波細節系數,即整個det1絕對值系數中間位置的值),本文將用此閾值去處理各尺度上的細節系數,注意所謂全局閾值就是近似系數不做任何閾值處理外,其他均閾值處理。
4、閾值策略
5、一維信號的多級分解與重構
以下算法如果用簡單的文字描述,可是:先將信號對稱拓延(matlab的默認方式),然后再分別與低通分解濾波器和高通分解濾波器卷積,最后下采樣,最后可以看出最終卷積采樣的長度為floor(n-1)/2+n,如果想繼續分解下去則繼續對低頻系數CA采取同樣的方式進行分解。
6、matlab實現一維小波閾值去噪
1,核心庫函數說明
1)wnoisest函數
作用:估計一維小波高頻系數中的噪聲偏差
這個估計值使用的是絕對值中間位置的值(估計的噪聲偏差值)除以0.6745(MedianAbsoluteDeviation/0.6745),適合0均值的高斯白噪聲
2)wavedec函數
一維信號的多尺度分解,將返回諸多細節系數和每個系數的長度,在matlab中鍵入“docwavedec”具體功能一目了然
3)waverec函數
一維信號小波分解系數的重構,將返回重構后的信號在matlab中鍵入“docwaverec”具體功能一目了然,也可以鍵入“openwaverec”查看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.代碼實現
clear;
%獲取噪聲信號
loadleleccum;
indx=1:3450;
noisez=leleccum(indx);
%信號的分解
wname=‘db3’;
lev=3;
[c,l]=wavedec(noisez,lev,wname);
%求取閾值
sigma=wnoisest(c,l,1);%使用庫函數wnoisest提取第一層的細節系數來估算噪聲的標準偏差
N=numel(noisez);%整個信號的長度
thr=sigma*sqrt(2*log(N));%最終閾值
%全局閾值處理
keepapp=1;%近似系數不作處理
denoisexs=wdencmp(‘gbl’,c,l,wname,lev,thr,‘s’,keepapp);
denoisexh=wdencmp(‘gbl’,c,l,wname,lev,thr,‘h’,keepapp);
%作圖
subplot(311),
plot(noisez),title(‘原始噪聲信號’);
subplot(312),
plot(denoisexs),title(‘matlab軟閾值去噪信號’);
subplot(313),
plot(denoisexh),title(‘matlab硬閾值去噪信號’);
評論