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

波变换

开发平台:

Matlab

  1. function [phiS,psiS,phiA,psiA,xval] = bswfun(Lo_D,Hi_D,Lo_R,Hi_R,IN5,IN6)
  2. %BSWFUN Biorthogonal scaling and wavelet functions.
  3. %   [PHIS,PSIS,PHIA,PSIA,XVAL] = BSWFUN(LoD,HiD,LoR,HiR)
  4. %   returns approximations on the grid XVAL of the two 
  5. %   pairs of scaling function and wavelet (PHIA,PSIA), 
  6. %   (PHIS,PSIA) associated with the two pairs of filters
  7. %   (LoD,HiD), (LoR,HiR).
  8. %
  9. %   BSWFUN(...,ITER) computes the two pairs of scaling 
  10. %   and wavelet functions using ITER iterations.
  11. %
  12. %   BSWFUN(...,'plot') or BSWFUN(...,ITER,'plot') or 
  13. %   BSWFUN(...,'plot',ITER), computes and, in addition, 
  14. %   plots the functions.
  15. %
  16. %   See also WAVEFUN.
  17. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 24-Jun-2003.
  18. %   Last Revision: 13-Jul-2003.
  19. %   Copyright 1995-2004 The MathWorks, Inc.
  20. %   $Revision: 1.1.6.2 $ $Date: 2004/03/15 22:39:42 $ 
  21. % Comments:
  22. %----------
  23. % In the Daubechies' book pages 261-278 and more
  24. % precisely pages 272-276:
  25. %   (PHIA,PSIA) corresponds to (PHI,PSI)
  26. %   (PHIS,PSIS) corresponds to (PHI_tilda,PSI_tilda)
  27. % Reverse decomposition scaling function 
  28. % and wavelet if flagREVERSE is true.
  29. %---------------------------------------
  30. flagREVERSE = true;
  31. flagREVERSE = false;
  32. % Check input arguments.
  33. iterDEF = 10;
  34. switch nargin
  35.     case {1,2,3} ,
  36.         error('Not enough input arguments.');
  37.     case 4 ,
  38.         flagPLOT = false;
  39.         iter = iterDEF; 
  40.     case 5 ,
  41.         if ischar(IN5)
  42.             flagPLOT = true;
  43.             iter = iterDEF;
  44.         else
  45.             flagPLOT = false;
  46.             iter = IN5;
  47.         end
  48.     case 6
  49.         flagPLOT = true;
  50.         if ischar(IN5)
  51.             iter = IN6;
  52.         else
  53.             iter = IN5;
  54.         end
  55. end
  56. if (ischar(iter) | any(iter < 1) | any(iter ~= fix(iter)))
  57.     iter = iterDEF;
  58. end
  59. % Compute scaling functions and wavelets.
  60. coef = (sqrt(2)^iter);
  61. if flagREVERSE  && isequal(Lo_R,wrev(Lo_D))
  62.     phiA = coef*upcoef('a',1,wrev(Lo_D),NaN,iter);
  63.     psiA = coef*upcoef('d',1,wrev(Lo_D),wrev(Hi_D),iter);    
  64. else
  65.     phiA = coef*upcoef('a',1,Lo_D,NaN,iter);
  66.     psiA = coef*upcoef('d',1,Lo_D,Hi_D,iter);
  67. end
  68. phiS = coef*upcoef('a',1,Lo_R,NaN,iter);
  69. psiS = coef*upcoef('d',1,Lo_R,Hi_R,iter);
  70. % Plot scaling functions and wavelets if requested.
  71. if flagPLOT
  72.     flgNUM = 1;
  73.     figure('DefaultAxesXgrid','On','DefaultAxesYgrid','On');
  74. else
  75.     flgNUM = 0;    
  76. end
  77. LW = 2;
  78. phiCOL = 'r';
  79. psiCOL = 'b';
  80. strTitle = 'Analysis scaling function (phiA)';
  81. [phiA,x_phiA] = getAndplotFUN(phiA,Lo_D,LW,phiCOL,1*flgNUM,strTitle);
  82. strTitle = 'Analysis wavelet function (psiA)';
  83. [psiA,x_psiA] = getAndplotFUN(psiA,Hi_D,LW,psiCOL,2*flgNUM,strTitle);
  84. strTitle = 'Synthesis scaling function (phiS)';
  85. [phiS,x_phiS] = getAndplotFUN(phiS,Lo_R,LW,phiCOL,3*flgNUM,strTitle);
  86. strTitle = 'Synthesis wavelet function (psiS)';
  87. [psiS,x_psiS] = getAndplotFUN(psiS,Hi_R,LW,psiCOL,4*flgNUM,strTitle);    
  88. xval = x_phiS;
  89. %-----------------------------------------------------------
  90. function [y,x] = getAndplotFUN(y,F,LW,color,numSub,strTitle)
  91. [x,y,ymin,ymax,dy] = getXY(y,F);
  92. if numSub==0 , return; end
  93. a = subplot(2,2,numSub); 
  94. plot(x,y,color,'linewidth',LW); 
  95. try , set(a,'Xlim',[x(1) x(end)]); end
  96. try , set(a,'Ylim',[ymin-dy ymax+dy]); end
  97. title(strTitle,'FontSize',8,'FontWeight','bold')
  98. %---------------------------------------------------------
  99. function [x,y,ymin,ymax,dy] = getXY(fVAL,filtre)
  100. y = fVAL; 
  101. ymin = min(y); ymax = max(y); 
  102. if abs(ymax-ymin)<100*eps , 
  103.     y = [0 y 0]; ymin = min(y); ymax = max(y);
  104. end
  105. dy = (ymax-ymin)/100;
  106. ly = length(y);
  107. L  = length(filtre);
  108. x  = linspace(0,L-1,ly);
  109. %---------------------------------------------------------