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

波变换

开发平台:

Matlab

  1. function x = ilwt(varargin)
  2. %ILWT Inverse 1-D lifting wavelet transform.
  3. %   ILWT performs a 1-D wavelet reconstruction using lifting
  4. %   with respect to a particular lifted wavelet that you specify.
  5. %
  6. %   X = ILWT(AD_In_Place,W) computes the reconstructed vector X
  7. %   using the approximation and detail coefficients vector 
  8. %   AD_In_Place obtained by a lifting wavelet decomposition.
  9. %   W is a lifted wavelet name (see LIFTWAVE).
  10. %
  11. %   X = ILWT(CA,CD,W) computes the reconstructed vector X
  12. %   using the approximation coefficients vector CA and detail
  13. %   coefficients vector CD obtained by a lifting wavelet 
  14. %   decomposition.
  15. %
  16. %   X = ILWT(AD_In_Place,W,LEVEL) or X = ILWT(CA,CD,W,LEVEL)
  17. %   compute the lifting wavelet reconstruction, at level LEVEL.
  18. %
  19. %   X = ILWT(AD_In_Place,W,LEVEL,'typeDEC',typeDEC) or
  20. %   X = ILWT(CA,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 = ILWT(...,LS,...) instead of X = ILWT(...,W,...).
  27. %
  28. %   For more information about lifting schemes type: lsinfo.
  29. %
  30. %   See also LWT.
  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:42 $
  35. % Check arguments.
  36. nbIn = nargin;
  37. if nbIn < 2
  38.   error('Not enough input arguments.');
  39. elseif nbIn > 6
  40.   error('Too many input arguments.');
  41. end
  42. % Default: level and typeDEC.
  43. level = 1; typeDEC = 'w';
  44. firstIdxAPP = 1; firstIdxDET = 1+mod(firstIdxAPP,2);
  45. % Check arguments.
  46. x_in_place = iscell(varargin{2}) || ischar(varargin{2});
  47. if x_in_place
  48.     [x,LS] = deal(varargin{1:2});
  49.     nextArg = 3;
  50. else
  51.     [a,d,LS] = deal(varargin{1:3});
  52.     x = zeros(1,length(a)+length(d));
  53.     x(firstIdxAPP:2:end) = a;
  54.     x(firstIdxDET:2:end) = d;
  55.     if (size(a,1)>1) || (size(d,1)>1) , x = x'; end
  56.     clear a d
  57.     nextArg = 4;
  58. end
  59. if nargin>=nextArg
  60.     level = varargin{nextArg};
  61.     for k = nextArg+1:2:length(varargin)-1
  62.       argName = lower( varargin{k});
  63.       switch argName
  64.         case 'typedec' , typeDEC = varargin{k+1};
  65.       end
  66.     end
  67. end
  68. if ischar(LS) , LS = liftwave(LS); end
  69. % Splitting.
  70. lx = length(x);
  71. idxAPP = firstIdxAPP:2:lx;
  72. idxDET = firstIdxDET:2:lx;
  73. lenAPP = length(idxAPP);
  74. lenDET = length(idxDET);
  75. % Recursion if level > 1.
  76. if level>1
  77.    x(idxAPP) = ilwt(x(idxAPP),LS,level-1,'typeDEC',typeDEC);
  78.    if isequal(typeDEC,'wp')
  79.        x(idxDET) = ilwt(x(idxDET),LS,level-1,'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.     x(idxAPP) = x(idxAPP)/LS{NBL,1};
  90.     x(idxDET) = x(idxDET)/LS{NBL,2};
  91. end
  92. % Reverse Lifting.
  93. for k = NBL-1:-1:1
  94.     liftTYPE = LS{k,1};
  95.     liftFILT = -LS{k,2};
  96.     DF       = LS{k,3};
  97.     switch liftTYPE
  98.        case 'p'
  99.            x(idxAPP) = x(idxAPP) + ...
  100.                lsupdate('v',x(idxDET),liftFILT,DF,lenAPP,LStype);
  101.        case 'd'
  102.            x(idxDET) = x(idxDET) + ...
  103.                lsupdate('v',x(idxAPP),liftFILT,DF,lenDET,LStype);
  104.     end
  105. end
  106. %=========================================================================%