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

波变换

开发平台:

Matlab

  1. function y = upsaconv(type,x,f,s,dwtATTR,shiFLAG)
  2. %UPSACONV Upsample and convolution.
  3. %
  4. %   Y = UPSACONV('1D',X,F_R) returns the one step dyadic
  5. %   interpolation (upsample and convolution) of vector X
  6. %   using filter F_R.
  7. %
  8. %   Y = UPSACONV('1D',X,F_R,L) returns the length-L central 
  9. %   portion of the result obtained using Y = UPSACONV('1D',X,F_R).
  10. %
  11. %   Y = UPSACONV('2D',X,{F1_R,F2_R}) returns the one step dyadic 
  12. %   interpolation (upsample and convolution) of matrix X
  13. %   using filter F1_R for rows and filter F2_R for columns.
  14. %
  15. %   Y = UPSACONV('2D',X,{F1_R,F2_R},S) returns the size-S
  16. %   central portion of the result obtained 
  17. %   using Y = UPSACONV('2D',X,{F1_R,F2_R})
  18. %   Y = UPSACONV('1D',X,F_R,DWTATTR) returns the one step
  19. %   interpolation of vector X using filter F_R where the upsample 
  20. %   and convolution attributes are described by DWTATTR.
  21. %
  22. %   Y = UPSACONV('1D',X,F_R,L,DWTATTR) combines the two 
  23. %   other usages.
  24. %
  25. %   Y = UPSACONV('2D',X,{F1_R,F2_R},DWTATTR) returns the one step
  26. %   interpolation of matrix X using filters F1_R and F2_R where  
  27. %   the upsample and convolution attributes are described by DWTATTR.
  28. %   Y = UPSACONV('2D',X,{F1_R,F2_R},S,DWTATTR) combines the 
  29. %   other usages.
  30. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 01-Nov-97.
  31. %   Last Revision: 22-May-2003.
  32. %   Copyright 1995-2004 The MathWorks, Inc.
  33. %   $Revision: 1.9.4.2 $  $Date: 2004/03/15 22:41:59 $
  34. % Special case.
  35. if isempty(x) , y = 0; return; end
  36. y = x;
  37. if nargin<4 , sizFLAG = 1; else , sizFLAG = isempty(s); end
  38. if nargin<5 , dwtATTR = dwtmode('get'); end
  39. if nargin<6 , shiFLAG = 1; end
  40. dumFLAG = ~isstruct(dwtATTR);
  41. if ~dumFLAG , perFLAG = isequal(dwtATTR.extMode,'per'); else , perFLAG = 0; end
  42. shiFLAG = shiFLAG && ~dumFLAG;
  43. switch type
  44.     case {1,'1','1d','1D'}
  45.         ly = length(y);
  46.         lf = length(f);
  47.         if sizFLAG
  48.             if ~perFLAG , s = 2*ly-lf+2; else , s = 2*ly; end
  49.         end
  50.         if shiFLAG , shift = dwtATTR.shift1D; else , shift = 0; end
  51.         shift = mod(shift,2);
  52.         if ~perFLAG
  53.             if sizFLAG , s = 2*ly-lf+2; end
  54.             y = wconv1(dyadup(y,0),f);
  55.             y = wkeep1(y,s,'c',shift);
  56.         else
  57.             if sizFLAG , s = 2*ly; end
  58.             y = dyadup(y,0,1);
  59.             y = wextend('1D','per',y,lf/2);
  60.             y = wconv1(y,f);
  61.             y = wkeep1(y,2*ly,lf);
  62.             if shift==1 , y = y([2:end,1]); end
  63.             y = y(1:s);
  64.         end
  65.     case {2,'2','2d','2D'}
  66.         sy = size(y);
  67.         lf = length(f{1});
  68.         if sizFLAG
  69.             if ~perFLAG , s = 2*sy-lf+2; else , s = 2*sy; end
  70.         end
  71.         if shiFLAG , shift = dwtATTR.shift2D; else , shift = [0 0]; end
  72.         shift = mod(shift,2);
  73.         if ~perFLAG
  74.             y = wconv2('col',dyadup(y,'row',0),f{1});
  75.             y = wconv2('row',dyadup(y,'col',0),f{2});
  76.             y = wkeep2(y,s,'c',shift);
  77.         else
  78.             y = dyadup(y,'mat',0,1);
  79.             y = wextend('2D','per',y,[lf/2,lf/2]);
  80.             y = wconv2('col',y,f{1});
  81.             y = wconv2('row',y,f{2});
  82.             y = wkeep2(y,2*sy,[lf lf]);
  83.             if shift(1)==1 , y = y([2:end,1],:); end
  84.             if shift(2)==1 , y = y(:,[2:end,1]); end
  85.             y = wkeep2(y,s,[1,1]);
  86.         end
  87. end