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

波变换

开发平台:

Matlab

  1. function varargout = swt(x,n,varargin)
  2. %SWT Discrete stationary wavelet transform 1-D.
  3. %   SWT performs a multilevel 1-D stationary wavelet decomposition
  4. %   using either a specific orthogonal wavelet ('wname' see 
  5. %   WFILTERS for more information) or specific orthogonal wavelet 
  6. %   decomposition filters.
  7. %
  8. %   SWC = SWT(X,N,'wname') computes the stationary wavelet
  9. %   decomposition of the signal X at level N, using 'wname'.
  10. %   N must be a strictly positive integer (see WMAXLEV for more
  11. %   information). 2^N must divide length(X).
  12. %
  13. %   SWC = SWT(X,N,Lo_D,Hi_D) computes the stationary wavelet
  14. %   decomposition as above given these filters as input: 
  15. %     Lo_D is the decomposition low-pass filter and
  16. %     Hi_D is the decomposition high-pass filter.
  17. %     Lo_D and Hi_D must be the same length.
  18. %
  19. %   Output matrix SWC contains the vectors of coefficients  
  20. %   stored row-wise: 
  21. %   for 1 <= i <= N, SWC(i,:) contains the detail 
  22. %   coefficients of level i and
  23. %   SWC(N+1,:) contains the approximation coefficients of 
  24. %   level N.
  25. %
  26. %   [SWA,SWD] = SWT(...) computes approximations, SWA, and
  27. %   details, SWD, stationary wavelet coefficients. 
  28. %   The vectors of coefficients are stored row-wise: 
  29. %   for 1 <= i <= N,
  30. %   SWA(i,:) contains the approximation coefficients of level i,
  31. %   SWD(i,:) contains the detail coefficients of level i.
  32. %
  33. %   See also DWT, WAVEDEC.
  34. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 02-Oct-95.
  35. %   Last Revision: 14-May-2003.
  36. %   Copyright 1995-2004 The MathWorks, Inc.
  37. %   $Revision: 1.5.4.2 $  $Date: 2004/03/15 22:41:47 $
  38. % Check arguments.
  39. nbIn = nargin;
  40. if nbIn < 3
  41.   error('Not enough input arguments.');
  42. elseif nbIn > 4
  43.   error('Too many input arguments.');
  44. end
  45. if errargt(mfilename,n,'int'), error('*'), end
  46. % Use row vector.
  47. x = x(:)';
  48. s = length(x);
  49. pow = 2^n;
  50. if rem(s,pow)>0
  51.     sOK = ceil(s/pow)*pow;
  52.     msg = strvcat(...
  53.             ['The level of decomposition ' int2str(n)],...
  54.             ['and the length of the signal ' int2str(s)],...
  55.             'are not compatible.',...
  56.             ['Suggested length: ' int2str(sOK)],...
  57.             '(see Signal Extension Tool)', ...
  58.             ' ', ...
  59.             ['2^Level has to divide the length of the signal.'] ...
  60.             );
  61.     errargt(mfilename,msg,'msg');
  62.     varargout = {[] };
  63.     return
  64. end
  65. % Compute decomposition filters.
  66. if nargin==3
  67.     [lo,hi] = wfilters(varargin{1},'d');
  68. else
  69.     lo = varargin{1};   hi = varargin{2};
  70. end
  71. % Set DWT_Mode to 'per'.
  72. old_modeDWT = dwtmode('status','nodisp');
  73. modeDWT = 'per';
  74. dwtmode(modeDWT,'nodisp');
  75. % Compute stationary wavelet coefficients.
  76. evenoddVal = 0;
  77. evenLEN    = 1;
  78. swd = zeros(n,s);
  79. swa = zeros(n,s);
  80. for k = 1:n
  81.     % Extension.
  82.     lf = length(lo);
  83.     x  = wextend('1D',modeDWT,x,lf/2);
  84.     % Decomposition.
  85.     swd(k,:) = wkeep1(wconv1(x,hi),s,lf+1);
  86.     swa(k,:) = wkeep1(wconv1(x,lo),s,lf+1);
  87.     % upsample filters.
  88.     lo = dyadup(lo,evenoddVal,evenLEN);
  89.     hi = dyadup(hi,evenoddVal,evenLEN);
  90.     % New value of x.
  91.     x = swa(k,:);
  92. end
  93. if nargout==1
  94.     varargout{1} = [swd ; swa(n,:)];
  95. elseif nargout==2
  96.     varargout = {swa,swd};
  97. end     
  98. % Restore DWT_Mode.
  99. dwtmode(old_modeDWT,'nodisp');