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

波变换

开发平台:

Matlab

  1. function coefs = cwt(SIG,scales,WAV,plotmode,xlim)
  2. %CWT Real or Complex Continuous 1-D wavelet coefficients.
  3. %   COEFS = CWT(S,SCALES,'wname') computes the continuous
  4. %   wavelet coefficients of the vector S at real, positive
  5. %   SCALES, using wavelet whose name is 'wname'.
  6. %   The signal S is real, the wavelet can be real or complex. 
  7. %
  8. %   COEFS = CWT(S,SCALES,'wname','plot') computes
  9. %   and, in addition, plots the continuous wavelet
  10. %   transform coefficients.
  11. %
  12. %   COEFS = CWT(S,SCALES,'wname',PLOTMODE) computes and,
  13. %   plots the continuous wavelet transform coefficients.
  14. %   Coefficients are colored using PLOTMODE.
  15. %   PLOTMODE = 'lvl' (By scale) or 
  16. %   PLOTMODE = 'glb' (All scales) or
  17. %   PLOTMODE = 'abslvl' or 'lvlabs' (Absolute value and By scale) or
  18. %   PLOTMODE = 'absglb' or 'glbabs' (Absolute value and All scales)
  19. %
  20. %   CWT(...,'plot') is equivalent to CWT(...,'absglb')
  21. %
  22. %   You get 3-D plots (surfaces) using the same keywords listed
  23. %   above for the PLOTMODE parameter, preceded by '3D'. For example:
  24. %   COEFS = CWT(...,'3Dplot') or COEFS = CWT(...,'3Dlvl').
  25. %
  26. %   COEFS = CWT(S,SCALES,'wname',PLOTMODE,XLIM) computes, and
  27. %   plots, the continuous wavelet transform coefficients.
  28. %   Coefficients are colored using PLOTMODE and XLIM.
  29. %   XLIM = [x1 x2] with 1 <= x1 < x2 <= length(S).
  30. %
  31. %   For each given scale a within the vector SCALES, the  
  32. %   wavelet coefficients C(a,b) are computed for b = 1 to
  33. %   ls = length(S), and are stored in COEFS(i,:)
  34. %   if a = SCALES(i). 
  35. %   Output argument COEFS is a la-by-ls matrix where la 
  36. %   is the length of SCALES. COEFS is a real or complex matrix
  37. %   depending on the wavelet type.
  38. %
  39. %   Examples of valid uses are:
  40. %   t = linspace(-1,1,512);
  41. %   s = 1-abs(t);
  42. %   c = cwt(s,1:32,'cgau4');
  43. %   c = cwt(s,[64 32 16:-2:2],'morl');
  44. %   c = cwt(s,[3 18 12.9 7 1.5],'db2');
  45. %   c = cwt(s,1:32,'sym2','lvl');
  46. %   c = cwt(s,1:64,'sym4','abslvl',[100 400]);
  47. %
  48. %   See also WAVEDEC, WAVEFUN, WAVEINFO, WCODEMAT.
  49. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  50. %   Last Revision: 15-May-2003.
  51. %   Copyright 1995-2004 The MathWorks, Inc.
  52. %   $Revision: 1.18.4.2 $ $Date: 2004/03/15 22:40:01 $
  53. % Check scales.
  54. %--------------
  55. err = 0;
  56. if isempty(scales) ,         err = 1;
  57. elseif min(size(scales))>1 , err = 1;
  58. elseif min(scales)<eps,      err = 1;
  59. end
  60. if err
  61.     errargt(mfilename,'Invalid Value for Scales !','msg');
  62.     error('*')
  63. end
  64. % Check signal.
  65. %--------------
  66. if isnumeric(SIG)
  67.     val_SIG = SIG;
  68.     lenSIG  = length(val_SIG);
  69.     xSIG    = (1:lenSIG);
  70.     stepSIG = 1;
  71.     
  72. elseif isstruct(SIG)
  73.     try , val_SIG = SIG.y; catch , err = 1; end
  74.     if err~=1
  75.         lenSIG = length(val_SIG);
  76.         try
  77.             xSIG = SIG.x; stepSIG = xSIG(2)-xSIG(1);
  78.         catch
  79.             try
  80.                 stepSIG = SIG.step;
  81.                 xSIG = (0:stepSIG:(lenSIG-1)*stepSIG);
  82.             catch
  83.                 try
  84.                     xlim = SIG.xlim;
  85.                     xSIG = linspace(xlim(1),xlim(2),lenSIG);
  86.                     stepSIG = xSIG(2)-xSIG(1);
  87.                 catch
  88.                     xSIG = (1:lenSIG); stepSIG = 1;
  89.                 end
  90.             end
  91.         end
  92.     end
  93.     
  94. elseif iscell(SIG)
  95.     val_SIG = SIG{1};
  96.     xATTRB  = SIG{2};
  97.     lenSIG  = length(val_SIG);
  98.     len_xATTRB = length(xATTRB);
  99.     if len_xATTRB==lenSIG
  100.         xSIG = xATTRB; 
  101.         stepSIG = xSIG(2)-xSIG(1);
  102.     elseif len_xATTRB==2
  103.         xlim = xATTRB;
  104.         xSIG = linspace(xlim(1),xlim(2),lenSIG);
  105.         stepSIG = xSIG(2)-xSIG(1);
  106.     elseif len_xATTRB==1
  107.         stepSIG = xATTRB;
  108.         xSIG = (0:stepSIG:(lenSIG-1)*stepSIG);
  109.     else
  110.         xSIG = (1:length(SIG)); stepSIG = 1;
  111.     end
  112. else
  113.     err = 1;
  114. end
  115. if err
  116.     errargt(mfilename,'Invalid Value for Signal !','msg');
  117.     error('*')
  118. end
  119. % Check wavelet.
  120. %---------------
  121. getINTEG = 1;
  122. getWTYPE = 1;
  123. if ischar(WAV)
  124.     precis = 10; % precis = 15;
  125.     [val_WAV,xWAV] = intwave(WAV,precis);
  126.     stepWAV = xWAV(2)-xWAV(1);
  127.     wtype = wavemngr('type',WAV);
  128.     if wtype==5 , val_WAV = conj(val_WAV); end
  129.     getINTEG = 0;
  130.     getWTYPE = 0;
  131. elseif isnumeric(WAV)
  132.     val_WAV = WAV;
  133.     lenWAV  = length(val_WAV);
  134.     xWAV = linspace(0,1,lenWAV);
  135.     stepWAV = 1/(lenWAV-1);
  136.     
  137. elseif isstruct(WAV)
  138.     try , val_WAV = WAV.y; catch , err = 1; end
  139.     if err~=1
  140.         lenWAV = length(val_WAV);
  141.         try
  142.             xWAV = WAV.x; stepWAV = xWAV(2)-xWAV(1);
  143.         catch
  144.             try
  145.                 stepWAV = WAV.step;
  146.                 xWAV = (0:stepWAV:(lenWAV-1)*stepWAV);
  147.             catch
  148.                 try
  149.                     xlim = WAV.xlim;
  150.                     xWAV = linspace(xlim(1),xlim(2),lenWAV);
  151.                     stepWAV = xWAV(2)-xWAV(1);
  152.                 catch
  153.                     xWAV = (1:lenWAV); stepWAV = 1;
  154.                 end
  155.             end
  156.         end
  157.     end
  158.     
  159. elseif iscell(WAV)
  160.     if isnumeric(WAV{1})
  161.         val_WAV = WAV{1};
  162.     elseif ischar(WAV{1})
  163.         precis  = 10;
  164.         val_WAV = intwave(WAV{1},precis);
  165.         wtype = wavemngr('type',WAV{1});        
  166.         getINTEG = 0;
  167.         getWTYPE = 0;
  168.     end
  169.     xATTRB  = WAV{2};
  170.     lenWAV  = length(val_WAV);
  171.     len_xATTRB = length(xATTRB);
  172.     if len_xATTRB==lenWAV
  173.         xWAV = xATTRB; stepWAV = xWAV(2)-xWAV(1);
  174.     elseif len_xATTRB==2
  175.         xlim = xATTRB;
  176.         xWAV = linspace(xlim(1),xlim(2),lenWAV);
  177.         stepWAV = xWAV(2)-xWAV(1);
  178.     elseif len_xATTRB==1
  179.         stepWAV = xATTRB;
  180.         xWAV = (0:stepWAV:(lenWAV-1)*stepWAV);
  181.     else
  182.         xWAV = linspace(0,1,lenWAV);
  183.         stepWAV = 1/(lenWAV-1);
  184.     end
  185. end
  186. if err
  187.     errargt(mfilename,'Invalid Value for Wavelet !','msg');
  188.     error('*')
  189. end
  190. xWAV = xWAV-xWAV(1);
  191. xMaxWAV = xWAV(end);
  192. if getWTYPE ,  wtype = 4; end
  193. if getINTEG ,  val_WAV = stepWAV*cumsum(val_WAV); end
  194. %---------------------------------------------------------------------------%
  195. val_SIG   = val_SIG(:)';
  196. nb_SCALES = length(scales);
  197. coefs     = zeros(nb_SCALES,lenSIG);
  198. ind  = 1;
  199. for k = 1:nb_SCALES
  200.     a = scales(k);
  201.     a_SIG = a/stepSIG;
  202.     j = [1+floor([0:a_SIG*xMaxWAV]/(a_SIG*stepWAV))];     
  203.     if length(j)==1 , j = [1 1]; end
  204.     f            = fliplr(val_WAV(j));
  205.     coefs(ind,:) = -sqrt(a)*wkeep1(diff(wconv1(val_SIG,f)),lenSIG);
  206.     ind          = ind+1;
  207. end
  208. % Test for plots.
  209. %----------------
  210. if nargin<4 , return; end
  211. % Display Continuous Analysis.
  212. %-----------------------------
  213. dummyCoefs = coefs;
  214. NBC = 240;
  215. if strmatch('3D',plotmode)
  216.     dim_plot = '3D';
  217. else
  218.     dim_plot = '2D';
  219. end
  220. if isequal(wtype,5)
  221.    if ~isempty(findstr(plotmode,'lvl')) 
  222.        plotmode = 'lvl';
  223.    else
  224.        plotmode = 'glb';   
  225.    end
  226. end
  227. switch plotmode
  228.   case {'lvl','3Dlvl'}
  229.     lev_mode  = 'row';
  230.     abs_mode  = 0;
  231.     beg_title = ['By scale'];
  232.   case {'glb','3Dglb'}
  233.     lev_mode  = 'mat';
  234.     abs_mode  = 0;
  235.     beg_title = '';
  236.   case {'abslvl','lvlabs','3Dabslvl','3Dlvlabs'}
  237.     lev_mode  = 'row';
  238.     abs_mode  = 1;
  239.     beg_title = ['Abs. and by scale'];
  240.   case {'absglb','glbabs','plot','2D','3Dabsglb','3Dglbabs','3Dplot','3D'}
  241.     lev_mode  = 'mat';
  242.     abs_mode  = 1;
  243.     beg_title = ['Absolute'];
  244.   otherwise
  245.     plotmode  = 'absglb';
  246.     lev_mode  = 'mat';
  247.     abs_mode  = 1;
  248.     beg_title = ['Absolute'];
  249.     dim_plot  = '2D';
  250. end
  251. if abs_mode , dummyCoefs = abs(dummyCoefs); end
  252. if nargin==5
  253.     if xlim(2)<xlim(1) , xlim = xlim([2 1]); end    
  254.     if xlim(1)<1      , xlim(1) = 1;   end
  255.     if xlim(2)>lenSIG , xlim(2) = lenSIG; end
  256.     indices = [xlim(1):xlim(2)];
  257.     switch plotmode
  258.       case {'glb','absglb'}
  259.         cmin = min(min(dummyCoefs(:,indices)));
  260.         cmax = max(max(dummyCoefs(:,indices)));
  261.         dummyCoefs(dummyCoefs<cmin) = cmin;
  262.         dummyCoefs(dummyCoefs>cmax) = cmax;
  263.       case {'lvl','abslvl'}
  264.         cmin = min((dummyCoefs(:,indices))')';
  265.         cmax = max((dummyCoefs(:,indices))')';
  266.         for k=1:nb_SCALES
  267.             ind = dummyCoefs(k,:)<cmin(k);
  268.             dummyCoefs(k,ind) = cmin(k);
  269.             ind = dummyCoefs(k,:)>cmax(k);
  270.             dummyCoefs(k,ind) = cmax(k);
  271.         end
  272.     end
  273. end
  274. nb    = min(5,nb_SCALES);
  275. level = '';
  276. for k=1:nb , level = [level ' '  num2str(scales(k))]; end
  277. if nb<nb_SCALES , level = [level ' ...']; end
  278. nb     = ceil(nb_SCALES/20);
  279. tics   = 1:nb:nb_SCALES;
  280. tmp    = scales(1:nb:nb*length(tics));
  281. labs   = num2str(tmp(:));
  282. plotPARAMS = {NBC,lev_mode,abs_mode,tics,labs,''};
  283. switch dim_plot
  284.   case '2D'
  285.     if wtype<5
  286.         titleSTR = [beg_title ' Values of Ca,b Coefficients for a = ' level];
  287.         plotPARAMS{6} = titleSTR;
  288.         axeAct = gca;
  289.         plotCOEFS(axeAct,dummyCoefs,plotPARAMS);
  290.     else
  291.         axeAct = subplot(2,2,1);
  292.         titleSTR = ['Real part of Ca,b for a = ' level];
  293.         plotPARAMS{6} = titleSTR;
  294.         plotCOEFS(axeAct,real(dummyCoefs),plotPARAMS);
  295.         axeAct = subplot(2,2,2);
  296.         titleSTR = ['Imaginary part of Ca,b for a = ' level];
  297.         plotPARAMS{6} = titleSTR;
  298.         plotCOEFS(axeAct,imag(dummyCoefs),plotPARAMS);
  299.         axeAct = subplot(2,2,3);
  300.         titleSTR = ['Modulus of Ca,b for a = ' level];
  301.         plotPARAMS{6} = titleSTR;
  302.         plotCOEFS(axeAct,abs(dummyCoefs),plotPARAMS);
  303.         axeAct = subplot(2,2,4);
  304.         titleSTR = ['Angle of Ca,b for a = ' level];
  305.         plotPARAMS{6} = titleSTR;
  306.         plotCOEFS(axeAct,angle(dummyCoefs),plotPARAMS);
  307.     end
  308.     colormap(pink(NBC));
  309.   case '3D'
  310.     if wtype<5
  311.         titleSTR = [beg_title ' Values of Ca,b Coefficients for a = ' level];
  312.         plotPARAMS{6} = titleSTR;
  313.         axeAct = gca;
  314.         surfCOEFS(axeAct,dummyCoefs,plotPARAMS);
  315.     else
  316.         axeAct = subplot(2,2,1);
  317.         titleSTR = ['Real part of Ca,b for a = ' level];
  318.         plotPARAMS{6} = titleSTR;
  319.         surfCOEFS(axeAct,real(dummyCoefs),plotPARAMS);
  320.         axeAct = subplot(2,2,2);
  321.         titleSTR = ['Imaginary part of Ca,b for a = ' level];
  322.         plotPARAMS{6} = titleSTR;
  323.         surfCOEFS(axeAct,imag(dummyCoefs),plotPARAMS);
  324.         axeAct = subplot(2,2,3);
  325.         titleSTR = ['Modulus of Ca,b for a = ' level];
  326.         plotPARAMS{6} = titleSTR;
  327.         surfCOEFS(axeAct,abs(dummyCoefs),plotPARAMS);
  328.         axeAct = subplot(2,2,4);
  329.         titleSTR = ['Angle of Ca,b for a = ' level];
  330.         plotPARAMS{6} = titleSTR;
  331.         surfCOEFS(axeAct,angle(dummyCoefs),plotPARAMS);
  332.     end
  333. end
  334. %----------------------------------------------------------------------
  335. function plotCOEFS(axeAct,coefs,plotPARAMS)
  336. [NBC,lev_mode,abs_mode,tics,labs,titleSTR] = deal(plotPARAMS{:});
  337. coefs = wcodemat(coefs,NBC,lev_mode,abs_mode);
  338. img   = image(coefs);
  339. set(axeAct, ...
  340.         'YTick',tics, ...
  341.         'YTickLabel',labs, ...
  342.         'YDir','normal', ...
  343.         'Box','On' ...
  344.         );
  345. title(titleSTR,'Parent',axeAct);
  346. xlabel('time (or space) b','Parent',axeAct);
  347. ylabel('scales a','Parent',axeAct);
  348. %----------------------------------------------------------------------
  349. function surfCOEFS(axeAct,coefs,plotPARAMS)
  350. [NBC,lev_mode,abs_mode,tics,labs,titleSTR] = deal(plotPARAMS{:});
  351. img = surf(coefs);
  352. set(axeAct, ...
  353.         'YTick',tics, ...
  354.         'YTickLabel',labs, ...
  355.         'YDir','normal', ...
  356.         'Box','On' ...
  357.         );
  358. title(titleSTR,'Parent',axeAct);
  359. xlabel('time (or space) b','Parent',axeAct);
  360. ylabel('scales a','Parent',axeAct);
  361. zlabel('COEFS','Parent',axeAct);
  362. xl = [1 size(coefs,2)];
  363. yl = [1 size(coefs,1)];
  364. zl = [min(min(coefs)) max(max(coefs))];
  365. set(axeAct,'Xlim',xl,'Ylim',yl,'Zlim',zl,'view',[-30 40]);
  366. colormap(pink(NBC));
  367. shading('interp')
  368. %----------------------------------------------------------------------