① matlab中怎樣實現多層小波重構
(1)程序所用的小波函數只有非標準的Haar小波,其濾波器組為 Lo_D=[1/2 1/2], Hi_D=[-1/2 1/2],是固化在 mydwt2.m 的程序中的,不能選擇其他的小波函數;
(2)非標準的Haar小波,其分解出來的系數矩陣中,高頻系數的細節內容(輪廓、邊緣等特徵)不明顯;
(3)函數 mydwt2 中列變換的矩陣對象為輸入矩陣,這是錯誤的,其矩陣對象應該是行變換後的緩存矩陣;
(4)函數 mydwt2 的輸出用[LL,HL,LH,HH]表示,不是很規范,應改為[cA,cV,cH,cD]來表示,即一級小波變換輸出的系數矩陣有4個部分:平均部分、垂直細節部分、水平細節部分和對角線細節部分。
(5)函數 mywavedec2 的輸出 y 是與輸入矩陣 x 相同大小的矩陣,並且已將N級分解後所有的平均、細節系數組合成一體的。實際上,這種定義只對Haar小波有效。
(6)原程序中要調用 modmat 函數對圖像矩陣進行修剪,使之能被 2 的 N 次方整除,主要是為了生成塔式結構圖像而設的,對上述問題修正後,這個 modmat 函數已不需使用了。
針對上述問題,我對程序作了修正,發布在今天的3篇文章里,請大家點擊查看。新修正的程序更為簡潔易懂,功能也有所增強,可以用任意的小波函數進行小波分解,可根據小波分解系數矩陣重構出指定分解級的低頻系數和原始圖像。
(原)自己動手編寫小波信號分解與重構的Matlab程序
下面,我把自己編寫的小波一維、二維信號分解和重構Matlab程序共享出來,也希望有朋友共享自編的程序,共同學習,提高程序的效率和簡潔性。
1、《小波圖像分解與重構程序存在的問題與解決辦法》
首先要說明的一點是,雖然是自己編寫Matlab程序,但並不是說一點也不用Matlab的自帶函數。我們要編寫的是實現小波變換的主要功能函數,而繪圖等基本功能還是要用到Matlab函數的。而且,根據小波變換的濾波器組原理,原始信號要通過低通、高通濾波器處理,這里就涉及到卷積這一運算步驟。卷積——FFT演算法的實現,相信很多朋友都能用Matlab、C語言等來實現,不過與Matlab自帶的用機器語言編寫的FFT程序相比,運算速度一般會慢幾倍、幾十倍。所以,我的程序里邊涉及卷積的就直接調用Matlab的conv()函數了。
我們知道,小波變換的一級分解過程是,原始信號分別進行低通、高通濾波,再分別進行二元下抽樣,就得到低頻、高頻(也稱為平均、細節)兩部分系數;而多級分解則是對上一級分解得到的低頻系數再進行小波分解,是一個遞歸過程。以下是一維小波分解的程序:
function [cA,cD] = mydwt(x,lpd,hpd,dim);
% 函數 [cA,cD]=MYDWT(X,LPD,HPD,DIM) 對輸入序列x進行一維離散小波分解,輸出分解序列[cA,cD]
% 輸入參數:x——輸入序列;
% lpd——低通濾波器;
% hpd——高通濾波器;
% dim——小波分解級數。
% 輸出參數:cA——平均部分的小波分解系數;
% cD——細節部分的小波分解系數。
cA=x; % 初始化cA,cD
cD=[];
for i=1:dim
cvl=conv(cA,lpd); % 低通濾波,為了提高運行速度,調用MATLAB提供的卷積函數conv()
dnl=downspl(cvl); % 通過下抽樣求出平均部分的分解系數
cvh=conv(cA,hpd); % 高通濾波
dnh=downspl(cvh); % 通過下抽樣求出本層分解後的細節部分系數
cA=dnl; % 下抽樣後的平均部分系數進入下一層分解
cD=[cD,dnh]; % 將本層分解所得的細節部分系數存入序列cD
end
function y=downspl(x);
% 函數 Y=DOWMSPL(X) 對輸入序列進行下抽樣,輸出序列 Y。
% 下抽樣是對輸入序列取其偶數位,舍棄奇數位。例如 x=[x1,x2,x3,x4,x5],則 y=[x2,x4].
N=length(x); % 讀取輸入序列長度
M=floor(N/2); % 輸出序列的長度是輸入序列長度的一半(帶小數時取整數部分)
i=1:M;
y(i)=x(2*i);
而重構則是分解的逆過程,對低頻系數、高頻系數分別進行上抽樣和低通、高通濾波處理。要注意重構時同一級的低頻、高頻系數的個數必須相等。
function y = myidwt(cA,cD,lpr,hpr);
% 函數 MYIDWT() 對輸入的小波分解系數進行逆離散小波變換,重構出信號序列 y
% 輸入參數:cA —— 平均部分的小波分解系數;
% cD —— 細節部分的小波分解系數;
% lpr、hpr —— 重構所用的低通、高通濾波器。
lca=length(cA); % 求出平均、細節部分分解系數的長度
lcd=length(cD);
while (lcd)>=(lca) % 每一層重構中,cA 和 cD 的長度要相等,故每層重構後,
% 若lcd小於lca,則重構停止,這時的 cA 即為重構信號序列 y 。
upl=upspl(cA); % 對平均部分系數進行上抽樣
cvl=conv(upl,lpr); % 低通卷積
cD_up=cD(lcd-lca+1:lcd); % 取出本層重構所需的細節部分系數,長度與本層平均部分系數的長度相等
uph=upspl(cD_up); % 對細節部分系數進行上抽樣
cvh=conv(uph,hpr); % 高通卷積
cA=cvl+cvh; % 用本層重構的序列更新cA,以進行下一層重構
cD=cD(1:lcd-lca); % 舍棄本層重構用到的細節部分系數,更新cD
lca=length(cA); % 求出下一層重構所用的平均、細節部分系數的長度
lcd=length(cD);
end % lcd < lca,重構完成,結束循環
y=cA; % 輸出的重構序列 y 等於重構完成後的平均部分系數序列 cA
function y=upspl(x);
% 函數 Y = UPSPL(X) 對輸入的一維序列x進行上抽樣,即對序列x每個元素之間
% 插零,例如 x=[x1,x2,x3,x4],上抽樣後為 y=[x1,0,x2,0,x3,0,x4];
N=length(x); % 讀取輸入序列長度
M=2*N-1; % 輸出序列的長度是輸入序列長度的2倍再減一
for i=1:M % 輸出序列的偶數位為0,奇數位按次序等於相應位置的輸入序列元素
if mod(i,2)
y(i)=x((i+1)/2);
else
y(i)=0;
end
end
我們知道,二維小波分解重構可以用一系列的一維小波分解重構來實現。以下程序是基於Haar小波的二維小波分解和重構過程:
function [LL,HL,LH,HH]=mydwt2(x);
% 函數 MYDWT2() 對輸入的r*c維矩陣 x 進行二維小波分解,輸出四個分解系數子矩陣[LL,HL,LH,HH]
% 輸入參數:x —— 輸入矩陣,為r*c維矩陣。
% 輸出參數:LL,HL,LH,HH —— 是分解系數矩陣的四個相等大小的子矩陣,大小均為 r/2 * c/2 維
% LL:低頻部分分解系數; HL:垂直方向分解系數;
% LH:水平方向分解系數; HH:對角線方向分解系數。
lpd=[1/2 1/2];hpd=[-1/2 1/2]; % 默認的低通、高通濾波器
[row,col]=size(x); % 讀取輸入矩陣的大小
for j=1:row % 首先對輸入矩陣的每一行序列進行一維離散小波分解
tmp1=x(j,:);
[ca1,cd1]=mydwt(tmp1,lpd,hpd,1);
x(j,:)=[ca1,cd1]; % 將分解系數序列再存入矩陣x中,得到[L|H]
end
for k=1:col % 再對輸入矩陣的每一列序列進行一維離散小波分解
tmp2=x(:,k);
[ca2,cd2]=mydwt(tmp2,lpd,hpd,1);
x(:,k)=[ca2,cd2]; % 將分解所得系數存入矩陣x中,得到[LL,Hl;LH,HH]
end
LL=x(1:row/2,1:col/2); % LL是矩陣x的左上角部分
LH=x(row/2+1:row,1:col/2); % LH是矩陣x的左下角部分
HL=x(1:row/2,col/2+1:col); % HL是矩陣x的右上角部分
HH=x(row/2+1:row,col/2+1:col); % HH是矩陣x的右下角部分
function y=myidwt2(LL,HL,LH,HH);
% 函數 MYIDWT2() 對輸入的子矩陣序列進行逆小波變換,重構出矩陣 y
% 輸入參數:LL,HL,LH,HH —— 是四個大小均為 r*c 維的矩陣
% 輸出參數:y —— 是一個大小為 2r*2c 維的矩陣
lpr=[1 1];hpr=[1 -1]; % 默認的低通、高通濾波器
tmp_mat=[LL,HL;LH,HH]; % 將輸入的四個矩陣組合為一個矩陣
[row,col]=size(tmp_mat); % 求出組合矩陣的行列數
for k=1:col % 首先對組合矩陣tmp_mat的每一列,分開成上下兩半
ca1=tmp_mat(1:row/2,k); % 分開的兩部分分別作為平均系數序列ca1、細節系數序列cd1
cd1=tmp_mat(row/2+1:row,k);
tmp1=myidwt(ca1,cd1,lpr,hpr); % 重構序列
yt(:,k)=tmp1; % 將重構序列存入待輸出矩陣 yt 的相應列,此時 y=[L|H]
end
for j=1:row % 將輸出矩陣 y 的每一行,分開成左右兩半
ca2=yt(j,1:col/2); % 分開的兩部分分別作為平均系數序列ca2、細節系數序列cd2
cd2=yt(j,col/2+1:col);
tmp2=myidwt(ca2,cd2,lpr,hpr); % 重構序列
yt(j,:)=tmp2; % 將重構序列存入待輸出矩陣 yt 的相應行,得到最終的輸出矩陣 y=yt
end
y=yt;
② matlab小波工具箱裝載信號的問題
你肯定是2*n的矩陣,一列(行)是時間,另一列(行)是與該時間對應的電回壓,matlab一維小波工具答箱不能處理二維信號,必須把時間去掉。如果你的時間間隔是固定不變的還好說,小波處理後效果很好,如果時間間隔不固定,忽大忽小,那對你的結果會有一定程度的影響。
③ 用matlab中工具箱進行小波去噪步驟
matlab讀取excel文件比較方便,建議你把數據放到xls文件中保存,然後在matlab中用xlsread這個函數讀取出來。版
讀取出的數據應該是一權個一維數組了,用plot畫出圖的話,就是常見的曲線。
然後做小波分解:選用你覺得合適的小波基,例如haar,然後用這個小波基做小波分解,再把高頻部分去掉,然後用低頻部分還原,就得到了去噪後的信號。
其實你這個問題估計也可以用神經網路或者其它曲線擬合一類手段來解決。具體的情況要根據數據特徵來判斷。
以上。
專業路過的老狼
④ matlab中的小波工具箱怎麼用,希望能詳細介紹
將原始數據文件夾到裝有matlab的電腦
打開matlab軟體,進入軟體主界面
在軟體的左下方找到start按鈕,點擊選擇toolbox,然後選擇wavelet
進入wavemenu界面,選擇一維小波中的wavelet1-D並進入
5.將數據文件(.Mat格式)托到matlab軟體主界面的workspace
6.在wavemenu主界面中選擇file-load signal或者import from workspace—import signal
7.選擇要處理的信號,界面出現loaded信號,這就是沒有去噪前的原
始信號
8.右上角選擇用於小波分析的小波基以及分解層數並點擊analyse開始分析
9.分析後在左邊欄目中出現s,a*,d*,其中s為原信號,a*為近似信號,d*為細節信號
10.然後點擊denoise去噪
11.閾值方法常用的有4種fixed(固定閾值),rigorsure,heusure,minmax根據需要選擇,一般情況下rigorsure方式去噪效果較好
12.oft(軟閾值),hard(硬閾值)一般選擇軟閾值去噪後的信號較為平滑
13.在雜訊結構中選擇unscaled white noise,因為在工程應用中的雜訊一般不僅僅含有白雜訊
14.在雜訊結構下面的數值不要隨意改,這是系統默認的去噪幅度
15.點擊denoise開始正式去噪
16.在此窗口下點擊file-save denoised singal,保存輸出去噪後的信號
17.去噪結束
18.去噪結束後,把去噪後信號(.mat格式)拖至matlab主界面的workspace中,與原信號一起打包,以便以後計算統計量
19.Matlab編程計算相關統計量以及特徵量
20.得出統計量和特徵量後結束
⑤ MATLAB里小波工具箱的功能怎樣用函數程序實現呢
a1.a2,d2,d1是ca1,ca2,cd1,cd2這些小波系數的重構。ca1,ca2,cd1,cd2是小波系數,它們的數據點數隨分解層次的增大而減少專,這就難以與原始信號對屬比分析,通常會經過重構變為與原始信號個數相同的a1.a2,d2,d1,從物理意義上講,只有a1.a2,d2,d1才是有實際量綱的信號,ca1,ca2,cd1,cd2是沒有量綱和物理意義的。
上面的語句是提取小波系數的,而工具箱的圖是用重構的數據的,你可以使用waverec函數實現工具箱的功能。
對於DWT,小波分解對被分解信號的點數是沒有要求的,因為在DWT之前對原始信號是要經過拓展的,也就是說,DWT時的信號數據已經不是原始信號的點數了。對於SWT,matlab在這方面所寫的函數沒下啥功夫,比較敷衍,這時小波分解被分解信號的點數必須是2的整數次冪。