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

波变换

开发平台:

Matlab

  1. function [PSI,XVal,NC] = pat2cwav(y,method,PolDegree,Regularity)
  2. %PAT2CWAV Construction of a wavelet starting from a pattern.
  3. %   [PSI,XVAL,NC] = PAT2CWAV(YPAT,METHOD,POLDEGREE,REGULARITY)
  4. %   computes an admissible wavelet for CWT (given by XVAL and PSI)
  5. %  adapted to the pattern defined by the vector YPAT, and of norm 
  6. %   equal to 1.
  7. %   The underlying x-values pattern are set to:
  8. %             xpat = linespace(0,1,length(YPAT))
  9. %   
  10. %  The constant NC is such that NC*PSI approximates YPAT on 
  11. %  the interval [0,1] by least squares fitting using:
  12. %    - a polynomial of degree POLDEGREE when METHOD is equal to 'polynomial'
  13. %    - a projection on the space of functions orthogonal to constants when
  14. %      METHOD is equal to 'orthconst'.
  15. %  The REGULARITY parameter allows to define the boundary constraints at
  16. %  the points 0 and 1. Allowable values are 'continuous', 'differentiable'
  17. %  and 'none'.
  18. %  When METHOD is equal to 'polynomial':
  19. %     - if REGULARITY is equal to 'continuous', POLDEGREE must be >= 3 
  20. %     - if REGULARITY is equal to 'differentiable', POLDEGREE must be >= 5 
  21. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 21-Mar-2003.
  22. %   Last Revision: 11-Jul-2003.
  23. %   Copyright 1995-2004 The MathWorks, Inc.
  24. %   $Revision: 1.1.6.2 $ $Date: 2004/03/15 22:41:31 $ 
  25. % NbPts = 1024;      % Length of PSI.
  26. a = 0;             % Lower bound of interval: XVal(1).
  27. b = 1;             % Upper bound of interval: XVal(end).
  28. N = PolDegree + 1; % Degree of freedom. 
  29. x = linspace(a,b,length(y));
  30. if isstr(Regularity)
  31.     Regularity = lower(Regularity);
  32.     switch Regularity
  33.         case 'none'
  34.             Regularity = -1;
  35.         case 'continuous'
  36.             Regularity = 0;
  37.         case 'differentiable'
  38.             Regularity = 1;
  39.         otherwise
  40.             error('Invalid value for Regularity.')
  41.     end
  42. else
  43.     okReg = ~isempty(Regularity);
  44.     if okReg
  45.         okReg = isnumeric(Regularity) & ...
  46.             fix(Regularity)==Regularity & (Regularity >=-1);
  47.     end
  48.     if ~okReg
  49.         error('Invalid value for Regularity.')
  50.     end
  51. end
  52. method = lower(method);
  53. switch method
  54.     case {'polynomial','orthconst'}
  55.         
  56.     case {'discpoly'}
  57.         R  = inline('x.^(p-1)','x','p','a','b');
  58.         dR = inline('max(p-1,0)*x.^max(p-2,0)','x','p','a','b');
  59.         method = 'symbolic';
  60.         
  61.     case 'lagrange' , 
  62.         R  = inline('((b-x).*(x-a)).^(p-1)','x','p','a','b');
  63.         dR = inline('max(p-1,0)*(-2*x+a+b).*((b-x).*(x-a)).^max(p-2,0)','x','p','a','b');
  64.         method = 'symbolic';
  65.         
  66.     case 'cos' , 
  67.         R  = inline('cos(2*(n-1)*pi*x/(b-a))','x','n','a','b');
  68.         dR = inline('(-2*(n-1)*pi/(b-a))*sin(2*(n-1)*pi*x/(b-a))','x','n','a','b');
  69.         method = 'symbolic';
  70.         
  71.     case 'sin' , 
  72.         R  = inline('sin(2*n*pi*x/(b-a))','x','n','a','b');
  73.         dR = inline('(2*n*pi/(b-a))*cos(2*n*pi*x/(b-a))','x','n','a','b');
  74.         method = 'symbolic';
  75. end
  76. if isequal(method,'symbolic')
  77.     Regularity = min(Regularity,1);
  78. end
  79. NBContraintes = 1 + 2*(Regularity + 1);
  80. NbPts = length(y);
  81. XVal  = linspace(a,b,NbPts);
  82. XStep = (b-a)/(NbPts-1);
  83. switch method
  84.     case 'polynomial' , 
  85.         %  Mean square system construction.
  86.         %----------------------------------
  87.         % G : Gram Matrix
  88.         % M : Matrix of constrains
  89.         % B : Second Member
  90.         %-------------------------
  91.         for ii = 1:N
  92.             for jj = 1:N
  93.                 k = ii + jj - 1;
  94.                 G(ii,jj) = (b^k-a^k)/k;
  95.             end
  96.             % Zero mean constraint.
  97.             M(1,ii) = (b^ii-a^ii)/ii;
  98.             % Second member.
  99.             yTIMES_RI = y.*x.^(ii-1);
  100.             BiVAL = 0.5*(yTIMES_RI(1:end-1) + yTIMES_RI(2:end));
  101.             B(ii,1) = sum(diff(x).*BiVAL);
  102.         end
  103.         B(N+1,1)= 0;
  104.         
  105.         % Add eventual boundary constrains.
  106.         %----------------------------------
  107.         if (Regularity > -1) & (N > NBContraintes)
  108.             for i = 1:N
  109.                 M([2,3],i) = [a^(i-1) ; b^(i-1)];
  110.             end
  111.             for k = 1:Regularity
  112.                 for i = 1:k
  113.                     M([2*k+2,2*k+3],i) = [0;0];
  114.                 end
  115.                 for i = k+1:N
  116.                     M([2*k+2,2*k+3],i) = prod([i-k:i-1])*[a;b].^(i-1-k);
  117.                 end
  118.             end
  119.             B(N+2:N+NBContraintes,1) = 0;
  120.         end
  121.         
  122.         % Solving linear system.
  123.         %-----------------------
  124.         A = [G M';M zeros(NBContraintes,NBContraintes)];
  125.         U = AB;
  126.         PSI = 0;
  127.         for ii = 1:N
  128.             PSI = PSI+U(ii).*XVal.^(ii-1);
  129.         end
  130.     case 'orthconst' , 
  131.         %  Mean square system construction.
  132.         %----------------------------------
  133.         % G : Gram Matrix
  134.         % M : Matrix of constrains
  135.         % B : Second Member
  136.         %-------------------------
  137.         NBContraintes = NBContraintes-1;
  138.         for ii = 1:N
  139.             for jj = 1:N
  140.                 k = ii + jj - 1;
  141.                 G(ii,jj) = (b^k-a^k)/k;
  142.             end
  143.             % Second member.
  144.             yTIMES_RI = y.*x.^(ii-1);
  145.             BiVAL = 0.5*(yTIMES_RI(1:end-1) + yTIMES_RI(2:end));
  146.             B(ii,1) = sum(diff(x).*BiVAL);
  147.         end
  148.         M = [];
  149.         MConstraint = [];
  150.         
  151.         % Add eventual boundary constrains.
  152.         %----------------------------------
  153.         if (Regularity > -1) & (N > NBContraintes)
  154.             for i = 1:N
  155.                 M([1,2],i) = [a^(i-1) ; b^(i-1)];
  156.             end
  157.             for k = 1:Regularity
  158.                 for i = 1:k
  159.                     M([2*k+1,2*k+2],i) = [0;0];
  160.                 end
  161.                 for i = k+1:N
  162.                     M([2*k+1,2*k+2],i) = prod([i-k:i-1])*[a;b].^(i-1-k);
  163.                 end
  164.             end
  165.             dy = y;
  166.             dx = diff(x);
  167.             for p = 0:Regularity
  168.                 leftVAL  = dy(1)/(dx(1)^p);
  169.                 rightVAL = dy(end)/(dx(end)^p);
  170.                 B(N+2*p+1,1) = leftVAL;
  171.                 B(N+2*p+2,1) = rightVAL;
  172.                 dy = diff(dy);
  173.             end
  174.             MConstraint = zeros(NBContraintes,NBContraintes);
  175.         end
  176.         
  177.         % Solving linear system.
  178.         %-----------------------
  179.         A = [G M';M MConstraint];
  180.         U = AB;
  181.         PSI = y;
  182.         for ii = 1:N
  183.             PSI = PSI-U(ii).*XVal.^(ii-1);
  184.         end
  185.     case 'symbolic' , 
  186.         %  Mean square system construction.
  187.         %----------------------------------
  188.         % G : Gram Matrix
  189.         % M : Matrix of constrains
  190.         % B : Second Member
  191.         %-------------------------
  192.         for i = 1:N
  193.             RI = R(XVal,i,a,b);
  194.             for j=1:N
  195.                 G(i,j) = sum(RI.*R(XVal,j,a,b));
  196.             end
  197.             % Constraint.
  198.             M(1,i) = sum(RI);
  199.             % Second member.
  200.             B(i,1) = sum(y.*R(x,i,a,b));
  201.         end
  202.         rk = rank(M,sqrt(eps)/100);
  203.         if rk<1
  204.             M = [];
  205.             NBContraintes = NBContraintes-1;
  206.         end
  207.         next = size(M,1)+1;
  208.         
  209.         % Add eventual boundary constrains.
  210.         %----------------------------------
  211.         if (Regularity > -1) & (N > NBContraintes)
  212.             for i = 1:N
  213.                 M([next,next+1],i) = [R(a,i,a,b) ; R(b,i,a,b)];
  214.             end
  215.             nbRow = size(M,1);
  216.             rk = rank(M,sqrt(eps)/100);
  217.             if rk<nbRow
  218.                 M([rk+1:nbRow],:) = [];
  219.                 NBContraintes = NBContraintes-(nbRow-rk);
  220.             end
  221.             next = size(M,1)+1;
  222.             if Regularity > 0
  223.                 for i = 1:N
  224.                     M([next,next+1],i) = [dR(a,i,a,b) ; dR(b,i,a,b)];
  225.                 end
  226.                 nbRow = size(M,1);
  227.                 rk = rank(M,sqrt(eps)/100);
  228.                 if rk<nbRow
  229.                     M([rk+1:nbRow],:) = [];
  230.                     NBContraintes = NBContraintes-(nbRow-rk);
  231.                 end
  232.             end
  233.         end
  234.         if NBContraintes>0 , B(N+1:N+NBContraintes,1) = 0; end
  235.         
  236.         % Solving linear system.
  237.         %-----------------------
  238.         A = [G M';M zeros(NBContraintes,NBContraintes)];
  239.         U = AB;
  240.         PSI = 0;
  241.         for i = 1:N
  242.             PSI = PSI+U(i).*R(XVal,i,a,b);
  243.         end
  244. end
  245. % Interpolation on a NbPts-grid
  246. XValOLD = XVal;
  247. XVal = linspace(0,1,NbPts);
  248. PSI  = interp1(XValOLD,PSI,XVal);
  249. % L2 Normalization.
  250. XStep = XVal(2)-XVal(1);
  251. NC = sqrt(sum(PSI.^2)*XStep);
  252. PSI = PSI/NC;