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

波变换

开发平台:

Matlab

  1. function [a,h,v,d] = dwtper2(x,varargin)
  2. %DWTPER2  Single-level discrete 2-D wavelet transform (periodized).
  3. %   [CA,CH,CV,CD] = DWTPER2(X,'wname') computes the approximation
  4. %   coefficients matrix CA and details coefficients matrices 
  5. %   CH, CV, CD, obtained by periodized wavelet decomposition 
  6. %   of the input matrix X.
  7. %   'wname' is a string containing the wavelet name
  8. %   (see WFILTERS).
  9. %
  10. %   Instead of giving the wavelet name, you can give
  11. %   the filters. When used with three arguments: 
  12. %   [CA,CH,CV,CD] = DWTPER2(X,Lo_D,Hi_D),
  13. %   Lo_D is the decomposition low-pass filter and
  14. %   Hi_D is the decomposition high-pass filter.
  15. %
  16. %   If sx = size(X) then
  17. %      size(CA) = size(CH) = size(CV) = size(CD) = CEIL(sx/2).
  18. %
  19. %   See also DWT2, IDWTPER2.
  20. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  21. %   Last Revision: 07-May-2003.
  22. %   Copyright 1995-2004 The MathWorks, Inc.
  23. % $Revision: 1.12.4.2 $
  24. % Check arguments.
  25. if errargn(mfilename,nargin,[2 3],nargout,[0,1,4]), error('*'), end
  26. if nargin==2
  27.     [Lo_D,Hi_D] = wfilters(varargin{1},'d');
  28. else
  29.     Lo_D = varargin{1}; Hi_D = varargin{2};
  30. end
  31. % Periodization.
  32. sx = size(x); rx = sx(1); cx = sx(2);
  33. lf = length(Lo_D);
  34. if rem(rx,2) , x(rx+1,:) = x(rx,:); rx = rx+1; end
  35. I = [rx-lf+1:rx , 1:rx , 1:lf];
  36. if rx<lf
  37.     I = mod(I,rx);
  38.     I(I==0) = rx;
  39. end
  40. x = x(I,:);
  41. if rem(cx,2) , x(:,cx+1) = x(:,cx); cx = cx+1; end
  42. I = [cx-lf+1:cx , 1:cx , 1:lf];
  43. if cx<lf
  44.     I = mod(I,cx);
  45.     I(I==0) = cx;
  46. end
  47. x = x(:,I);
  48. % Decomposition.
  49. sp = ceil(sx/2);
  50. y = dyaddown(conv2(x,Lo_D),'c');
  51. a = wkeep2(dyaddown(conv2(y,Lo_D'),'r'),sp);
  52. h = wkeep2(dyaddown(conv2(y,Hi_D'),'r'),sp);
  53. y = dyaddown(conv2(x,Hi_D),'c');
  54. v = wkeep2(dyaddown(conv2(y,Lo_D'),'r'),sp);
  55. d = wkeep2(dyaddown(conv2(y,Hi_D'),'r'),sp);