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

波变换

开发平台:

Matlab

  1. function [out1,out2,out3,out4,out5] = wavefun(wname,in2,in3);
  2. %WAVEFUN Wavelet and scaling functions 1-D.
  3. %   WAVEFUN returns approximations of the wavelet function
  4. %   'wname' and the associated scaling function, if it exists.
  5. %
  6. %   For an orthogonal wavelet:
  7. %   [PHI,PSI,XVAL] = WAVEFUN('wname',ITER)
  8. %   returns the scaling and wavelet functions on the 2^ITER
  9. %   points grid XVAL. The positive integer ITER is the number
  10. %   of iterations.
  11. %
  12. %   For a biorthogonal wavelet:
  13. %   [PHI1,PSI1,PHI2,PSI2,XVAL] = WAVEFUN('wname',ITER)
  14. %   returns the scaling and wavelet functions both
  15. %   for decomposition (PHI1, PSI1) and for
  16. %   reconstruction (PHI2, PSI2). 
  17. %
  18. %   For a Meyer wavelet:
  19. %   [PHI,PSI,XVAL] = WAVEFUN('wname',ITER)
  20. %
  21. %   For a wavelet without scaling function (e.g., Morlet, 
  22. %   Mexican Hat, Gaussian derivatives wavelets or complex
  23. %   wavelets):
  24. %   [PSI,XVAL] = WAVEFUN('wname',ITER). 
  25. %   Output argument PSI is a real or complex vector 
  26. %   depending on the wavelet type. 
  27. %
  28. %   ... = WAVEFUN(...,'plot') computes and, in addition, 
  29. %   plots the functions.
  30. %
  31. %   WAVEFUN('wname',A,B), where A and B are positive integers,
  32. %   is equivalent to WAVEFUN('wname',max(A,B)), and plots are
  33. %   produced.
  34. %   WAVEFUN('wname',0) is equivalent to WAVEFUN('wname',8,0).
  35. %   WAVEFUN('wname')   is equivalent to WAVEFUN('wname',8).
  36. %      
  37. %   See also INTWAVE, WAVEINFO, WFILTERS.
  38. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  39. %   Last Revision: 04-Jul-2003.
  40. %   Copyright 1995-2004 The MathWorks, Inc.
  41. %   $Revision: 1.18.4.2 $
  42. % Check arguments.
  43. wname = deblankl(wname);
  44. debut = wname(1:2);
  45. [wtype,fname,family,bounds] =  ...
  46.     wavemngr('fields',wname,'type','file','fn','bounds');
  47. if  nargin == 1,
  48.     iter = 8; pflag = 0;
  49. elseif  nargin == 2
  50.     if in2 == 0, 
  51.         iter = 8; pflag = 1;
  52.     else
  53.         iter = in2;      pflag = 0;
  54.     end
  55. else
  56.     pflag = 1;
  57.     if  ischar(in2)
  58.         if ischar(in3) , iter = 8; else , iter = in3; end
  59.     else
  60.         if ischar(in3)
  61.             iter = in2;
  62.         else
  63.             iter = max(in2,in3);
  64.         end
  65.     end
  66.     if (ischar(iter) | any(iter < 1) | any(iter ~= fix(iter)))
  67.         iter = 8;
  68.     end
  69. end
  70. coef = (sqrt(2)^iter);
  71. pas  = 1/(2^iter);
  72. switch wtype
  73.     case 1
  74.       [Lo_R,Hi_R] = wfilters(wname,'r');
  75.       long  = length(Lo_R);
  76.       nbpts = (long-1)/pas+1;
  77.       phi   = coef*upcoef('a',1,Lo_R,'dummy',iter);
  78.       psi   = coef*upcoef('d',1,Lo_R,Hi_R,iter);
  79.       [nbpts,nb,dn] = getNBpts(nbpts,iter,long);
  80.       phi = [0 wkeep1(phi,nb) zeros(1,1+dn)];
  81.       psi = [0 wkeep1(psi,nb) zeros(1,1+dn)];
  82.       % sign depends on wavelet
  83.       if strcmp(debut,'co') | strcmp(debut,'sy') | ... % coiflet or symlet
  84.          strcmp(debut,'dm')                            % dmeyer
  85.           psi = -psi ;
  86.       end
  87.       out1 = phi; out2 = psi;
  88.       out3 = linspace(0,(nbpts-1)*pas,nbpts);
  89.     case 2
  90.       [Lo_D1,Hi_D2,Lo_R2,Hi_R1,Lo_D2,Hi_D1,Lo_R1,Hi_R2] = wfilters(wname);
  91.       mul = 1;
  92.       isBior = wavemngr('isbior',wname);
  93.       if isBior
  94.           Nr = wstr2num(wname(5));
  95.           if rem(Nr,4)~=1 , mul = -1; end
  96.       end
  97.       long  = length(Lo_D1);
  98.       nbpts = (long-1)/pas;
  99.       phi1  = coef*upcoef('a',1,Lo_R1,'dummy',iter);
  100.       psi1  = mul*coef*upcoef('d',1,Lo_R1,Hi_R2,iter);
  101.       [nbpts,nb,dn] = getNBpts(nbpts,iter,long);
  102.       phi1  = [0 wkeep1(phi1,nb) zeros(1,1+dn)];
  103.       psi1  = [0 wkeep1(psi1,nb) zeros(1,1+dn)];
  104.       long  = length(Lo_R2);
  105.       Hi_R2 = wrev(Hi_D2);
  106.       phi2  = coef*upcoef('a',1,Lo_R2,'dummy',iter);
  107.       psi2  = mul*coef*upcoef('d',1,Lo_R2,Hi_R1,iter);
  108.       [nbpts,nb,dn] = getNBpts(nbpts,iter,long);
  109.       phi2 = [0 wkeep1(phi2,nb) zeros(1,1+dn)];
  110.       psi2 = [0 wkeep1(psi2,nb) zeros(1,1+dn)];
  111.       out1 = phi1; out2 = psi1;
  112.       out3 = phi2; out4 = psi2;
  113.       out5 = linspace(0,(nbpts-1)*pas,nbpts);
  114.     case 3
  115.       np = 2^iter;
  116.       lb = bounds(1); ub = bounds(2);
  117.       [out1,out2,out3] = feval(fname,lb,ub,np,wname);
  118.     case {4,5}
  119.       np = 2^iter;
  120.       lb = bounds(1); ub = bounds(2);
  121.       [out1,out2] = feval(fname,lb,ub,np,wname);
  122. end
  123. if pflag    % plots required.
  124.     switch wtype
  125.       case 1
  126.         nb   = length(phi); xmax = nb*pas; xmin = 0;
  127.         xval = linspace(xmin,xmax,nb);
  128.         subplot(121);plot(xval,phi,'r');grid;
  129.         title([wname ' : phi']);
  130.         subplot(122);plot(xval,psi,'g');grid;
  131.         title([wname ' : psi']);
  132.       case 2
  133.         nb   = length(phi1); xmax = nb*pas; xmin = 0;
  134.         xval = linspace(xmin,xmax,nb);
  135.         subplot(221);plot(xval,phi1,'r');grid;
  136.         title([wname ' : phi dec.']);
  137.         subplot(222);plot(xval,psi1,'g');grid;
  138.         title([wname ' : psi dec.']);
  139.         nb   = length(phi2); xmax = nb*pas; xmin = 0;
  140.         xval = linspace(xmin,xmax,nb);
  141.         subplot(223);plot(xval,phi2,'r');grid;
  142.         title([wname ' : phi rec.']);
  143.         subplot(224);plot(xval,psi2,'g');grid;
  144.         title([wname ' : psi rec.']);
  145.       case 3
  146.         subplot(121);plot(out3,out1,'r');grid;
  147.         title([family '  scaling function'])
  148.         subplot(122);plot(out3,out2,'g');grid;
  149.         title([family '  wavelet function'])
  150.       case 4
  151.         plot(out2,out1,'g');grid;
  152.         title([family '  wavelet function'])
  153.       case 5
  154.         subplot(221);
  155.         plot(out2,real(out1),'r');
  156.         title([wname ' : psi real part.']);grid
  157.         subplot(222);
  158.         plot(out2,imag(out1),'g');
  159.         title([wname ' : psi imaginary part.']);grid
  160.         subplot(223);
  161.         plot(out2,abs(out1),'r');
  162.         title([wname ' : psi complex modulus.']); grid
  163.         subplot(224);
  164.         plot(out2,angle(out1),'g');
  165.         title([wname ' : psi phase angle.']);grid
  166.     end
  167. end
  168. %----------------------%
  169. % Internal Function(s) %
  170. %----------------------%
  171. function [nbpts,nb,dn] = getNBpts(nbpts,iter,long)
  172. %
  173. lplus = long-2;
  174. nb = 1; for kk = 1:iter, nb = 2*nb+lplus; end
  175. dn = nbpts-nb-2;
  176. if dn<0 , nbpts = nbpts-dn; dn = 0; end    % HAAR