一維小波變換演算法

2022-12-20 22:51:04 字數 7127 閱讀 5501

作者:專案組轉貼自:本站原創點選數:7423

一維小波變換演算法程式目錄

appcoef函式

%採用補零的擴充套件模式(參見dwtmode函式)%裝載一維尺度訊號

load leleccum; s = leleccum(1:3920);ls=length(s);

subplot(2,1,1);plot(s);title('原始訊號');

%使用db1小波在第3層進行分解[c,l] = w**edec(s,3,'db1');

%由小波分解框架[c,l],提取第3層係數近似值ca3 = appcoef(c,l,'db1',3);subplot(2,1,2);plot(ca3);

cwt函式

t = linspace(-1,1,512);

s = 1-abs(t);

c = cwt(s,1:32,'cgau4');

c = cwt(s,[64 32 16:-2:2],'morl');c = cwt(s,[3 18 12.9 7 1.5],'db2');

c = cwt(s,1:64,'sym4','abslvl',[100 400]);

detcoef函式

%採用補零的擴充套件模式(參見dwtmode函式)%裝載一維尺度訊號load leleccum;

s = leleccum(1:3920);

%使用db1在第3層進行分解[c,l] = w**edec(s,3,'db1');subplot(4,1,1);plot(s);title('原始訊號');

%從小波分解結構[c,l]中提取1、2及3層的細節係數[cd1,cd2,cd3] = detcoef(c,l,[1 2 3]);%繪圖命令

subplot(4,1,2);plot(cd3);ylabel('cd3');subplot(4,1,3);plot(cd2);ylabel('cd2');subplot(4,1,4);plot(cd1);ylabel('cd1');

dwt函式

%當前擴充套件模式是補零模式(詳見dwtmode函式)%構造原始一維尺度訊號randn('seed',531316785)

s = 2 + kron(ones(1,8),[1 -1]) + ((1:16).^2)/32 + 0.

2*randn(1,16);%進行單尺度離散haar小波變換[ca1,cd1] = dwt(s,'haar');

subplot(311); plot(s); title('原始訊號');

subplot(323); plot(ca1); title('haar低頻係數');subplot(324); plot(cd1); title('haar高頻係數');

%對於給定的小波,計算兩個相關的分解濾波器,並直接使用該濾波器計算低頻和高頻係數

[lo_d,hi_d] = wfilters('haar','d');[ca1,cd1] = dwt(s,lo_d,hi_d);

%進行單尺度db2離散小波變換並觀察最後係數的邊緣效果[ca2,cd2] = dwt(s,'db2');

subplot(325); plot(ca2); title('db2低頻係數');subplot(326); plot(cd2); title('db2高頻係數');

idwt函式

%當前擴充套件模式是補零%構造原始一維訊號s

randn('seed',531316785)

s = 2 + kron(ones(1,8),[1 -11:16).^2)/32 + 0.

2*randn(1,16);%使用db2進行單尺度dwt[ca1,cd1] = dwt(s,'db2');subplot(221); plot(ca1);title('db2低頻係數');subplot(222); plot(cd1);title('db2高頻係數');%進行單尺度離散小波逆變換ss = idwt(ca1,cd1,'db2');

err = norm(s-ss); %檢查重構subplot(212); plot([s;ss]');title('原始訊號和重構訊號');

xlabel(['誤差的2範數為= ',num2str(err)])

%對於給定小波,計算兩個相關重構濾波器,並直接利用它們進行逆變換[lo_r,hi_r] = wfilters('db2','r');ss = idwt(ca1,cd1,lo_r,hi_r);

iswt函式

%裝載一維訊號

load noisbloc; s = noisbloc;%畫出原始訊號subplot(311);plot(s);

title('原始訊號.');

%使用db1在第3層進行swt分解swc = swt(s,3,'db1');%第2種實現方法.

[swa,swd] = swt(s,3,'db1');

%從平穩小波分解結構swc中,重構sa0 = iswt(swc,'db1');%畫出原始訊號subplot(312);plot(a0);

title('重構訊號1.');%第2種實現方法

a0bis = iswt(swa,swd,'db1');%畫出原始訊號subplot(313);plot(a0bis);

title('重構訊號2.');%檢查重構的效果err = norm(s-a0)

errbis = norm(s-a0bis)

swt函式

%載入一維原始訊號

load noisbloc; s = noisbloc;%畫出原始訊號

subplot(4,2,1);plot(s);title('原始訊號');subplot(4,2,2);plot(s);title('原始訊號');%使用db1進行在第3層swt分解.[swa,swd] = swt(s,3,'db1');

%畫出從1~3層離散小波變換的低頻係數和高頻係數

subplot(4,2,3);plot(swa(3,:));title('第3層低頻係數');subplot(4,2,5);plot(swa(2,:));title('第2層低頻係數');subplot(4,2,7);plot(swa(1,:

));title('第1層低頻係數');subplot(4,2,4);plot(swd(3,:));title('第3層低頻係數');subplot(4,2,6);plot(swd(2,:));title('第2層低頻係數');subplot(4,2,8);plot(swd(1,:

));title('第1層低頻係數');

upcoef函式

%當前擴充套件模式是補零(參見dwtmode函式)%低頻訊號由1~6層係數獲得cfs = [1];essup = 10;figure(1)for i=1:6

rec = upcoef('a',cfs,'db6',i);% essup是重構訊號必須的

%當j等於essup時,rec(j)非常小

ax = subplot(6,1,i),h = plot(rec(1:essup));set(ax,'xlim',[1 325]);essup = essup*2;end

subplot(611)

title(['尺度1到6,由惟一的係數獲得的低頻訊號'])%同樣可以獲得高頻訊號

%高頻訊號可以由惟一係數從尺度1~6獲得cfs = [1];

mi = 12; ma = 30; % db6小波濾波器必須的rec = upcoef('d',cfs,'db6',1);figure(2)

subplot(611), plot(rec(3:12))for i=2:6

rec = upcoef('d',cfs,'db6',i);

subplot(6,1,i), plot(rec(mi*2^(i-2):ma*2^(i-2)))end

subplot(611)

title(['由惟一係數從尺度1到6獲得的高頻訊號'])

upwlev函式

%當前的延拓模式是補零(參見dwtmode函式)%裝載原始一維訊號

load sumsin; s = sumsin;%使用db1執行3層小波分解

[c,l] = w**edec(s,3,'db1');subplot(311); plot(s);title('原始訊號s.');subplot(312); plot(c);title(' 3層小波分解結構')

xlabel(['第3層的低頻係數以及第3、2和1層的高頻係數'])%對3層的小波分解結構進行重構

%因此新的結構[nc,nl]是2層小波分解結構[nc,nl] = upwlev(c,l,'db1');subplot(313); plot(nc);title(' 2層小波分解結構')

xlabel(['第2層的低頻係數及第1和2層的高頻係數'])

w**edec函式

%當前延拓模式是補零%裝載一維原始訊號

load sumsin; s = sumsin;subplot(2,1,1);plot(s);title('原始訊號');%使用db1進行3層分解

[c,l] = w**edec(s,3,'db1');

subplot(2,1,2);plot(c);title('小波分解結構');xlabel('低頻係數和第3,2,1層的高頻係數')

w**erec函式

%當前延拓模式是補零%裝載一維原始

load leleccum; s = leleccum(1:3920); ls = length(s);%使用db5進行尺度為3時的分解[c,l] = w**edec(s,3,'db5');%從小波分解結構[c,l]重構訊號sa0 = w**erec(c,l,'db5');%檢查重構效果.err = norm(s-a0)

subplot(2,1,1);plot(s);title('原始訊號')subplot(2,1,2);plot(a0);title('重構訊號')

wmaxlev函式

%對於一維訊號s = 2^10;w = 'db1';

%計算小波分解的最大尺度,規則時最大尺度至少乙個係數正確l1 = wmaxlev(s,w)%改變小波w = 'db7';

%計算最大分解尺度l2= wmaxlev(s,w)%對於二維訊號s = [2^9 2^7];w = 'db1';

%計算最大分解尺度l3 = wmaxlev(s,w)

%它和下面這個函式一樣l4 = wmaxlev(min(s),w)%改變小波w = 'db7';

%計算最大分解尺度l5 = wmaxlev(s,w)

wrcoef函式

%採用補零的擴充套件模式(參見dwtmode函式)%裝載一維訊號

load sumsin; s = sumsin;

subplot(2,1,1);plot(s);title('原始訊號');%使用sym4進行尺度為5的分解[c,l] = w**edec(s,5,'sym4');

%從小波分解結構[c,l],重構尺度為5的低頻部分a5 = wrcoef('a',c,l,'sym4',5);

subplot(2,1,2);plot(a5);title('重構低頻訊號');

一維離散小波變換

load noisbloc

s= noisbloc(1:1024);ls=length(s);

[ca1,cd1]=dwt(s,'db4');

a1=upcoef('a',ca1,'db4',1,ls);d1=upcoef('d',cd1,'db4',1,ls);

subplot(2,1,1);plot(a1);title('低頻a1')subplot(2,1,2);plot(d1);title('高頻d1')a0=idwt(ca1,cd1,'db4',ls);figure(2)

subplot(2,1,1);plot(s);title('原始訊號')subplot(2,1,2);plot(a0);title('重構訊號')

[c,l]=w**edec(s,5,'db4');ca5=appcoef(c,l,'db4',5);a5=wrcoef('a',c,l,'db4',3);d1=wrcoef('d',c,l,'db4',1);d2=wrcoef('d',c,l,'db4',2);d3=wrcoef('d',c,l,'db4',3);d4=wrcoef('d',c,l,'db4',4);d5=wrcoef('d',c,l,'db4',5);

subplot(3,2,1);plot(a5);title('低頻a5')subplot(3,2,2);plot(d1);title('高頻d1')subplot(3,2,3);plot(d2);title('高頻d2')subplot(3,2,4);plot(d3);title('高頻d3')subplot(3,2,5);plot(d3);title('高頻d4')subplot(3,2,6);plot(d3);title('高頻d5')figure(3)

a0=w**erec(c,l,'db4');

subplot(3,1,1);plot(s);title('原始訊號')subplot(3,1,2);plot(a0);title('重構訊號')subplot(3,1,3);plot(s- a0);title('誤差訊號')err = max(abs(s-a0))

一維連續小波變換%裝載實際訊號load vonkoch

vonkoch=vonkoch(1:510);lv = length(vonkoch);

subplot(311), plot(vonkoch);title('被分析訊號.');set(gca,'xlim',[0 510])

%執行離散5層sym2小波變換

%層數1~5分別對應尺度2, 4, 8, 16 and 32[c,l] = w**edec(vonkoch,5,'sym2');%擴充套件離散小波係數進行畫圖

%層數1~5分別對應尺度2, 4, 8, 16和32cfd = zeros(5,lv);for k = 1:5

d = detcoef(c,l,k);d = d(ones(1,2^k),:);

cfd(k,:) = wkeep(d(:)',lv);end

cfd = cfd(:);i = find(abs(cfd)

cfd(i)=zeros(size(i));cfd = reshape(cfd,5,lv);

%畫出離散係數

subplot(312), colormap(pink(64));

img = image(flipud(wcodemat(cfd,64,'row')));set(get(img,'parent'),'yticklabel',);title('離散變換,係數絕對值.')ylabel('層數')

%執行連續小波sym2變換,尺度從1~32subplot(313)

ccfs = cwt(vonkoch,1:32,'sym2','plot');title('連續變換,係數絕對值.')colormap(pink(64));ylabel('尺度')

實驗二影象變換演算法

影象變換演算法實驗 一.實驗目的 編寫快速傅利葉變換dft 或離散余弦變換dct 的演算法程式,驗證影象變換的平移性。二 實驗方法 1 驗證二維傅利葉變換平移性 先建立乙個二維圖象,然後再對其平移,通過觀察兩者的頻譜圖來觀察平移特性。為方便起見,可選擇特殊情況分析,令u0 v0 n 2,使f u n...

小波變換he傅利葉變換

如果有人問我,如果傅利葉變換沒有學好 深入理解概念 是否能學好小波。答案是否定的。如果有人還問我,如果第一代小波變換沒學好,能否學好第二代小波變換。答案依然是否定的。但若你問我,沒學好傅利葉變換,能否操作 程式設計 小波變換,或是沒學好第一代小波,能否操作二代小波變換,答案是肯定的。一 一 基的概念...

小波變換與傅利葉變換

如果有人問我,如果傅利葉變換沒有學好 深入理解概念 是否能學好小波。答案是否定的。如果有人還問我,如果第一代小波變換沒學好,能否學好第二代小波變換。答案依然是否定的。但若你問我,沒學好傅利葉變換,能否操作 程式設計 小波變換,或是沒學好第一代小波,能否操作二代小波變換,答案是肯定的。一 一 基的概念...