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

波变换

开发平台:

Matlab

  1. function varargout = lwt(x,LS,varargin)
  2. %LWT Lifting wavelet decomposition 1-D.
  3. %   LWT performs a 1-D lifting wavelet decomposition
  4. %   with respect to a particular lifted wavelet that you specify.
  5. %
  6. %   [CA,CD] = LWT(X,W) computes the approximation
  7. %   coefficients vector CA and detail coefficients vector CD,
  8. %   obtained by a lifting wavelet decomposition, of 
  9. %   the vector X. W is a lifted wavelet name (see LIFTWAVE).
  10. %
  11. %   X_InPlace = LWT(X,W) computes the approximation and
  12. %   detail coefficients. These coefficients are stored in-place:
  13. %     CA = X_InPlace(1:2:end) and CD = X_InPlace(2:2:end)
  14. %
  15. %   LWT(X,W,LEVEL) computes the lifting wavelet decomposition 
  16. %   at level LEVEL.
  17. %
  18. %   X_InPlace = LWT(X,W,LEVEL,'typeDEC',typeDEC) or
  19. %   [CA,CD] = LWT(X,W,LEVEL,'typeDEC',typeDEC) with
  20. %   typeDEC = 'w' or 'wp' computes the wavelet or the
  21. %   wavelet packet decomposition using lifting, at level LEVEL.
  22. %
  23. %   Instead of a lifted wavelet name, you may use the associated
  24. %   lifting scheme LS:
  25. %     LWT(X,LS,...) instead of LWT(X,W,...).
  26. %
  27. %   For more information about lifting schemes type: lsinfo.
  28. %
  29. %   See also ILWT.
  30. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 02-Feb-2000.
  31. %   Last Revision: 10-Jul-2003.
  32. %   Copyright 1995-2004 The MathWorks, Inc.
  33. %   $Revision: 1.1.6.3 $  $Date: 2004/04/13 00:39:57 $
  34. % Check arguments.
  35. nbIn = nargin;
  36. switch nbIn
  37.     case {2,3,5} , 
  38.     case {0,1} , error('Not enough input arguments.');
  39.     case {4}   , error('Invalid number of input arguments.');
  40.     otherwise  , error('Too many input arguments.');
  41. end
  42. if nargout>3
  43.     error('Too many output arguments.');
  44. end
  45. % Default: level and typeDEC.
  46. level = 1; 
  47. typeDEC = 'w';
  48. if nargin>2
  49.     level = varargin{1};
  50.     for k = 2:2:length(varargin)-1
  51.         argName = lower( varargin{k});
  52.         switch argName
  53.             case 'typedec' , typeDEC = varargin{k+1};
  54.         end
  55.     end
  56. end
  57. % if level>1
  58. %     msg = nargoutchk(0,1,nargout); error(msg);
  59. % end
  60. if ischar(LS) , LS = liftwave(LS); end
  61. %===================%
  62. % LIFTING ALGORITHM %
  63. %===================%
  64. % Splitting.
  65. lx = length(x);
  66. firstIdxAPP = 1;
  67. firstIdxDET = 1+mod(firstIdxAPP,2);
  68. idxAPP = firstIdxAPP:2:lx;
  69. idxDET = firstIdxDET:2:lx;
  70. lenAPP = length(idxAPP);
  71. lenDET = length(idxDET);
  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' , 
  81.            x(idxAPP) = x(idxAPP) + ...
  82.                lsupdate('v',x(idxDET),liftFILT,DF,lenAPP,LStype);
  83.        case 'd' , 
  84.            x(idxDET) = x(idxDET) + ...
  85.                lsupdate('v',x(idxAPP),liftFILT,DF,lenDET,LStype);
  86.     end
  87. end
  88. % Normalization.
  89. if isempty(LStype)
  90.     x(idxAPP) = LS{NBL,1}*x(idxAPP);
  91.     x(idxDET) = LS{NBL,2}*x(idxDET);
  92. end
  93. %========================================================================%
  94. % Recursion if level > 1.
  95. if level>1
  96.    x(idxAPP) = lwt(x(idxAPP),LS,level-1,'typeDEC',typeDEC);
  97.    if isequal(typeDEC,'wp')
  98.        x(idxDET) = lwt(x(idxDET),LS,level-1,'typeDEC',typeDEC);
  99.    end
  100. end
  101. switch nargout
  102.   case 1 , varargout = {x};
  103.   case 2 , varargout = {x(idxAPP),x(idxDET)};
  104.   case 3 , varargout = {x,x(idxAPP),x(idxDET)};
  105. end