www.pudn.com > tftb2002toolbox.rar > ATOMS.M


function [sig,locatoms]= atoms(N,coord,display);
% ATOMS Linear combination of elementary Gaussian atoms.
%	[SIG,LOCATOMS] = ATOMS(N,COORD,DISPLAY) 
%	generates a signal consisting in a linear combination of elementary
%	gaussian wave packets. The locations of the time-frequency centers 
% 	of the different atoms are either fixed by the input parameter COORD 
%	or successively defined by clicking with the mouse (if NARGIN==1).  
% 
%	N        : number of points of the signal
%	COORD    : matrix of time-frequency centers, of the form
%		   [t1,f1,T1,A1;...;tM,fM,TM,AM]. (ti,fi) are the 
%		   time-frequency coordinates of atom i, Ti is its time 
%		   duration and Ai its amplitude. Frequencies f1..fM should 
%		   be normalized (between 0 and 0.5). 
%		   If nargin==1, the location of the atoms will be defined
%		   by clicking with the mouse, with the help of a menu. The 
%		   default value for Ti is N/4.
%       DISPLAY    display switch. if DISPLAY=1 a figure is displayed,
%                  otherwise nothing is displayed. default value is 1
%	SIG      : output signal.
%	LOCATOMS : matrix of time-frequency coordinates and durations of the
%		   atoms. 
%
%	Example : 
%	 sig=atoms(128);
%	 sig=atoms(128,[32,0.3,32,1;56,0.15,48,1.22;102,0.41,20,0.7]); 
%	 sig=atoms(128,[32,0.3,32,1;56,0.15,48,1.22;102,0.41,20,0.7],0); 

%	P. Flandrin, May 1995 - O. Lemoine, February 1996.
%	F. Auger - O. Lemoine, June 1996.
%       E. Chassande-Mottin, F. Auger, May 1998.
%	Copyright (c) 1996 by CNRS (France).
%
%	------------------- CONFIDENTIAL PROGRAM -------------------- 
%	This program can not be used without the authorization of its
%	author(s). For any comment or bug report, please send e-mail to 
%			    lemoine@alto.unice.fr 

if ( nargin < 1 ),
 error ( 'At least one parameter required' ) ;
end

comp=computer; % so as to know the running computer
MatlabVersion=version; MatlabVersion=str2num(MatlabVersion(1));
%if MatlabVersion<5,
% error('Unfortunately, this version does not run on matlab 4.');
%end;

if (nargin<3), display=1; end;

sig=(1+j)*zeros(N,1);
t=linspace(0,2*pi,100); 
locatoms=[];
Natoms=0; choice=1;
T=N/4; A=1;

if (display==1),
 clf; set(gcf,'Resize','On','NextPlot','Add');

 axsig  = axes('Units','normal','Visible','on','Box','On',...
               'position', [0.10 0.65 0.80 0.25],...
               'XLim', [1 N], 'XGrid','on', ...
               'YLim', [-1 1],'YGrid','on');

 axtfr  = axes('Units','normal','Visible','on','Box','On',...
               'position', [0.10 0.12 0.80 0.45],...
               'XLim',[1 N],  'XGrid','on',...
               'YLim',[0 0.5],'YGrid','on');

 axes(axtfr);
 xlabel('Time'); ylabel('Normalized frequency'); 
 hold on
end;

if (nargin==1),
 fprintf(' Default value for the time-duration : %f\n',T);
 fprintf(' Default value for the amplitude     : %f\n',A);
 while choice~=5,
  MaxSig=max(abs(real(sig)));
  axes(axsig); plot(1:N, real(sig),'g');
  if MaxSig==0.0,
   set(axsig,'XLim',[1 N], 'XGrid','on', 'YLim', [-1 1], 'YGrid','on');
  else
   set(axsig,'XLim',[1 N], 'XGrid','on', 'YLim', [-MaxSig MaxSig],'YGrid','on');
  end;
  title([int2str(Natoms),' Gaussian atom(s)'])

  choice=menu('ATOMS MENU',...
              'Add a gaussian atom',...
              'Delete the last atom',...
              'Change the time-duration',...
              'Change the amplitude',...
              'Stop');
  if choice==1, 
   axes(axtfr); [t0,f0]=ginput(1);             % add a gaussian atom
   t0=round(max(min(t0,N),1)); f0=max(min(f0,0.5),0.0);
   locatoms=[locatoms; t0 f0 T A];
   axes(axtfr); plot(t0,f0,'x'); plot((t0+j*f0)+(0.5*T*cos(t)+j*(2/(T*pi))*sin(t)))
   sig=sig + A*amgauss(N,t0,T) .* fmconst(N,f0,t0);
   Natoms=Natoms+1;
  elseif (choice==2 & Natoms>=1),              % delete last atom
   t0=locatoms(Natoms,1);
   f0=locatoms(Natoms,2);
   Told =locatoms(Natoms,3);
   Aold =locatoms(Natoms,4);
   axes(axtfr); AxtfrChildren=get(gca,'Children'); delete(AxtfrChildren(1:2)); 
   if (Natoms==1)
    Natoms=0; locatoms=[]; sig=(1+j)*zeros(N,1);
   else
    sig=sig - Aold*amgauss(N,t0,Told) .* fmconst(N,f0,t0);
    Natoms=Natoms-1;
    locatoms=locatoms(1:Natoms,:);
   end;
  elseif choice==3,
   fprintf(' Old time duration : %f\n', T);
   Told=T; T=input(' New time duration : ');
   if isempty(T), T=Told; end;
  elseif choice==4,
   fprintf(' Old amplitude : %f\n', A);
   Aold=A; A=input(' New amplitude : ');
   if isempty(A), A=Aold; end;
  end
 end;
elseif (nargin>=2),
 [Natoms,ccoord]=size(coord);
 if (ccoord~=4),
  error('Bad dimension for COORD');
 end;
 for k=1:Natoms,
  t0=round(max(min(coord(k,1),N),1));
  f0=max(min(coord(k,2),0.5),0.0);
  T=coord(k,3); A=coord(k,4);
  if t0~=coord(k,1),
   disp('Warning : ti should be between 1 and N');
  elseif f0~=coord(k,2),
   disp('Warning : fi should be between 0 and 0.5');
  elseif T<0,
   error('T must be positive');
  elseif A<0,
   error('A must be positive');
  else
   sig=sig+A*amgauss(N,t0,T) .* fmconst(N,f0,t0); 
   if (display==1),
    axes(axtfr); plot(t0,f0,'x');
    plot((t0+j*f0)+(0.5*T*cos(t)+j*(2/(T*pi))*sin(t)))
   end;
  end
 end
 locatoms=coord;
end

if (display==1),
 hold off
 MinSig=min(real(sig));
 MaxSig=max(real(sig));
 axes(axsig); plot(1:N, real(sig),'g');
 if MaxSig==0.0,
  set(axsig,'XLim',[1 N], 'XGrid','on', 'YLim', [-1 1], 'YGrid','on');
 else
  set(axsig,'XLim',[1 N], 'XGrid','on', 'YLim', [-MaxSig MaxSig],'YGrid','on');
 end;
 title([int2str(Natoms),' Gaussian atom(s)'])
end;