lwt2.m
上传用户:haiyisale
上传日期:2013-01-09
资源大小:3246k
文件大小:4k
源码类别:

波变换

开发平台:

Matlab

  1. function varargout = lwt2(x,LS,varargin)
  2. %LWT2 Lifting wavelet decomposition 2-D.
  3. %   LWT2 performs a 2-D lifting wavelet decomposition
  4. %   with respect to a particular lifted wavelet that you specify.
  5. %
  6. %   [CA,CH,CV,CD] = LWT2(X,W) computes the approximation
  7. %   coefficients matrix CA and detail coefficients matrices
  8. %   CH, CV and CD obtained by a lifting wavelet decomposition, 
  9. %   of the matrix X. W is a lifted wavelet name (see LIFTWAVE).
  10. %
  11. %   X_InPlace = LWT2(X,LS) computes the approximation and
  12. %   detail coefficients. These coefficients are stored in-place:
  13. %       CA = X_InPlace(1:2:end,1:2:end)
  14. %       CH = X_InPlace(2:2:end,1:2:end)
  15. %       CV = X_InPlace(1:2:end,2:2:end)
  16. %       CD = X_InPlace(2:2:end,2:2:end)
  17. %
  18. %   LWT2(X,W,LEVEL) computes the lifting wavelet decomposition
  19. %   at level LEVEL.
  20. %
  21. %   X_InPlace = LWT2(X,W,LEVEL,'typeDEC',typeDEC) or
  22. %   [CA,CH,CV,CD] = LWT2(X,W,LEVEL,'typeDEC',typeDEC) with
  23. %   typeDEC = 'w' or 'wp' compute the wavelet or the
  24. %   wavelet packet decomposition using lifting at level LEVEL.
  25. %
  26. %   Instead of a lifted wavelet name, you may use the associated
  27. %   lifting scheme LS:
  28. %     LWT2(X,LS,...) instead of LWT2(X,W,...).
  29. %
  30. %   For more information about lifting schemes type: lsinfo.
  31. %
  32. %   See also ILWT2.
  33. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 02-Feb-2000.
  34. %   Last Revision: 10-Jul-2003.
  35. %   Copyright 1995-2004 The MathWorks, Inc.
  36. %   $Revision: 1.1.6.3 $  $Date: 2004/04/13 00:39:58 $
  37. % Check arguments.
  38. nbIn = nargin;
  39. switch nbIn
  40.     case {2,3,5} , 
  41.     case {0,1} , error('Not enough input arguments.');
  42.     case {4}   , error('Invalid number of input arguments.');
  43.     otherwise  , error('Too many input arguments.');
  44. end
  45. nbOut = nargout;
  46. switch nbOut
  47.     case {0,1,4,5} , 
  48.     case {2,3} , error('Invalid number of output arguments.');
  49.     otherwise  , error('Too many output arguments.');
  50. end
  51. % Default: level and typeDEC.
  52. level = 1; typeDEC = 'w';
  53. firstIdxAPP = 1; firstIdxDET = 1+mod(firstIdxAPP,2);
  54. if nargin>2
  55.     level = varargin{1};
  56.     for k = 2:2:length(varargin)-1
  57.       argName = lower( varargin{k});
  58.       switch argName
  59.         case 'typedec' , typeDEC = varargin{k+1};
  60.       end
  61.     end
  62. end
  63. if ischar(LS) , LS = liftwave(LS); end
  64. %===================%
  65. % LIFTING ALGORITHM %
  66. %===================%
  67. % Splitting.
  68. L = x(:,firstIdxAPP:2:end);
  69. H = x(:,firstIdxDET:2:end);
  70. sL = size(L);
  71. sH = size(H);
  72. % Lifting.
  73. NBL = size(LS,1);
  74. LStype = LS{NBL,3};
  75. for k = 1:NBL-1
  76.     liftTYPE = LS{k,1};
  77.     liftFILT = LS{k,2};
  78.     DF       = LS{k,3};
  79.     switch liftTYPE
  80.       case 'p' , L = L + lsupdate('r',H,liftFILT,DF,sL,LStype);
  81.       case 'd' , H = H + lsupdate('r',L,liftFILT,DF,sH,LStype);
  82.     end
  83. end
  84. % Splitting.
  85. a = L(firstIdxAPP:2:end,:); h = L(firstIdxDET:2:end,:); clear L
  86. v = H(firstIdxAPP:2:end,:); d = H(firstIdxDET:2:end,:); clear H
  87. sa = size(a); sh = size(h);
  88. sv = size(v); sd = size(d);
  89. % Lifting.
  90. for k = 1:NBL-1
  91.     liftTYPE = LS{k,1};
  92.     liftFILT = LS{k,2};
  93.     DF       = LS{k,3};
  94.     switch liftTYPE
  95.       case 'p'
  96.         a = a + lsupdate('c',h,liftFILT,DF,sa,LStype);
  97.         v = v + lsupdate('c',d,liftFILT,DF,sv,LStype);
  98.       case 'd'
  99.         h = h + lsupdate('c',a,liftFILT,DF,sh,LStype);
  100.         d = d + lsupdate('c',v,liftFILT,DF,sd,LStype);
  101.     end
  102. end
  103. % Normalization.
  104. if isempty(LStype)
  105.     a = LS{end,1}*LS{end,1}*a;
  106.     h = LS{end,1}*LS{end,2}*h;
  107.     v = LS{end,2}*LS{end,1}*v;
  108.     d = LS{end,2}*LS{end,2}*d;
  109. end
  110. %========================================================================%
  111. % Recursion if level > 1.
  112. if level>1
  113.    level = level-1;
  114.    a = lwt2(a,LS,level,'typeDEC',typeDEC);
  115.    if isequal(typeDEC,'wp')
  116.        h = lwt2(h,LS,level,'typeDEC',typeDEC);
  117.        v = lwt2(v,LS,level,'typeDEC',typeDEC);
  118.        d = lwt2(d,LS,level,'typeDEC',typeDEC);
  119.    end
  120. end
  121. % Store in place.
  122. x(firstIdxAPP:2:end,firstIdxAPP:2:end) = a;
  123. x(firstIdxDET:2:end,firstIdxAPP:2:end) = h;
  124. x(firstIdxAPP:2:end,firstIdxDET:2:end) = v;
  125. x(firstIdxDET:2:end,firstIdxDET:2:end) = d;
  126. switch nargout
  127.   case 1 , varargout = {x};
  128.   case 4 , varargout = {a,h,v,d};
  129.   case 5 , varargout = {x,a,h,v,d};
  130. end