加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转载]小波变换MATLAB程序

(2012-06-13 09:28:04)
标签:

转载

原文地址:小波变换MATLAB程序作者:lqtxy25
function [LL HL LH HH] = DWT2(X,dim,lpd,hpd)
%function:[LL HL LH HH] = DWT2(X,dim,lpd,hpd)
%************函数功能*************
%对二维信号X(m,n)进行离散小波变换,注:m、n均为偶数
%************输入参量*************
%X ------ 待处理的二维信号,大小为m*n
%lpd ---- 低通滤波器,默认为(0.5,0.5)
%hpd ---- 高通滤波器,默认为(-0.5,0.5)
%dim ---- 小波分解级数,默认为1
%*************输出参量************
%LL ----- 低频部分的小波分解系数,大小为(m/2,n/2)
%HL ----- 垂直方向的小波分解系数,大小为(m/2,n/2)
%LH ----- 水平方向的小波分解系数,大小为(m/2,n/2)
%HH ----- 对角线方向的小波分解系数,大小为(m/2,n/2)
%lq2009.12.20

%========================================================================
%预警处理:
%=======================================================================
if (nargin < 1)
    error('not enough inputs arguments');
elseif(nargin > 4)
    error('too many inputs arguments');
end

if (nargin == 1)
   dim = 1;
   lpd = [0.5 0.5];
   hpd = [-0.5 0.5];  
end
if (nargin == 2)
   lpd = [0.5 0.5];
   hpd = [-0.5 0.5];  
end


%========================================================================
%二维小波变换:
%=======================================================================
%对矩阵X的每一行进行一维小波变换
[m n] = size(X);
for i = 1:m
    x1 = X(i,:);
    [cAx1,cDx1] = DWT1(x1,1,lpd,hpd);
    X(i,:) = [cAx1,cDx1];                %将分解系数存入X中,得到(L,H)
end

%对一维行小波变换后X的每一列进行一维小波变换
for i = 1:n
    x2 = X(:,j);
    [cAx2,cDx2] = DWT1(x2,1,lpd,hpd);
    X(:,i) = [cAx2;cDx2];               %将分解系数存入X中,得到(LL,HL;LH,HH)
end

%LL HL LH HH赋值
LL = X(1:m/2,1:n/2);                   % LL是矩阵x的左上角部分
HL = X(1:m/2,n/2+1:n);                 % HL是矩阵x的右上角部分
LH = X(m/2+1:m,1:n/2);                 % LH是矩阵x的左下角部分
HH = X(m/2+1:m,n/2+1:n);               % HH是矩阵x的右下角部分


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%





function [coefA,coefD] = DWT1(x,dim,lpd,hpd)
%function:[coefA coefD] = DWT1(x,dim,lpd,hpd)
%*************函数功能*************
%对一维信号x进行dim级的离散小波变换
%*************输入参量*************
%x ------ 待处理的一维信号
%lpd ---- 低通滤波器,默认为(0.5,0.5)
%hpd ---- 高通滤波器,默认为(-0.5,0.5)
%dim ---- 小波分解级数,默认为1
%*************输出参量*************
%coefA -- 平均部分的小波分解系数
%coefD -- 细节部分的小波分解系数
%lq 2009.12.20


%========================================================================
%预警处理:
%=======================================================================
if (nargin < 1 || nargin > 4)
    return;
end

if (nargin == 1)
   dim = 1;
   lpd = [0.5 0.5];
   hpd = [-0.5 0.5];   
end
if (nargin == 2)
   lpd = [0.5 0.5];
   hpd = [-0.5 0.5];   
end

%==========================================================================
%一维小波变换
%=======================================================================
coefA = x;
coefD = [];

for i = 1:dim
    cvl = conv(coefA,lpd);      %低通滤波
    dnl = DnSpl(cvl);           %通过下抽样得到平均部分的小波分解系数
    cvh = conv(coefA,hpd);      %高通滤波
    dnh = DnSpl(cvh);           %通过下抽样得到细节部分的小波分解系数
    coefA = dnl;                %经下抽样后的平均部分的小波系数作为下一次分解的信号
    coefD = [coefD dnh];        %经下抽样后的细节部分的小波系数保存在coefD中
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


function dnx = DnSpl(x)
%function:dnx = DnSpl(x)
%*************函数功能*************
%对一维信号x进行下抽样处理,输出序列dnx,即取x位于偶数位上的数值
%*************输入参量*************
%x ------ 待处理的一维信号
%*************输出参量*************
%dnx ---- x经下抽样后的输出序列

n = length(x);
n2 = floor(n/2);
for i = 1:n2
    dnx(i) = x(2*i);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有