⑴ matlab小波分解與重構
s=zeros(1,100);
s(50:100)=1;
subplot(2,2,1);plot(s); title('原始信號');
[c,l]=wavedec(s,3,'db1');
a3=appcoef(c,l,'db1',3);
d3=detcoef(c,l,3);
d2=detcoef(c,l,2);
d1=detcoef(c,l,1);
dd3=zeros(1,length(d3));
dd2=zeros(1,length(d2));
dd1=zeros(1,length(d1));
c1=[a3 dd3 dd2 dd1];
s1=waverec(c1,l,'db1');
subplot(2,2,2);
plot(s1);grid;
title('強制消噪後的信號');
[thr,sorh,keepapp]=ddencmp('den','wv',s);
s2=wdencmp('gbl',c,l,'db1',3,thr,sorh,keepapp);
subplot(2,2,3);
plot(s2);grid;
title('默認閾值消噪後的信號');
softd1=wthresh(d1,'s',1.465);
softd2=wthresh(d2,'s',1.823);
softd3=wthresh(d3,'s',2.768);
c2=[a3 softd3 softd2 softd1];
s3=waverec(c2,l,'db1');
subplot(2,2,4);
plot(s3);grid;
title('給定軟閾值消噪後的信號');
⑵ 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中的小波工具箱怎麼用,希望能詳細介紹
將原始數據文件夾到裝有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自帶的小波工具箱wavemenu怎樣對[電流 時間監測數據進行分解後重構呢
是一個圖形,你可以圖形平滑(一般三角函數),或者使用函數擬合得到擬合系數可以!
(註:你可以找到在圖像上的一個點的坐標向量!我沒有你的專業知識是不明確的,我已經理解了點!)
⑸ MATLAB小波處理的問題
第一步:信號分解
調用格式:[C,L]=wavedec(X,N,』wname』
提取多尺度小波變換的低頻系數
A=appcoef(C,L,』db1』)
提取多尺度小波變換的高頻系數:
D=detcoef(C,L,N);
第二步:信號重構
X=waverec[C,L,『wname
』]
1)小波分解結構的低頻重構
函數:A3=wrcoef('
type',C,L,'wname',N)
2)小波分解結構的高頻重構
函數:D=wrcoef('d',C,L,'db1',3)。
第三步:畫出分解後的圖形,四合一圖像,就是你想要的效果,
所用函數:
subplot(4,1,1);plot(A3);title(
'A3');
subplot(4,1,2);plot(D3);title(
'D3');
subplot(4,1,3);plot(D2);title(
'D2');
subplot(4,1,4);plot(D1);title(
'D1');
如果只要
LL
或
HH
單獨一張圖像就好,
下面是舉例子的
figure(1);plot(LL
)
figure(2);plot(HH)
⑹ 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的整數次冪。
⑺ 請問matlab小波工具箱中有ghm多小波分解\重構源代碼嗎
有,需要設置工具箱,不能使用默認的工具箱。
⑻ MATLAB 小波包分解與重構
我想問你可以給我小波包分解的程序參考一下嗎?我也在做這部分,相信你已經完成了,幫我個忙,謝了!
⑼ 請問關於近紅外光譜數據用matlab進行小波變換
應該是先進行小波分解,然後進行小波重構吧?
dwt函數應該是對信號的單層分解,
[cA,cD]=dwt(X,』wname』)中返回的cA,cD分別存放是信號的近似和細節
[C,L]=wavedec(X,N,'wname') 利用小波'wname'對信號X進行多層分解
之後是依據你的需要將信號重構回去,idwt是單尺度一維小波逆變換,waverec是多尺度一維小波重構
簡單的就是matlab裡面有小波工具箱,在命令窗口輸入wavemenu,載入你的信號,選擇不同地小波基就行~
希望對你有幫助
⑽ 關於MATLAB小波工具箱
wfilter = 'haar';%選擇小波基抄
[CA,CH,CV,CD] = dwt2(x,wfilter, 'per');%小波變換襲
CA = (CA>=T1) .* CA;%對4個自帶分別閾值處理
CH = (CH>=T2) .* CH;
CV = (CV>=T3) .* CV;
CD = (CD>=T4) .* CD;
result = idwt2(CA, CH, CV, CD, wfilter, 'per');%反變換重構圖像。