一維訊號小波閾值去噪
轉載: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處理)
值得注意的是:
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.程式碼實現
- clc;
- clear;
- % 獲取噪聲訊號
- load leleccum;
- 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硬閾值去噪訊號') ;