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

波变换

开发平台:

Matlab

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