小波变换(matlab)-常见脚本函数


前言

我们可以通过常见的函数toolbox两个办法来制定我们需要的小波变换,因为它与傅里叶不同点在于小波变换不是唯一确定的,例如不同的尺度下做的小波变换会不一样。小波变换的函数有很多,本文给了最常见的几种。在toolbox使用中,也会对比函数,整理各个参数的涵义。下图是常见的小波基函数参数表示和名称,其中的N是可以调节的整数。
在这里插入图片描述


一、小波变换的介绍和理解

小波变换是一种时域变换,是傅里叶分析的发展和延拓。相对于傅里叶变换,它除了是不唯一确定以外,它还很适用于非平稳信号。因为对于傅里叶变换而言,不同的非平稳信号的时域对应的频域都是一样的,这就说明无法从频域角度重构时域信号。再者就是二者的基不一样,小波基是不一样的,可以理解成短时傅里叶变换的窗是会自适应变换的。

二、常用函数

1.wden

wden函数是一种用小波进行一维信号的消噪或压缩的函数。
实例函数和结果如下所示,其中为了防止随机数的种子被固定,需要使其rng重新配置。

%%% wden函数:用小波进行一维信号的消噪或压缩
%%%  XD = wden(X,TPTR,SORH,SCAL,N,'wname')
%1.输入参数SORH=s,软阈值;Sorh=h,硬阈值;
%2.输入参数scal规定了阈值处理随噪声水平的变化:
%SCAL=one,不随噪声水平变化。
%SCAL=mln,根据每一层小波分解的噪声水平估计进行调整。
%SCAL=sln,根据第一层小波分解的噪声水平估计进行调整。
%3.wname是小波函数类型的选用
clc;close all;clear all;
rng('default');                            %随机种子重新设置
seed=2055415866;
snr=3;                                     %设置信噪比;
[xref,x]=wnoise(1,11,snr,seed);            %产生非平稳含噪信号;
N=4;
SCAL='sln';
SORH='s';
xdH=wden(x,'heursure',SORH,SCAL,N,'sym6');  %heursure阈值信号处理;
xdR=wden(x,'rigrsure',SORH,SCAL,N,'sym6');  %rigrsure阈值信号处理;
xdS=wden(x,'sqtwolog',SORH,SCAL,N,'sym6');  %sqtwolog阈值信号处理;
xdM=wden(x,'minimaxi',SORH,SCAL,N,'sym6');  %minimaxi阈值信号处理;
subplot(3,2,1);
plot(xref);title('原始信号');
axis([1,2048,-10,15]);
subplot(3,2,2);
plot(x);title('含噪信号');
axis([1,2048,-10,15]);
subplot(3,2,3);
plot(xdH);xlabel('heursure阈值消噪处理后的信号');
axis([1,2048,-10,15]);
subplot(3,2,4);
plot(xdR);xlabel('rigrsure阈值消噪处理后的信号');
axis([1,2048,-10,15]);
subplot(3,2,5);
plot(xdS);xlabel('sqtwolog阈值消噪处理后的信号');
axis([1,2048,-10,15]);
subplot(3,2,6);
plot(xdM);xlabel('minimaxi阈值消噪处理后的信号');
axis([1,2048,-10,15]);

在这里插入图片描述

2.dwt和idwt

dwt和idwt是一维离散小波(反)变换。其实例和结果如下。其中,小波变换的参数ca1值得是”大概信号”,也就相对于低频,ad1值得是“细节信号”,也就相对于高频。

%%% dwt:单尺度一维离散小波变换
clear all;clc;close all;
% x=4+kron(ones(1,8),[1 -1])+((1:16).^2)/24+0.3*randn(1,16);
seed=2055415866;
snr=3;                                     %设置信噪比;
[xref,x]=wnoise(1,9,snr,seed);            %产生非平稳含噪信号;
[ca1,ad1]=dwt(x,'db2');
s=idwt(ca1,ad1,'db2');
err=norm(x-s);
figure;
subplot(3,2,[1 2]);
plot(x);title('原信号');
subplot(323);
plot(ca1);title('重构低通部分');
subplot(324);
plot(ad1);title('重构高通部分');
subplot(3,2,[5 6]);
plot(s);title(['根据高低通部分再次重构,与原信号的误差:',num2str(err)]);

在这里插入图片描述

3.wavedec和wrcoef

wavedec函数和wrcoef函数也比较常用,wavedec函数是用于小波变换的多层次重构。wrcoef函数是用于对小波系数进行重构。

%%% wavedec函数:多层次单尺度一维小波分解
%%% [C,L]=wavedec(x,N,wname);
%%% [C,L]=wavedec(x,N,Lo_R,Hi_R);
%%% wrcoef函数:对一维小波系数进行单支重构
%%% s=wrcoef('type',C,L,'wname',N)   含N表示对N进行重构
%%% s=wrcoef('type',C,L,Lo_R,Hi_R,N)

它的实例和结果如下。

%%% wavedec函数:多层次单尺度一维小波分解
%%% [C,L]=wavedec(x,N,wname);
%%% [C,L]=wavedec(x,N,Lo_R,Hi_R);
clear all;clc;close all;
% rng('default');                          %随机种子重新设置
seed=2055415866;
snr=3;                                     %设置信噪比;
[xref,x]=wnoise(1,11,snr,seed);            %产生非平稳含噪信号;
wname='db1';
N=3;   %进行3尺度小波分解
%%% wrcoef函数:对一维小波系数进行单支重构
%%% s=wrcoef('type',C,L,'wname',N)   含N表示对N进行重构
%%% s=wrcoef('type',C,L,Lo_R,Hi_R,N)
type='a';   %a是大概approximation(低频);d是细节detail(高频)                 %
[C,L]=wavedec(x,N,wname);
sa=wrcoef(type,C,L,wname,N);               %N不加,默认为3
sd=wrcoef('d',C,L,wname);
figure;
subplot(311);
plot(x);   title('原信号');
subplot(312);
plot(sa);  title('低频重构');
subplot(313);
plot(sd);  title('高频重构');

在这里插入图片描述

4.upwlev

其实upwlev就是将尺度往上返回了一级,其实与手动将wavedec中的N系数减一是等效的。
其实例和结果如下。其中为了体现这一点,程序也验证了这一点。除此之外,也给出了对不同尺度上的低频(高频)的信号重构进行了对比。

clear all;clc;close all;
% load sumsin;
% s=sumsin(1:500);
rng('default');                            %随机种子重新设置
seed=2055415866;
snr=3;                                     %设置信噪比;
[xref,x]=wnoise(1,11,snr,seed);            %产生非平稳含噪信号;
subplot(411);plot(x);
title('原始sumsin信号');
[c,l]=wavedec(x,3,'db1');
subplot(412);plot(c);
title('小波3层重构');
xlabel('尺度为3的低频系数,尺度3,2,1的高频系数');
[c1,l1]=wavedec(x,2,'db1');
subplot(413);plot(c1);
title('小波2层重构');
xlabel('尺度为2的低频系数,尺度2,1的高频系数');
[nc,nl]=upwlev(c,l,'db1');
subplot(414);plot(nc);
title('小波2层重构,用upmlev从3层返回上一尺度');
figure;
for i=1:3
    a(i,:)=wrcoef('a',c,l,'db1',i);
    subplot(3,1,i);plot(a(i,:));title(['对尺度为',num2str(i),'上的低频信号进行重构']);
end
figure;
for i=1:3
    b(i,:)=wrcoef('d',c,l,'db1',i);
    subplot(3,1,i);plot(b(i,:));title(['对尺度为',num2str(i),'上的高频信号进行重构']);
end

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.wpdec和wprec

wpdec和wprec这两个函数是对一维小波包进行分解和重构。
wprcoef函数是对小波包分解系数的重构,这里没有举例,应用到了包结点。

clear all;clc;close all;
%%% wprec和wpdec函数
% load sumsin;
% x=sumsin(1:500);
rng('default');                            %随机种子重新设置
seed=2055415866;
snr=3;                                     %设置信噪比;
[xref,x]=wnoise(1,11,snr,seed);            %产生非平稳含噪信号;
wpt=wpdec(x,3,'db2');
rex=wprec(wpt);
subplot(211);plot(x);title('原信号');
subplot(212);plot(rex);title('分解后再重构的信号');

在这里插入图片描述

三、wavelet toolbox的应用

下节介绍

小波变换的图像处理%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');
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值