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

波变换

开发平台:

Matlab

  1. function [Ha,Ga,Hs,Gs,PRCond,AACond] = filters2lp(type,LoR,varargin)
  2. %FILTERS2LP Filters to Laurent polynomials.
  3. %   [Ha,Ga,Hs,Gs] = FILTERS2LP('o',LoR) returns the Laurent 
  4. %   polynomials (Ha,Ga,Hs,Gs) associated to the low-pass 
  5. %   filter LoR and the corresponding high-pass filter 
  6. %   HiR = qmf(LoR) (orthogonal case). 
  7. %
  8. %   [Ha,Ga,Hs,Gs] = FILTERS2LP('b',LoR,LoD) returns the 
  9. %   Laurent polynomials (Ha,Ga,Hs,Gs) associated to the
  10. %   low-pass filter LoR and the low-pass filter LoD.
  11. %   In that case, HiR = qmf(fliplr(LoD))(biorthogonal case).
  12. %
  13. %   [...] = FILTERS2LP(...,PmaxHS) let's specify the maximum  
  14. %   power of Hs. PmaxHS must be an integer. The default value
  15. %   is zero.
  16. %
  17. %   [...] = FILTERS2LP(...,AddPOW) let's change the default 
  18. %   maximum power of Gs : PmaxGS = PmaxHS + length(Gs) - 2, 
  19. %   adding the integer AddPOW. The default value for AddPOW
  20. %   is zero. AddPOW must be an even integer to preserve the
  21. %   perfect condition reconstruction.
  22. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 02-Jul-2003.
  23. %   Last Revision: 18-Jul-2003.
  24. %   Copyright 1995-2004 The MathWorks, Inc.
  25. %   $Revision: 1.1.6.2 $ $Date: 2004/03/15 22:40:35 $ 
  26. % Check input arguments.
  27. nbIn = nargin;
  28. if nargin<2 , error('Not enough input arguments.'); end
  29. type = lower(type(1));
  30. switch type
  31.     case 'o' , firstARG = 0;
  32.     case 'b' , firstARG = 1;
  33. end
  34. argNUM = [firstARG :firstARG + 4];
  35. nbIn = length(varargin);
  36. switch nbIn
  37.     case argNUM(1)
  38.         PmaxHS = 0; AddPOW = 0; qmfFLAG = 0; 
  39.         
  40.     case argNUM(2)
  41.         PmaxHS = varargin{argNUM(2)};
  42.         qmfFLAG = 0; AddPOW = 0; 
  43.         
  44.     case argNUM(3)
  45.         [PmaxHS,AddPOW] = deal(varargin{argNUM(2:3)});
  46.         qmfFLAG = 0;
  47.         
  48.     case argNUM(4)
  49.         [PmaxHS,AddPOW,qmfFLAG] = deal(varargin{argNUM(2:4)});
  50.         
  51.     otherwise
  52.         error('Too much input arguments.');
  53. end
  54. switch type
  55.     case 'o' , HiR = qmf(LoR,qmfFLAG);
  56.     case 'b' , HiR = qmf(wrev(varargin{1}),qmfFLAG);
  57. end
  58. %--------------------------------------
  59. % The last input argument qmfFLAG has
  60. % has no effect on the final result. It's
  61. % only used for control scope.  
  62. %--------------------------------------
  63. % Set unit Laurent monomial.
  64. Z = laurpoly(1,1);
  65. % Length of filters.
  66. len_LR = length(LoR);
  67. len_HR = length(HiR);
  68. d_LEN  = (len_HR-len_LR)/2;
  69. if isnan(PmaxHS)
  70.     PmaxHS = floor(len_LR/2)-1;
  71. end
  72. % Initialize synthesis low-pass polynomial.
  73. Hs = laurpoly(LoR,PmaxHS);
  74. % Suppress the null power max coefficients.
  75. acualPMAX = powers(Hs,'max');
  76. dPOW = PmaxHS-acualPMAX;
  77. if dPOW ~= 0 , Hs = Hs * Z^dPOW; end
  78. % Initialize synthesis high-pass polynomial.
  79. % In orthogonal case , Ha = Hs and Ga = Gs. So ...
  80. % PminHS = PmaxHS - len_LR + 1;
  81. % PmaxGS = - PminHS -1;
  82. PmaxGS = PmaxHS + len_HR - 2; 
  83. qmfPOW = 1 - qmfFLAG;
  84. Gs = (-1)^qmfPOW * laurpoly(HiR,PmaxGS);
  85. %---------------------------------------------------------
  86. % Perfect Reconstruction is given by (see also praacond):
  87. %    PRCond(z) = Hs(z) * Ha(1/z)  + Gs(z) * Ga(1/z)
  88. % or in an equivalent way:
  89. %    PRCond = -z * ( Hs(z)*Gs(-z)-Hs(-z)*Gs(z))
  90. %---------------------------------------------------------
  91. % if  d_LEN ~= 0
  92.     HsRGs   = Hs*modulate(Gs);
  93.     cfsHsGs = lp2num(HsRGs);
  94.     revCFS  = cfsHsGs(end:-1:1);
  95.     idxHsGs = find(revCFS);
  96.     powHsGs = powers(HsRGs);
  97.     powHsGs = powHsGs(idxHsGs);
  98.     idxODD  = mod(powHsGs,2);
  99.     nbODD   = sum(idxODD);
  100.     nbEVEN  = length(idxHsGs)-nbODD;
  101.     if nbODD==1
  102.         oddPOW = powHsGs(logical(idxODD));
  103.         if oddPOW~=-1 , Gs = Gs*Z^(-1-oddPOW); end
  104.     elseif nbEVEN==1
  105.         evenPOW = powHsGs(logical(1-idxODD));
  106.         Gs = Gs*Z^(-1-evenPOW);
  107.     else
  108.         error('Invalid biorthogonal filters');
  109.     end
  110. % end
  111.     
  112. if AddPOW ~= 0 , Gs = Gs*Z^AddPOW; end
  113. Ha = -Z^(-1) * modulate(reflect(Gs));
  114. Ga =  Z^(-1) * modulate(reflect(Hs));
  115. if nargout>4
  116.     [PRCond,AACond] = praacond(Hs,Gs,Ha,Ga);
  117. end