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

波变换

开发平台:

Matlab

  1. function w = symaux(N,sumw)
  2. %SYMAUX Symlet wavelet filter computation.
  3. %   Symlets are the "least asymmetric"
  4. %   Daubechies' wavelets.
  5. %   W = SYMAUX(N,SUMW) is the order N Symlet scaling
  6. %   filter such that SUM(W) = SUMW.
  7. %   Possible values for N are:
  8. %          N = 1, 2, 3, ...
  9. %   Caution: Instability may occur when N is too large.
  10. %
  11. %   W = SYMAUX(N) is equivalent to W = SYMAUX(N,1)
  12. %   W = SYMAUX(N,0) is equivalent to W = SYMAUX(N,1)
  13. %
  14. %   See also SYMWAVF, WFILTERS.
  15. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 06-Feb-98.
  16. %   Last Revision: 14-May-2003.
  17. %   Copyright 1995-2004 The MathWorks, Inc.
  18. %   $Revision: 1.9.4.3 $  $Date: 2004/03/15 22:41:49 $
  19. % Check arguments.
  20. if nargin < 2 | sumw==0 , sumw = 1;  end
  21. if N==1  % Haar filters
  22.     w = [0.5 0.5];
  23.     w = sumw*(w/sum(w)); 
  24.     return
  25. end
  26. % Compute the "Lagrange a trous" filter of order N.
  27. % and the roots (abs(R) ~= 1).
  28. %--------------------------------------------------
  29. [P,Proots] = wlagrang(N);
  30. % Find complex and real zeros.
  31. % The real zeros are grouped by duplets:
  32. %   [z,1/z]
  33. % The complex zeros are grouped by quadruplets: 
  34. %   [z,conj(z),1/z,1/conj(z)]
  35. %------------------------------------------------ 
  36. realzeros   = Proots(find(imag(Proots)==0));
  37. nbrealzeros = length(realzeros);
  38. imagzeros   = Proots(find(imag(Proots)~=0));
  39. nbimagzeros = length(imagzeros);
  40. % Get complex modulus and angle for each group of complex zeros.
  41. tmp  = imagzeros(1:2:nbimagzeros/2);
  42. rho  = abs(tmp);
  43. teta = angle(tmp);
  44. %--------------------------------------------------------------
  45. % Calculate phase contribution of complex and real zeros
  46. % for all the combination of these zeros.
  47. % A combination is composed by one real zero in each duplets
  48. % and two conjugate complex zeros in each quadruplets.
  49. % Each combination of zeros is identified with a binary number.
  50. % The phase of kth combination is the opposite of the phase
  51. % of the combination which num is (2^NbGroup-k+1). 
  52. %--------------------------------------------------------------
  53. nbfr = 200;
  54. freq = linspace(0,2*pi,nbfr);
  55. uZ   = exp(-i*freq);
  56. nbGroupOfRealZ = nbrealzeros/2;
  57. nbGroupOfImagZ = nbimagzeros/4;
  58. nbGroupOfZeros = nbGroupOfImagZ+nbGroupOfRealZ;
  59. pow2NbGroup    = 2^(nbGroupOfZeros-1);   
  60. indImagZ       = [1:nbGroupOfImagZ];
  61. indRealZ       = [nbGroupOfImagZ+1:nbGroupOfZeros];
  62. phas           = zeros(pow2NbGroup,nbfr);
  63. for numG=1:pow2NbGroup;
  64.     [indReZ,indImZ] = getZeroInd(numG,nbGroupOfZeros,nbGroupOfRealZ, ...
  65.                         indRealZ,indImagZ);
  66.     tmp = realzeros(indReZ);
  67.     for ii=1:nbGroupOfRealZ
  68.         phas(numG,:) = phas(numG,:) + phasecontrib(uZ,tmp(ii));
  69.     end                             
  70.     tmp = rho;
  71.     tmp(indImZ) = 1./tmp(indImZ);
  72.     for ii=1:nbGroupOfImagZ       
  73.         phas(numG,:) = phas(numG,:) + phasecontrib(uZ,tmp(ii),teta(ii));
  74.     end
  75. end
  76. % To retain only the non linear part of the phase.
  77. phas = nonlinph(phas,freq);
  78. % We select the combination which phase is closer to zero
  79. % (The L2-norm or variance of the phase is minimum).
  80. phas = sum(phas'.^2);
  81. [phasMin,imin]  = min(phas);
  82. %-----------------------------------------------------
  83. % The following choice is only for compatibility 
  84. % with load symN
  85. switch N
  86.    case {4,5,7,8} , imin = 2*pow2NbGroup-imin+1;
  87. end
  88. %-----------------------------------------------------
  89. [indReZ,indImZ] = getZeroInd(imin,nbGroupOfZeros,nbGroupOfRealZ, ...
  90.                         indRealZ,indImagZ);
  91. % Choose real zeros.
  92. realzeros = realzeros(indReZ);
  93. % Choose imaginary zeros.
  94. tmp = rho;
  95. tmp(indImZ) = 1./tmp(indImZ);
  96. tmp = tmp.*exp(j*teta);
  97. tmp = [tmp conj(tmp)]';
  98. imagzeros = tmp(:);
  99. % Construction of the filter from its zeros.
  100. w = real(poly([realzeros;imagzeros;-ones(N,1)]));
  101. w = sumw*(w/sum(w)); 
  102. %-----------------------------------------------------------------------%
  103. function [iReZ,iImZ] = getZeroInd(num,nbGrZ,nbGrReZ,indReZ,indImZ) 
  104. % Get indices of zeros for a group which number is num.
  105. bin  = dec2bin(num-1,nbGrZ);
  106. bin  = logical(wstr2num(bin')');
  107. iReZ = [1:2:2*nbGrReZ]+bin(indReZ);
  108. iImZ = bin(indImZ);
  109. %-----------------------------------------------------------------------%
  110. function F = phasecontrib(Z,R,teta)
  111. %PHASECONTRIB  
  112. %   F = PHASECONTRIB(Z,R,TETA) or F = PHASECONTRIB(Z,R)
  113. %   returns the phase contribution of a complex pair of zeros
  114. %   or of a real zero.
  115. switch nargin
  116.   case 2 , V = Z-R;                                   % real case
  117.   case 3 , V = (Z-R*exp(i*teta)).*(Z-R*exp(-i*teta)); % imaginary case
  118. end
  119. % Compute continuous phase over the pi-borders.
  120. F  = atan2(imag(V),real(V));
  121. N  = length(F);
  122. DF = F(1:N-1)-F(2:N);
  123. I  = find(abs(DF)>3.5);
  124. for ii=I
  125.      F = F+2*pi*sign(DF(ii))*[zeros(1,ii) ones(1,N-ii)];
  126. end
  127. F = F-F(1);
  128. %-----------------------------------------------------------------------%
  129. function nlphase = nonlinph(v,freq)
  130. %NONLINPH NLPHASE = NONLINPH(V) eliminates the linear 
  131. % part of the phase vector V.
  132. [m,n] = size(v);
  133. nlphase = zeros(m,n);
  134. for row=1:m
  135.     nlphase(row,:) = v(row,:)-v(row,n)*freq/(2*pi);
  136. end
  137. %-----------------------------------------------------------------------%