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

波变换

开发平台:

Matlab

  1. function varargout = iswt(varargin)
  2. %ISWT Inverse discrete stationary wavelet transform 1-D.
  3. %   ISWT performs a multilevel 1-D stationary wavelet 
  4. %   reconstruction using either a specific orthogonal wavelet  
  5. %   ('wname', see WFILTERS for more information) or specific 
  6. %   reconstruction filters (Lo_R and Hi_R).
  7. %
  8. %   X = ISWT(SWC,'wname') or X = ISWT(SWA,SWD,'wname') 
  9. %   or X = ISWT(SWA(end,:),SWD,'wname') reconstructs the 
  10. %   signal X based on the multilevel stationary wavelet   
  11. %   decomposition structure SWC or [SWA,SWD] (see SWT).
  12. %
  13. %   For X = ISWT(SWC,Lo_R,Hi_R) or X = ISWT(SWA,SWD,Lo_R,Hi_R),  
  14. %   or X = ISWT(SWA(end,:),SWD,Lo_R,Hi_R),
  15. %   Lo_R is the reconstruction low-pass filter.
  16. %   Hi_R is the reconstruction high-pass filter.
  17. %
  18. %   See also IDWT, SWT, WAVEREC.
  19. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 08-Dec-97.
  20. %   Last Revision: 14-May-2003.
  21. %   Copyright 1995-2004 The MathWorks, Inc.
  22. %   $Revision: 1.6.4.2 $  $Date: 2004/03/15 22:40:54 $
  23. % Check arguments.
  24. nbIn = nargin;
  25. if nbIn < 2
  26.   error('Not enough input arguments.');
  27. elseif nbIn > 4
  28.   error('Too many input arguments.');
  29. end
  30. switch nbIn
  31.   case 2 , argstr = 1; argnum = 2;
  32.   case 4 , argstr = 0; argnum = 3;
  33.   case 3
  34.       if ischar(varargin{3})
  35.           argstr = 1; argnum = 3;
  36.       else
  37.           argstr = 0; argnum = 2;
  38.       end
  39. end
  40. % Compute reconstruction filters.
  41. if argstr
  42.     [lo_R,hi_R] = wfilters(varargin{argnum},'r');
  43. else
  44.     lo_R = varargin{argnum}; hi_R = varargin{argnum+1};
  45. end
  46. % Set DWT_Mode to 'per'.
  47. old_modeDWT = dwtmode('status','nodisp');
  48. dwtmode('per','nodisp');
  49. % Get inputs.
  50. if argnum==2
  51.     p = size(varargin{1},1);
  52.     n = p-1;
  53.     d = varargin{1}(1:n,:);
  54.     a = varargin{1}(p,:);
  55. else
  56.     a = varargin{1};
  57.     d = varargin{2};
  58. end
  59. a      = a(size(a,1),:);
  60. [n,lx] = size(d);
  61. for k = n:-1:1
  62.     step = 2^(k-1);
  63.     last = step;
  64.     for first = 1:last
  65.       ind = first:step:lx;
  66.       lon = length(ind);
  67.       subind = ind(1:2:lon);
  68.       x1 = idwtLOC(a(subind),d(k,subind),lo_R,hi_R,lon,0);
  69.       subind = ind(2:2:lon);
  70.       x2 = idwtLOC(a(subind),d(k,subind),lo_R,hi_R,lon,-1);
  71.       a(ind) = 0.5*(x1+x2);
  72.     end
  73. end
  74. varargout{1} = a;
  75. % Restore DWT_Mode.
  76. dwtmode(old_modeDWT,'nodisp');
  77. %===============================================================%
  78. % INTERNAL FUNCTIONS
  79. %===============================================================%
  80. function y = idwtLOC(a,d,lo_R,hi_R,lon,shift)
  81. y = upconvLOC(a,lo_R,lon) + upconvLOC(d,hi_R,lon);
  82. if shift==-1 , y = y([end,1:end-1]); end
  83. %---------------------------------------------------------------%
  84. function y = upconvLOC(x,f,l)
  85. lf = length(f);
  86. y  = dyadup(x,0,1);
  87. y  = wextend('1D','per',y,lf/2);
  88. y  = wconv1(y,f);
  89. y  = wkeep1(y,l,lf);
  90. %===============================================================%