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

波变换

开发平台:

Matlab

  1. function [a,h,v,d] = dwt2(x,varargin)
  2. %DWT2 Single-level discrete 2-D wavelet transform.
  3. %   DWT2 performs a single-level 2-D wavelet decomposition
  4. %   with respect to either a particular wavelet ('wname',
  5. %   see WFILTERS for more information) or particular wavelet filters
  6. %   (Lo_D and Hi_D) you specify.
  7. %
  8. %   [CA,CH,CV,CD] = DWT2(X,'wname') computes the approximation
  9. %   coefficients matrix CA and details coefficients matrices 
  10. %   CH, CV, CD, obtained by a wavelet decomposition of the 
  11. %   input matrix X.
  12. %   'wname' is a string containing the wavelet name.
  13. %
  14. %   [CA,CH,CV,CD] = DWT2(X,Lo_D,Hi_D) computes the 2-D wavelet
  15. %   decomposition as above given these filters as input:
  16. %   Lo_D is the decomposition low-pass filter.
  17. %   Hi_D is the decomposition high-pass filter.
  18. %   Lo_D and Hi_D must be the same length.
  19. %
  20. %   Let SX = size(X) and LF = the length of filters; then
  21. %   size(CA) = size(CH) = size(CV) = size(CD) = SA where
  22. %   SA = CEIL(SX/2), if the DWT extension mode is set to
  23. %   periodization. SA = FLOOR((SX+LF-1)/2) for the other
  24. %   extension modes. For the different DWT extension modes, 
  25. %   see DWTMODE.
  26. %
  27. %   [CA,CH,CV,CD] = DWT2(...,'mode',MODE) computes the wavelet 
  28. %   decomposition with the extension mode MODE you specify.
  29. %   MODE is a string containing the extension mode.
  30. %   Example: 
  31. %     [ca,ch,cv,cd] = dwt2(x,'db1','mode','sym');
  32. %
  33. %   See also DWTMODE, IDWT2, WAVEDEC2, WAVEINFO.
  34. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  35. %   Last Revision: 19-May-2003.
  36. %   Copyright 1995-2004 The MathWorks, Inc.
  37. % $Revision: 1.15.4.2 $
  38. % Check arguments.
  39. nbIn = nargin;
  40. if nbIn < 2
  41.   error('Not enough input arguments.');
  42. elseif nbIn > 7
  43.   error('Too many input arguments.');
  44. end
  45. if ischar(varargin{1})
  46.     [Lo_D,Hi_D] = wfilters(varargin{1},'d'); next = 2;
  47. else
  48.     Lo_D = varargin{1}; Hi_D = varargin{2};  next = 3;
  49. end
  50. % Check arguments for Extension and Shift.
  51. global DWT_Attribute
  52. if isempty(DWT_Attribute)
  53.     DWT_Attribute = dwtmode('get');
  54. end
  55. dwtEXTM = DWT_Attribute.extMode; % Default: Extension.
  56. shift   = DWT_Attribute.shift2D; % Default: Shift.
  57. for k = next:2:nbIn-1
  58.     switch varargin{k}
  59.       case 'mode'  , dwtEXTM = varargin{k+1};
  60.       case 'shift' , shift   = mod(varargin{k+1},2);
  61.     end
  62. end
  63. % Compute sizes.
  64. lf = length(Lo_D);
  65. sx = size(x);
  66. % Extend, Decompose &  Extract coefficients.
  67. first = 2-shift;
  68. flagPer = isequal(dwtEXTM,'per');
  69. if ~flagPer
  70.     sizeEXT = lf-1; last = sx+lf-1;
  71. else
  72.     sizeEXT = lf/2; last = 2*ceil(sx/2);
  73. end
  74. y = wextend('addcol',dwtEXTM,x,sizeEXT);
  75. z = wconv2('row',y,Lo_D,'valid');
  76. a = convdown(z,Lo_D,dwtEXTM,sizeEXT,first,last);
  77. h = convdown(z,Hi_D,dwtEXTM,sizeEXT,first,last);
  78. z = wconv2('row',y,Hi_D,'valid');
  79. v = convdown(z,Lo_D,dwtEXTM,sizeEXT,first,last);
  80. d = convdown(z,Hi_D,dwtEXTM,sizeEXT,first,last);
  81. %-------------------------------------------------------%
  82. % Internal Function(s)
  83. %-------------------------------------------------------%
  84. function y = convdown(x,F,dwtEXTM,lenEXT,first,last)
  85. y = x(:,first(2):2:last(2));
  86. y = wextend('addrow',dwtEXTM,y,lenEXT);
  87. y = wconv2('col',y,F,'valid');
  88. y = y(first(1):2:last(1),:);
  89. %-------------------------------------------------------%