matlab小波变换、离散小波变换函数使用

matlab中,连续小波变换、离散小波变换函数使用比较复杂,最近做了个总结。

参考连接

参考1:https://www.jianshu.com/p/56733f6c0a10

参考2:小波变换工具箱(7页)-原创力文档

参考3:《Matlab信号处理》 沈再阳,清华大学出版社,第8章

注意:以下所有函数均为matlab 2020a环境中测试,更早的版本未做测试。

一、连续小波变换

1.1 正变换cwt

1.1.1 语法

语法如下,详细用法可通过命令【doc cwt】详细了解,一般使用时只需用其中两个参数即可:

①wname:小波基的名称:分别对应为:

wname的值小波基
morseMorse
amorMorlet(Gabor)
bumpBump

②fs:x的抽样频率。当给定fs时,画出的时频图的XY轴分别为实际的时间和频率;不指定时,画出的时归一化频率和采样点。

1.1.2 示例

cwt函数 用法比较简单,可以举个简单例子如下:其中锥形虚线为影响锥,影响锥范围内的值可信度较高:

clc; clear; close all;

load sumsin;
x = sumsin(1:500);
x = x + randn(1, length(x));
Fs = 10;
figure;     cwt(x, 'amor');     % 不指定Fs
figure;     cwt(x, 'amor', Fs);     % 指定Fs

1.2 反变换icwt

1.2 .1 语法

用法基本同正变换,其中参数说明如下:

wt:正变换得到的矩阵;

xrec:反变换重构的信号。注意重构的信号和原信号还是有区别的。

 1.2.2 示例

clc; clear; close all;

load sumsin;
x = sumsin(1:500);
x = x + randn(1, length(x));
Fs = 10;
[wt, f] = cwt(x, 'amor', Fs);     % 指定Fs
xrec1 = icwt(wt, 'amor');       % 反变换,指定小波基
xrec2 = icwt(wt, f, [0.06, 0.31]);       % 反变换,指定频率范围可实现滤波效果。

subplot(311);   plot(x);        title('x');
subplot(312);   plot(xrec1);    title('全频率小波逆变换')
subplot(313);   plot(xrec2);    title('针对部分频率范围进行小波逆变换')

二、离散小波变换 

2.1 函数总结

2.1.1 函数列表

 

 2.1.2 小波分解图

2.1.2.1 小波分解的算法步骤

2.1.2.2  小波重构的算法步骤

其实就是上采样后分别通过低通、高通滤波器。

 2.2 小波基总结

使用离散小波变换时,经常会设置错小波基函数。因为离散小波变换的小波基参数wname的格式应给为【wavelet_name】+[number]。具体总结如下:

wname的值小波基名称N取值
morlMorlet小波-
mexh墨西哥草帽小波-
meyrMeyer小波-
haarHaar小波-
dbN紧支集正交小波1,2,3,...
symN近似对称的紧支集正交小波通常取2~8
coifNCoiflet小波1~5
biorNr,Nd双正交样条小波。r-重构;d-分解1~6

2.3 示例

2.3.1 dwt、idwt

clear all;
load sumsin;
x = sumsin(1:500);
[cA, cD] = dwt(x, 'db2');
x_idwt = idwt(cA, cD, 'db2');

subplot(411);   plot(x);    title('x');
subplot(412);   plot(cA);   title('cA of dwt'); xlim([1, length(x)]);
subplot(413);   plot(cD);   title('cD of dwt'); xlim([1, length(x)]);
subplot(414);   plot(x_idwt);   title('idwt'); xlim([1, length(x)]);

 2.3.2 wavedec、waverec、wrcoef

clear; 

load sumsin;
x = sumsin(1:500);
[c, l] = wavedec(x, 3, 'db3');
subplot(521);	plot(x);    title('x');   xlim([1, length(x)]);

xx = waverec(c,l,'db3');
subplot(522);	plot(x);    title('waverec重构信号');   xlim([1, length(x)]);

subplot(523);   plot(c);    title('wavedec-3个尺度分解结果');   xlim([1, length(x)]);

for i=1:3
    a1 = wrcoef('a', c, l, 'db3', i);      % a-低频重构,d-高频重构
    subplot(5,2, 2*i + 3);   plot(a1);    
    title(['wrcoef-从第', num2str(i),'个尺度的低频分量重构到0级']);   xlim([1, length(x)]);
end

for i=1:3
    a1 = wrcoef('d', c, l, 'db3', i);      % a-低频重构,d-高频重构
    subplot(5,2, 2*i + 4);   plot(a1);    
    title(['wrcoef-从第', num2str(i),'个尺度的高频分量重构到0级']);   xlim([1, length(x)]);
end

 2.2.3 upwlev、upcoef

小波变换的图像处理%MATLAB2维小波变换经典程序 % FWT_DB.M; % 此示意程序用DWT实现二维小波变换 % 编程时间2004-4-10,编程人沙威 %%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%% clear; clc; T=256; % 图像维数 SUB_T=T/2; % 子图维数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1.调原始图像矩阵 load wbarb; % 下载图像 f=X; % 原始图像 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 2.进行二维小波分解 l=wfilters('db10','l'); % db10(消失矩为10)低通分解滤波器冲击响应(长度为20) L=T-length(l); l_zeros=[l,zeros(1,L)]; % 矩阵行数与输入图像一致,为2的整数幂 h=wfilters('db10','h'); % db10(消失矩为10)高通分解滤波器冲击响应(长度为20) h_zeros=[h,zeros(1,L)]; % 矩阵行数与输入图像一致,为2的整数幂 for i=1:T; % 列变换 row(1:SUB_T,i)=dyaddown( ifft( fft(l_zeros).*fft(f(:,i)') ) ).'; % 圆周卷积FFT row(SUB_T+1:T,i)=dyaddown( ifft( fft(h_zeros).*fft(f(:,i)') ) ).'; % 圆周卷积FFT end; for j=1:T; % 行变换 line(j,1:SUB_T)=dyaddown( ifft( fft(l_zeros).*fft(row(j,:)) ) ); % 圆周卷积FFT line(j,SUB_T+1:T)=dyaddown( ifft( fft(h_zeros).*fft(row(j,:)) ) ); % 圆周卷积FFT end; decompose_pic=line; % 分解矩阵 % 图像分为四块 lt_pic=decompose_pic(1:SUB_T,1:SUB_T); % 在矩阵左上方为低频分量--fi(x)*fi(y) rt_pic=decompose_pic(1:SUB_T,SUB_T+1:T); % 矩阵右上为--fi(x)*psi(y) lb_pic=decompose_pic(SUB_T+1:T,1:SUB_T); % 矩阵左下为--psi(x)*fi(y) rb_pic=decompose_pic(SUB_T+1:T,SUB_T+1:T); % 右下方为高频分量--psi(x)*psi(y) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 3.分解结果显示 figure(1); colormap(map); subplot(2,1,1); image(f); % 原始图像 title('original pic'); subplot(2,1,2); image(abs(decompose_pic)); % 分解后图像 title('decomposed pic'); figure(2); colormap(map); subplot(2,2,1); image(abs(lt_pic)); % 左上方为低频分量--fi(x)*fi(y) title('\Phi(x)*\Phi(y)'); subplot(2,2,2); image(abs(rt_pic)); % 矩阵右上为--fi(x)*psi(y) title('\Phi(x)*\Psi(y)'); subplot(2,2,3); image(abs(lb_pic)); % 矩阵左下为--psi(x)*fi(y) title('\Psi(x)*\Phi(y)'); subplot(2,2,4); image(abs(rb_pic)); % 右下方为高频分量--psi(x)*psi(y) title('\Psi(x)*\Psi(y)'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 5.重构源图像及结果显示 % construct_pic=decompose_matrix'*decompose_pic*decompose_matrix; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% l_re=l_zeros(end:-1:1); % 重构低通滤波 l_r=circshift(l_re',1)'; % 位置调整 h_re=h_zeros(end:-1:1); % 重构高通滤波 h_r=circshift(h_re',1)'; % 位置调整 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% top_pic=[lt_pic,rt_pic]; % 图像上半部分 t=0; for i=1:T; % 行插值低频 if (mod(i,2)==0) topll(i,:)=top_pic(t,:); % 偶数行保持 else t=t+1; topll(i,:)=zeros(1,T); % 奇数行为零 end end; for i=1:T; % 列变换 topcl_re(:,i)=ifft( fft(l_r).*fft(topll(:,i)') )'; % 圆周卷积FFT end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% bottom_pic=[lb_pic,rb_pic]; % 图像下半部分 t=0; for i=1:T; % 行插值高频 if (mod(i,2)==0) bottomlh(i,:)=bottom_pic(t,:); % 偶数行保持 else bottomlh(i,:)=zeros(1,T); % 奇数行为零 t=t+1; end end; for i=1:T; % 列变换 bottomch_re(:,i)=ifft( fft(h_r).*fft(bottomlh(:,i)') )'; % 圆周卷积FFT end; construct1=bottomch_re+topcl_re; % 列变换重构完毕 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% left_pic=construct1(:,1:SUB_T); % 图像左半部分 t=0; for i=1:T; % 列插值低频 if (mod(i,2)==0) leftll(:,i)=left_pic(:,t); % 偶数列保持 else t=t+1; leftll(:,i)=zeros(T,1); % 奇数列为零 end end; for i=1:T; % 行变换 leftcl_re(i,:)=ifft( fft(l_r).*fft(leftll(i,:)) ); % 圆周卷积FFT end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% right_pic=construct1(:,SUB_T+1:T); % 图像右半部分 t=0; for i=1:T; % 列插值高频 if (mod(i,2)==0) rightlh(:,i)=right_pic(:,t); % 偶数列保持 else rightlh(:,i)=zeros(T,1); % 奇数列为零 t=t+1; end end; for i=1:T; % 行变换 rightch_re(i,:)=ifft( fft(h_r).*fft(rightlh(i,:)) ); % 圆周卷积FFT end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% construct_pic=rightch_re+leftcl_re; % 重建全部图像 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 结果显示 figure(3); colormap(map); subplot(2,1,1); image(f); % 源图像显示 title('original pic'); subplot(2,1,2); image(abs(construct_pic)); % 重构源图像显示 title('reconstructed pic'); error=abs(construct_pic-f); % 重构图形与原始图像误值 figure(4); mesh(error); % 误差三维图像 title('absolute error display');
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值