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

波变换

开发平台:

Matlab

  1. function y = dyadup(x,varargin)
  2. %DYADUP Dyadic upsampling.
  3. %   DYADUP implements a simple zero-padding scheme very
  4. %   useful in the wavelet reconstruction algorithm.
  5. %
  6. %   Y = DYADUP(X,EVENODD), where X is a vector, returns
  7. %   an extended copy of vector X obtained by inserting zeros.
  8. %   Whether the zeros are inserted as even- or odd-indexed
  9. %   elements of Y depends on the value of positive integer
  10. %   EVENODD:
  11. %   If EVENODD is even, then Y(2k-1) = X(k), Y(2k) = 0.
  12. %   If EVENODD is odd,  then Y(2k-1) = 0   , Y(2k) = X(k).
  13. %
  14. %   Y = DYADUP(X) is equivalent to Y = DYADUP(X,1)
  15. %
  16. %   Y = DYADUP(X,EVENODD,'type') or
  17. %   Y = DYADUP(X,'type',EVENODD) where X is a matrix,
  18. %   return extended copies of X obtained by inserting columns 
  19. %   of zeros (or rows or both) if 'type' = 'c' (or 'r' or 'm'
  20. %   respectively), according to the parameter EVENODD, which
  21. %   is as above.
  22. %
  23. %   Y = DYADUP(X) is equivalent to
  24. %   Y = DYADUP(X,1,'c')
  25. %   Y = DYADUP(X,'type')  is equivalent to
  26. %   Y = DYADUP(X,1,'type')
  27. %   Y = DYADUP(X,EVENODD) is equivalent to
  28. %   Y = DYADUP(X,EVENODD,'c') 
  29. %
  30. %                  |1 2|                     |0 1 0 2 0|
  31. %   Examples : X = |3 4|  ,  DYADUP(X,'c') = |0 3 0 4 0|
  32. %
  33. %                     |1 2|                      |1 0 2|
  34. %   DYADUP(X,'r',0) = |0 0|  , DYADUP(X,'m',0) = |0 0 0|
  35. %                     |3 4|                      |3 0 4|
  36. %
  37. %   See also DYADDOWN.
  38. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  39. %   Last Revision: 19-May-2003.
  40. %   Copyright 1995-2004 The MathWorks, Inc.
  41. % $Revision: 1.15.4.2 $
  42. % Internal options.
  43. %-----------------
  44. % Y = DYADUP(X,EVENODD,ARG) returns a vector with even length.
  45. % Y = DYADUP([1 2 3],1,ARG) ==> [0 1 0 2 0 3]
  46. % Y = DYADUP([1 2 3],0,ARG) ==> [1 0 2 0 3 0]
  47. % Y = DYADUP(X,EVENODD,TYPE,ARG) ... for a matrix
  48. %--------------------------------------------------------------
  49. % Check arguments.
  50. nbIn = nargin;
  51. if nbIn < 1
  52.   error('Not enough input arguments.');
  53. elseif nbIn > 4
  54.   error('Too many input arguments.');
  55. end
  56. % Special case.
  57. if isempty(x) , y = []; return; end
  58. def_evenodd = 1;
  59. nbInVar = nargin-1;
  60. [r,c]   = size(x);
  61. evenLEN = 0;
  62. if min(r,c)<=1
  63.     dim = 1;
  64.     switch nbInVar
  65.         case {1,3}
  66.            if ischar(varargin{1}) , dim = 2; end
  67.         case 2
  68.            if ischar(varargin{1}) | ischar(varargin{2}) , dim = 2; end
  69.     end
  70. else
  71.     dim = 2;
  72. end
  73. if dim==1
  74.     switch nbInVar
  75.         case 0
  76.             p = def_evenodd;
  77.         case {1,2}
  78.             p = varargin{1};
  79.             if nbInVar==2 , evenLEN = 1; end
  80.         otherwise
  81.             errargt(mfilename,'too many arguments','msg'); error('*');
  82.     end
  83.     rem2    = rem(p,2);
  84.     if evenLEN , addLEN = 0; else , addLEN = 2*rem2-1; end
  85.     l = 2*length(x)+addLEN;
  86.     y = zeros(1,l);
  87.     y(1+rem2:2:l) = x;
  88.     if r>1, y = y'; end
  89. else
  90.     switch nbInVar
  91.         case 0 , p = def_evenodd; o = 'c';
  92.         case 1
  93.             if ischar(varargin{1})
  94.                 p = def_evenodd; o = lower(varargin{1}(1));
  95.             else
  96.                 p = varargin{1}; o = 'c';
  97.             end
  98.         otherwise
  99.             if ischar(varargin{1})
  100.                 p = varargin{2}; o = lower(varargin{1}(1));
  101.             else
  102.                 p = varargin{1}; o = lower(varargin{2}(1));
  103.             end
  104.     end
  105.     if nbInVar==3 , evenLEN = 1; end
  106.     rem2 = rem(p,2);
  107.     if evenLEN , addLEN = 0; else , addLEN = 2*rem2-1; end
  108.     switch o
  109.         case 'c'
  110.             nc = 2*c+addLEN;
  111.             y  = zeros(r,nc);
  112.             y(:,1+rem2:2:nc) = x;
  113.         case 'r'
  114.             nr = 2*r+addLEN;
  115.             y  = zeros(nr,c);
  116.             y(1+rem2:2:nr,:) = x;
  117.         case 'm'
  118.             nc = 2*c+addLEN;
  119.             nr = 2*r+addLEN;
  120.             y  = zeros(nr,nc);
  121.             y(1+rem2:2:nr,1+rem2:2:nc) = x;
  122.         otherwise
  123.             error('Invalid argument value.');
  124.     end
  125. end