Java 离散小波变换公式_一维离散小波变换函数使用总结
前言
matlab自帶的小波分析工具非常全!實(shí)際工作中直接用即可。但是剛開始使用會(huì)遇到挫折:它的函數(shù)太多,并且它們的"名稱、功能、配套使用"等要求都有些"相近",很容易導(dǎo)致糊涂!因此本文的總結(jié)與配套實(shí)例很具有參考價(jià)值!
下面先列舉3條關(guān)鍵理解,后面會(huì)用到:
小波分解,分解到的"不是頻率域"!可以抽象理解為"小波域",但其實(shí)沒有實(shí)際內(nèi)涵!傅里葉變換到頻率域是有實(shí)際內(nèi)涵的;
小波分解得到的"小波系數(shù)"是"沒有量綱"的!它其實(shí)是"沒有實(shí)際意義的數(shù)",需要做系數(shù)重構(gòu)才能從"小波域"再轉(zhuǎn)回到"時(shí)域";
"系數(shù)重構(gòu)"與"重構(gòu)信號(hào)"不是一個(gè)東西!系數(shù)重構(gòu)就是把無(wú)量綱的小波分解系數(shù)變回到有意義的"時(shí)域";"重構(gòu)信號(hào)"就是把分解的完整恢復(fù)回去。
幾種函數(shù)的說法與適用處
下面介紹最容易讓人糊涂的matlab一些自帶函數(shù)的說法與用途(都是針對(duì)離散小波變換),不同的函數(shù)有不同的適用處于搭配函數(shù).
分解與重構(gòu)/恢復(fù)信號(hào):
1級(jí)分解與重構(gòu)原始信號(hào)函數(shù)為: dwt和dwt2 與 idwt和idwt2;
多級(jí)(包括1級(jí))分解與重構(gòu)原始信號(hào)函數(shù)為: wavedec和wavedec2 與 waverec和waverec2;所以wavedec可涵蓋dwt。
系數(shù)重構(gòu):需理解其作用 √ √ √
1級(jí)分解的系數(shù)重構(gòu)用函數(shù)的是: upcoef和upcoef2;
多級(jí)分解的系數(shù)重構(gòu)用函數(shù)的是: wrcoef和wrcoef2。
系數(shù)提取:
多級(jí)分解低頻近似系數(shù)提取:appcoef和appcoef2;
多解分解高頻細(xì)節(jié)系數(shù)提取:detcoef和detcoef2。
說明:"系數(shù)提取"只有"多級(jí)分解"才會(huì)用的到! 1級(jí)分解是不需要"系數(shù)提取"的!因?yàn)榫头殖闪说皖l和高頻2個(gè)部分,直接用1維或2維分解函數(shù)的返回結(jié)果就行了!所以:多級(jí)分解的系數(shù)提取,就相當(dāng)于1級(jí)分解后的返回結(jié)果的直接畫圖。
上面就是容易搞混的幾個(gè)操作與使用搭配。
還是要著重強(qiáng)調(diào)一點(diǎn):用自帶的函數(shù)做完"小波分解"后,得到的"小波系數(shù)"是"沒有量綱"的!可以理解為原始信號(hào)域映射到小波域(小波域不是什么具體的東西,只是為了方便理解)!只有把分解出來(lái)的"小波系數(shù)"再做"系數(shù)重構(gòu)"后,才能回到原始的信號(hào)域,得到原始信號(hào)的不同的低頻和高頻子信號(hào)成分(還是時(shí)域的顯示)。
下面我們先給出具體的例子(一維離散數(shù)據(jù)),再總結(jié)每個(gè)函數(shù)具體的語(yǔ)法:
例子1:一維信號(hào)1級(jí)分解(dwt)、系數(shù)重構(gòu)(upcoef)、重構(gòu)/恢復(fù)信號(hào)(idwt):
clc; clear;
% 導(dǎo)入自帶的一個(gè)一維電壓信號(hào), 取前4096個(gè)點(diǎn)
load leleccum;
s = leleccum(1:4096);
% 一級(jí)"分解": 時(shí)域 → 小波域
% 說明: 2個(gè)"系數(shù)(低+高)"的尺寸全部是一半 2048
% 命令: dwt
[cA1,cD1] = dwt(s,'haar');
figure(1);
subplot(2,2,1); plot(cA1); title('小波域: 低頻近似部分(點(diǎn)數(shù)少一半)'); grid on;
xlabel('小波域: 橫軸坐標(biāo)無(wú)實(shí)際意義');
subplot(2,2,2); plot(cD1); title('小波域: 高頻細(xì)節(jié)部分(點(diǎn)數(shù)少一半)'); grid on;
xlabel('小波域: 橫軸坐標(biāo)無(wú)實(shí)際意義');
% 1級(jí)分解系數(shù)"重構(gòu)": 小波域 → 時(shí)域
% 說明: 2個(gè)"子信號(hào)(低+高)"的尺寸全部和原始大小一樣 4096!!
% 命令: upcoef
A1 = upcoef('a',cA1,'haar',1);
D1 = upcoef('d',cD1,'haar',1);
subplot(2,2,3); plot(A1); title('時(shí)域: 原始信號(hào)低頻近似部分(點(diǎn)數(shù)一樣)'); grid on;
xlabel('采樣點(diǎn)'); ylabel('振幅');
subplot(2,2,4); plot(D1); title('時(shí)域: 原始信號(hào)高頻細(xì)節(jié)部分(點(diǎn)數(shù)一樣)'); grid on;
xlabel('采樣點(diǎn)'); ylabel('振幅');
% 重構(gòu)原始信號(hào): 參數(shù)用的還是分解出的系數(shù)
% 命令: idwt
s_rec = idwt(cA1,cD1,'haar');
figure(2);
subplot(1,2,1); plot(s); title('原始時(shí)域信號(hào): 4096個(gè)采樣點(diǎn)'); grid on;
xlabel('采樣點(diǎn)'); ylabel('振幅');
subplot(1,2,2); plot(s_rec); title('重構(gòu)原始信號(hào): 點(diǎn)數(shù)一樣'); grid on;
xlabel('采樣點(diǎn)'); ylabel('振幅');
suptitle('一維原始信號(hào)與重構(gòu)原始信號(hào)');
figure(1)效果:
圖1:一維1級(jí)小波(域)系數(shù)圖像與系數(shù)重構(gòu)時(shí)域子信號(hào)
figure(2)效果:
圖2:原始信號(hào)與一維1級(jí)分解后重構(gòu)信號(hào)對(duì)比
例子2:一維信號(hào)多級(jí)分解(wavedec)、系數(shù)重構(gòu)(wrcoef)、系數(shù)提取(appcoef + detcoef)、重構(gòu)/恢復(fù)信號(hào)(idwt):
clc; clear;
% 導(dǎo)入自帶的一個(gè)一維電壓信號(hào), 取前4096個(gè)點(diǎn)
load leleccum;
s = leleccum(1:4096);
% 多尺度/級(jí)分解:
% 命令: wavedec
[C,L]=wavedec(s,3,'db1');
% 系數(shù)提取: 提取經(jīng)過變換之后的信號(hào): 小波域下的低頻系數(shù)(近似信息)和高頻系數(shù)(細(xì)節(jié)信號(hào)), 即"時(shí)域→小波域"!
% 說明: 系數(shù)提取是多級(jí)分解才用!1級(jí)分解有就分成2個(gè)部分,不需要提取。
% 命令: appcoef低頻系數(shù)提取; detcoef高頻系數(shù)提取
cA3=appcoef(C,L,'db1',3); % 低: 3表示第三層
cD3=detcoef(C,L,3);
cD2=detcoef(C,L,2);
cD1=detcoef(C,L,1); % 3個(gè)高: 最后的數(shù)字表示的是層數(shù)
figure(1)
% 4個(gè)部分長(zhǎng)度不一樣!
subplot(2,2,1); plot(cA3); title('3級(jí)分解中低頻近似部分'); grid on; % 長(zhǎng)度 1/2^3 = 1/8
xlabel('小波域: 橫軸坐標(biāo)無(wú)實(shí)際意義');
subplot(2,2,2); plot(cD3); title('3級(jí)分解中高頻細(xì)節(jié)部分'); grid on; % 長(zhǎng)度 1/2^3 = 1/8
xlabel('小波域: 橫軸坐標(biāo)無(wú)實(shí)際意義');
subplot(2,2,3); plot(cD2); title('2級(jí)分解中高頻細(xì)節(jié)部分'); grid on; % 長(zhǎng)度 1/2^2 = 1/4
xlabel('小波域: 橫軸坐標(biāo)無(wú)實(shí)際意義');
subplot(2,2,4); plot(cD1); title('1級(jí)分解中高頻細(xì)節(jié)部分'); grid on; % 長(zhǎng)度 1/2^1 = 1/2
xlabel('小波域: 橫軸坐標(biāo)無(wú)實(shí)際意義');
suptitle('時(shí)域→小波域');
% 多級(jí)重構(gòu)系數(shù): 從小波域還原出信號(hào)高頻部分的子信號(hào), 即從"小波域→時(shí)域"!
% 命令: wrcoef 參數(shù)中a是低頻, d是高頻
A3=wrcoef('a',C,L,'db1',3); % 低
D3=wrcoef('d',C,L,'db1',3);
D2=wrcoef('d',C,L,'db1',2);
D1=wrcoef('d',C,L,'db1',1); % 3個(gè)高
figure(2)
subplot(2,2,1); plot(A3); title('原始信號(hào)中的低頻信號(hào)成分'); grid on;
xlabel('采樣點(diǎn)'); ylabel('振幅');
subplot(2,2,2); plot(D3); title('原始信號(hào)中的高頻信號(hào)成分1'); grid on;
xlabel('采樣點(diǎn)'); ylabel('振幅');
subplot(2,2,3); plot(D2); title('原始信號(hào)中的高頻信號(hào)成分2'); grid on;
xlabel('采樣點(diǎn)'); ylabel('振幅');
subplot(2,2,4); plot(D1); title('原始信號(hào)中的高頻信號(hào)成分3'); grid on;
xlabel('采樣點(diǎn)'); ylabel('振幅');
suptitle('小波域→時(shí)域');
% 重構(gòu)原始信號(hào): 濾波后單純的恢復(fù)原始信號(hào)
% 命令: waverec
s_rec = waverec(C,L,'db1');
figure(3);
subplot(1,2,1); plot(s); title('原始信號(hào)'); grid on;
xlabel('采樣點(diǎn)'); ylabel('振幅');
subplot(1,2,2); plot(s_rec); title('重構(gòu)原始信號(hào)'); grid on;
xlabel('采樣點(diǎn)'); ylabel('振幅');
suptitle('時(shí)域原始與重構(gòu)原始信號(hào)');
figure(1)效果:
圖3:一維多級(jí)分解后小波(域)系數(shù)圖像
figure(2)效果:
圖4:一維多級(jí)分解后系數(shù)重構(gòu)時(shí)域子信號(hào)
figure(3)效果:
圖5:原始信號(hào)與一維多級(jí)分解后重構(gòu)信號(hào)對(duì)比
函數(shù)語(yǔ)法總結(jié)
語(yǔ)法總結(jié)按照上面的2個(gè)例子(一維離散數(shù)據(jù))進(jìn)行。
(1)首先總結(jié)例1中的函數(shù)語(yǔ)法:
一維1級(jí)分解函數(shù):dwt
[cA1,cD1] = dwt(x,'wavename');
% dwt參數(shù):x是原始信號(hào),'wavename'是自己選的小波基函數(shù)(例如'haar')
% 左邊返回值:cA1低頻近似系數(shù),cD1高頻細(xì)節(jié)系數(shù)。
一維1級(jí)系數(shù)重構(gòu)函數(shù):upcoef
A1 = upcoef('a', cA1, 'wavename', 1); % 低頻系數(shù)重構(gòu)
D1 = upcoef('d', cD1, 'wavename', 1); % 高頻系數(shù)重構(gòu)
% upcoef參數(shù):'a'表示低頻近似/'d'表示高頻細(xì)節(jié),cA1與cD1系數(shù),1就是當(dāng)前是1解分解(不變);
% 左邊返回值:A1是低頻近似系數(shù)的重構(gòu)結(jié)果,D1是高頻細(xì)節(jié)系數(shù)的重構(gòu)結(jié)果。
一維1級(jí)分解重構(gòu)/恢復(fù)信號(hào)函數(shù):idwt
s_rec = idwt(cA1,cD1,'wavename');
% idwt參數(shù):cA1和cD1就是dwt分解得到的低頻近似和高頻細(xì)節(jié)的系數(shù);
% 左邊返回值:s_rec就是重構(gòu)/恢復(fù)的原始信號(hào)。
(2)總結(jié)例2中的函數(shù)語(yǔ)法:
一維多級(jí)分解函數(shù):wavedec
[C,L] = wavedec(s, N, 'wavename');
% wavedec參數(shù):s是原始信號(hào),N是分解級(jí)數(shù),'wavename'小波基函數(shù);
% 左邊返回值:C是小波分解后的各個(gè)系數(shù),L是相應(yīng)小波系數(shù)的個(gè)數(shù);
這個(gè)函數(shù)的返回值可能憑語(yǔ)言不好理解,直接看圖6示意圖就很好理解。注意到:C中是所有分解出來(lái)的東西(系數(shù))的一個(gè)大匯總,即都在一個(gè)大矩陣?yán)?#xff01;所以就需要從C中把各個(gè)系數(shù)提取出來(lái)。
圖6:wavedec返回值C和L的含義示意圖
一維多級(jí)系數(shù)提取函數(shù):appcoef與detcoef
% 以3級(jí)分解為例:
[C,L] = wavedec(s,3,'db1');
% 各級(jí)系數(shù)提取:
% 最后剩的那個(gè)低頻近似部分(1個(gè))的系數(shù)提取:appcoef
cA3 = appcoef(C, L, 'wavename', N);
% appcoef參數(shù):C和L就是上面分解出來(lái)的東西,'wavename'和分解用的小波基一致,N和分解的級(jí)數(shù)一致;
% 左邊返回值:最后那個(gè)低頻近似的系數(shù)(從C和L中提取出來(lái)了)。
% 每一級(jí)中的高頻細(xì)節(jié)部分(N個(gè))的系數(shù)提取:detcoef
cD3 = detcoef(C, L, 3);
cD2 = detcoef(C, L, 2);
cD1 = detcoef(C, L, 1);
% detcoef參數(shù):C和L和同意,后面的數(shù)字就是分解的層數(shù);
% 左邊返回值:每一級(jí)高頻近似部分的系數(shù)(從C和L中提取出來(lái))
說明:分解N級(jí),要做N個(gè)高頻細(xì)節(jié)部分的的系數(shù)提取,低頻近似只用做一次!
一維多級(jí)系數(shù)重構(gòu)函數(shù):wrcoef
% 以3級(jí)分解為例:
[C,L] = wavedec(s,3,'db1');
% 直接上實(shí)例說明:'wavename'用的是'db1'
A3 = wrcoef('a',C,L,'db1',3); % 最后那個(gè)低頻近似部分的系數(shù)重構(gòu)
D3 = wrcoef('d',C,L,'db1',3); % 3級(jí)高頻細(xì)節(jié)部分系數(shù)重構(gòu)
D2 = wrcoef('d',C,L,'db1',2); % 2級(jí)高頻細(xì)節(jié)部分系數(shù)重構(gòu)
D1 = wrcoef('d',C,L,'db1',1); % 1級(jí)高頻細(xì)節(jié)部分系數(shù)重構(gòu)
% wrcoef參數(shù):'a'或'd'代表"低頻近似"或"高頻細(xì)節(jié)",C和L同意,最后的數(shù)字是該部分所在的級(jí)數(shù);
% 左邊返回指:各個(gè)部分系數(shù)重構(gòu)的結(jié)果。
說明:分解N級(jí),要做N個(gè)高頻細(xì)節(jié)部分的的系數(shù)重構(gòu),低頻近似只用做一次!
一維多級(jí)分解重構(gòu)/恢復(fù)信號(hào)函數(shù):waverec
s_rec = waverec(C,L,'wavename');
% waverec參數(shù):C和L還是同意,'wavename'和上面用的小波基保持一致;
% 左邊返回值:s_rec就是重構(gòu)/恢復(fù)的原始信號(hào)。
注意:重構(gòu)/恢復(fù)原始信號(hào),用的是分解得到的系數(shù)!而不是系數(shù)重構(gòu)后的東西。
至此,一維離散小波1級(jí)和多級(jí)分解所有會(huì)用到的函數(shù)就都介紹完畢了!以表總結(jié):
一維1級(jí)分解
一維多級(jí)分解
分解函數(shù)
dwt
wavedec
系數(shù)提取函數(shù)
不需要
appcoef 和 detcoef
系數(shù)重構(gòu)函數(shù)
upcoef
wrcoef
重構(gòu)/恢復(fù)信號(hào)函數(shù)
idwt
waverec
總結(jié)
以上是生活随笔為你收集整理的Java 离散小波变换公式_一维离散小波变换函数使用总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电大实训平台计算机专业考核答题,新疆电大
- 下一篇: Java+Kafka消息队列