function tfrqview(tfr,sig,t,method,p1,p2,p3,p4,p5);
%TFRQVIEW Quick visualization of time-frequency representations.
%       TFRQVIEW(TFR,SIG,T,METHOD,P1,P2,P3,P4,P5) allows a quick 
%       visualization of a time-frequency representation.
%
%       TFR     : time-frequency representation (MxN).
%       SIG     : signal in time. If unavailable, put sig=[] as input
%                 parameter.                    (default : []).
%       T       : time instants                 (default : 1:N).
%       METHOD  : name of chosen representation (default : 'TYPE1').
%                 See the TFR* files for authorized names.
%                 TYPE1 : the representation TFR goes in normalized
%                       frequency from -0.5 to 0.5 ; 
%                 TYPE2 : the representation TFR goes in normalized
%                       frequency from 0 to 0.5. 
%       P1...P5 : optional parameters of the representation : run the 
%                 file TFRPARAM(METHOD) to know the meaning of P1..P5 
%                 for your method. 
%
%	When you use the 'save' option in the main menu, you save all your
%	variables as well as two strings, TfrQView and TfrView, in a mat 
%	file. If you load this file and do eval(TfrQView), you will restart
%	the display session under tfrqview ; if you do eval(TfrView), you
%	will obtain the exact layout of the screen you had when clicking on 
%	the 'save' button. 
%   
%       Example : 
%        sig=fmsin(128); tfr=tfrwv(sig);
%        tfrqview(tfr,sig,1:128,'tfrwv');
%
%       See also TFRVIEW, TFRSAVE, TFRPARAM.

%       F. Auger, September 1994, July 1995 
%       O. Lemoine, Oct 1995, May-July 1996.
%       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 
%       f.auger@ieee.org 

comp=computer;  %  so as to know the running computer

% Tests on the input arguments
if nargin<1,
 error('At least one parameter required'); % at least the tfr
end
[tfrrow,tfrcol]=size(tfr);
if nargin==1,
 sig=[]; t=1:tfrcol; method='type1'; % empty signal
elseif nargin==2,
 t=1:tfrcol; method='type1';
elseif nargin==3,
 method='type1';
end
[trow,tcol] = size(t);
if (trow~=1),
 error('T must only have one row'); % t must be a row vector
end;
if (tfrcol~=tcol),
 error('T must have as much elements as tfr has columns');
end;

[Nsig,Ncol]=size(sig);
if Ncol>2,
 error('SIG must have one or two columns');
end

% Computation of Nf2, the number of interresting points in frequency
method=upper(method);
if istfr2(method),
 Nf2=tfrrow;
elseif istfr1(method),
 Nf2=tfrrow/2; 
else
 error('Unknown representation. Use type1 or type2');
end;

% Computation of freq (vector of frequency samples) 
if istfraff(method),
 freq=eval(['p',num2str(nargin-4)]);   	% last input argument is freqs.
else
 freq=(0.5*(0:Nf2-1)/Nf2);
end

% Initialization of the variables
if exist('options.mat'),
 load options
else
 threshold=5.0;  % visualization threshold
 linlogtfr=0;    % tfr visualization scale : 0 for linear 1 for logarithmic
 linlogspec=1;   % spectrum visualization scale
 sigenveloppe=0; % signal enveloppe visualization

 levelnumb=6;   % number of levels in the contour plot
 colmap=1;      % colormap index
 
 display=2;     % display index
 
 isgridsig=0;   % grid on signal
 isgridspec=0;  % grid on spectrum
 isgridtfr=0;   % grid on tfr
 
 issig=0;       % display signal
 isspec=0;      % display spectrum
 iscolorbar=0;  % display colorbar

end;
fs = 3000;

% Test of analycity
if ~isempty(sig),
 for k=1:Ncol,
  % spec(:,k)=abs(fft(sig(min(t):max(t),k))).^2; Nsp=length(spec);
  % modifications :  F. Auger (fog), 30/11/97
  Lt_fog=max(t)-min(t)+1;   
  Nb_tranches_fog = floor(Lt_fog/tfrrow);
  % fprintf('%f \n',Nb_tranches_fog);
  spec(:,k)=zeros(tfrrow,1);
  for Num_tranche_fog=0:Nb_tranches_fog-1,
   % fprintf('%f \n',Num_tranche_fog);
   spec(:,k)=spec(:,k)+abs(fft(sig(min(t)+tfrrow*Num_tranche_fog+(0:tfrrow-1),k))).^2;
  end;

  if (Lt_fog>Nb_tranches_fog*tfrrow),
   spectre_fog=fft(sig(min(t)+tfrrow*Nb_tranches_fog:max(t),k),tfrrow);
   spectre_fog=spectre_fog(:);
   spec(:,k)=spec(:,k)+abs(spectre_fog).^2;
  end;

  
  % spec1=sum(spec(1:tfrrow/2,k));
  % spec2=sum(spec(tfrrow/2+1:Nsp,k));
  spec1=sum(spec(1:tfrrow/2,k));
  spec2=sum(spec(tfrrow/2+1:tfrrow,k));
  
  if spec2>spec1/10,
   disp('Be careful : the signal is not analytic!');
  end
 end
end

% Test of reality
if (Ncol==2 & ~isreal(tfr)),
 disp('Cross distribution. As the result is complex, we display the real part.');
 tfr=real(tfr);
end

ChoiceDisplay     = 1; % All the possible values of the choice variable
ChoiceLayout      = 2;
ChoiceColormap    = 3;
ChoiceSampling    = 4;
ChoiceThreshold   = 5;
ChoiceLinlog      = 6;
ChoiceLevels      = 7;
ChoiceGrid        = 8;
ChoiceRedraw      = 9;
ChoiceNewFigure   =10;
ChoiceSaveResults =11;
ChoiceSaveOptions =12;
ChoicePrint       =13;
ChoiceClose       =14;

CallTfrView = 1; % 1 to call tfrview, 0 not to do it
RefreshFigure=1; % 1 to refresh figure every time, 0 to freeze

choice=ChoiceSampling;
while choice~=ChoiceClose,                       % while not close
 if RefreshFigure & CallTfrView,                 % Call to tfrview
  linlog=linlogtfr+2*linlogspec+4*sigenveloppe;
  isgrid=isgridsig+2*isgridspec+4*isgridtfr;
  layout=issig+isspec*2+iscolorbar*4+1;
  param = [display,linlog,threshold,levelnumb,Nf2,layout,fs,isgrid];
  if (nargin<=4),
   tfrview(tfr,sig,t,method,param);
  elseif (nargin==5),
   tfrview(tfr,sig,t,method,param,p1);
  elseif (nargin==6),
   tfrview(tfr,sig,t,method,param,p1,p2);
  elseif (nargin==7),
   tfrview(tfr,sig,t,method,param,p1,p2,p3);
  elseif (nargin==8),
   tfrview(tfr,sig,t,method,param,p1,p2,p3,p4);
  elseif (nargin==9),
   tfrview(tfr,sig,t,method,param,p1,p2,p3,p4,p5);
  end;
 end;

 if (linlogtfr==0),                              % Lin/log scale of the tfr
  linlogstr='Change to a logarithmic scale';
 else
  linlogstr='Change to a linear scale';
 end;

 if ~issig & ~isspec,
  if isgridtfr,
   GridStr='Remove the grid';
  else
   GridStr='Add a grid';
  end;
 else
  GridStr='Grids';
 end;

 if (RefreshFigure==1),
  redrawstr='Don''t redraw yet';
 else
  redrawstr='Redraw now';
 end;

 % Main menu
 choice=menu ('TFRQVIEW MENU :',...
              'Change the display mode',...       % ChoiceDisplay
              'Change the display layout',...     % ChoiceLayout
              'Change the color map',...          % ChoiceColormap
              'Change the sampling frequency',... % ChoiceSampling
              'Change the threshold',...          % ChoiceThreshold
              linlogstr,...                       % ChoiceLinlog
              'Change the number of levels',...   % ChoiceLevels
              GridStr,...                         % ChoiceGrid
              redrawstr,...                       % ChoiceRedraw
              'New figure',...                    % ChoiceNewFigure
              'Save results',...                  % ChoiceSaveResults
              'Save options',...                  % ChoiceSaveOptions
              'Print',...                         % ChoicePrint
              'Close');                           % ChoiceClose

 if (choice==ChoiceDisplay),                   % Change the display mode
 
  display=menu('DISPLAY MODE :',...
               'contour',...             % 1
               'imagesc',...             % 2
               'pcolor',...              % 3
               'surf',...                % 4
               'mesh',...                % 5
               'cancel');                % 6

  if (display==6),
   CallTfrView=0;
  else
   CallTfrView=1;
  end;

 elseif (choice==ChoiceLayout),                 % Change the display layout
 
  layout=1;
  if issig==0, 
   SignalStr= 'display signal';
  else
   SignalStr='remove signal';
  end;
 
  if isspec==0, 
   SpectrumStr= 'display spectrum';
  else
   SpectrumStr='remove spectrum';
  end;
 
  if iscolorbar==0,
   ColorbarStr='display colorbar';
  else
   ColorbarStr='remove colorbar';
  end;
  
  layout=menu('DISPLAY LAYOUT',...
              SignalStr,...
              SpectrumStr,...
              ColorbarStr,...
              'cancel');
            
  if layout==1,
   issig=~issig;
   if issig==1, 
    if isempty(sig),
     disp('Impossible action : the signal is unavailable'); issig=0; CallTfrView=0;
    else
     sigenveloppe=menu('SIGNAL REPRESENTATION','signal only','signal with enveloppe')-1;
     CallTfrView=1;
    end;
   else
    isgridsig=0;
   end; 
  elseif layout==2,   
   isspec=~isspec;
   if isspec==1,
    if isempty(sig),
     disp('Impossible action : the signal is unavailable'); isspec=0; CallTfrView=0;
    else    
     linlogspec=menu('FREQUENCY REPRESENTATION','linear scale','log scale')-1;
     CallTfrView=1;
    end;
   else
    isgridspec=0;
   end;
  elseif layout==3,
   iscolorbar=~iscolorbar; CallTfrView=1;
  elseif layout==4,
   CallTfrView=0;
  end;             
  
 elseif (choice==ChoiceColormap),           % Change the color map
  colmap=menu('COLOR MAP :',...
              'hsv','jet','cool','bone','gray','hot','prism',...
              'brighten','darken','permute','spin','cancel');
  if colmap==1,      colormap(hsv);
  elseif colmap==2,  colormap(jet); 
  elseif colmap==3,  colormap(cool);
  elseif colmap==4,  colormap(bone);
  elseif colmap==5,  colormap(gray);
  elseif colmap==6,  colormap(hot);
  elseif colmap==7,  colormap(prism);
  elseif colmap==8,  brighten(0.25);
  elseif colmap==9,  brighten(-0.25);
  elseif colmap==10, c = colormap; colormap(flipud(c));
  elseif colmap==11, spinmap;
  end
  CallTfrView=0;

 elseif (choice==ChoiceSampling),                   % Change the sampling frequency 

  fprintf(' Old sampling frequency: %f\n',fs); 
  fsold=fs; fs=input(' New sampling frequency: ');
  if isempty(fs),
   fs=fsold; CallTfrView=0;
  else
   CallTfrView=1;
  end; 

 elseif (choice==ChoiceThreshold),                  % Change the threshold

  fprintf(' Old threshold: %f\n', threshold); throld=threshold;
  threshold=input(' New threshold: ');
  if isempty(threshold),
   threshold=throld; CallTfrView=0;
  else
   CallTfrView=1;
  end

 elseif (choice==ChoiceLinlog),                     % Change the lin/log scale of tfr

  linlogtfr=1-linlogtfr;

 elseif (choice==ChoiceLevels),                     % Change the number of levels

  fprintf(' Old number of levels: %f\n',levelnumb); levelold=levelnumb;
  levelnumb=input(' New number of levels: ');
  if isempty(levelnumb),
   levelnumb=levelold; CallTfrView=0;
  else
   CallTfrView=1;
  end

 elseif (choice==ChoiceGrid),           % Grids

  if ~issig & ~isspec,	                % No signal and no spectrum
   isgridtfr=1-isgridtfr; 
   CallTfrView=1;

  elseif issig & ~isspec,               % A signal, no spectrum 
   Grid=1;
   if ~isgridsig,
    gridsigstr='add a grid on the signal';
   else
    gridsigstr='remove the grid on the signal';
   end

   if ~isgridtfr,
    gridtfrstr='add a grid on the TFR';
   else
    gridtfrstr='remove the grid on the TFR';
   end

   Grid=menu('GRID MENU :',gridsigstr,gridtfrstr,'cancel');
   if Grid==1,
    isgridsig=1-isgridsig; CallTfrView=1;
   elseif Grid==2,
    isgridtfr=1-isgridtfr; CallTfrView=1;
   else
    CallTfrView=0;
   end

  elseif ~issig & isspec,               % No signal, a spectrum
   Grid=1;
   if ~isgridspec,
    gridspestr='add a grid on the spectrum';
   else
    gridspestr='remove the grid on the spectrum';
   end
   if ~isgridtfr,
    gridtfrstr='add a grid on the TFR';
   else
    gridtfrstr='remove the grid on the TFR';
   end
   Grid=menu('GRID MENU :',gridspestr,gridtfrstr,'Close');
   if Grid==1,
    isgridspec=1-isgridspec; CallTfrView=1;
   elseif Grid==2,
    isgridtfr=1-isgridtfr; CallTfrView=1;
   else CallTfrView=0;
   end

  else                                  % A signal and a spectrum
   Grid=1;
   if ~isgridsig,
    gridsigstr='add a grid on the signal';
   else
    gridsigstr='remove the grid on the signal';
   end
   if ~isgridspec,
    gridspestr='add a grid on the spectrum';
   else
    gridspestr='remove the grid on the spectrum';
   end
   if ~isgridtfr,
    gridtfrstr='add a grid on the TFR';
   else
    gridtfrstr='remove the grid on the TFR';
   end
   Grid=menu('GRID MENU :',gridsigstr,gridspestr,gridtfrstr,'cancel');
   if Grid==1,
    isgridsig=1-isgridsig; CallTfrView=1;
   elseif Grid==2,
    isgridspec=1-isgridspec; CallTfrView=1;
   elseif Grid==3,
    isgridtfr=1-isgridtfr; CallTfrView=1;
   else CallTfrView=0;
   end
  end

 elseif (choice==ChoiceRedraw),                           % redraw ?
  RefreshFigure=1-RefreshFigure;
  if RefreshFigure==1, CallTfrView=1; end;

 elseif (choice==ChoiceNewFigure),                        % new figure
  figure; CallTfrView=1;

 elseif (choice==ChoiceSaveResults),                      % Save the results

  f=freq*fs;
  Nmethod=length(method);
  if comp(1:2)=='PC',
   DefaultName=[method(4:Nmethod),num2str(Nsig),'.mat'];
   [name,PathWorkDir] = uiputfile(DefaultName, 'Save As');
  else
   DefaultName=[method(4:Nmethod),num2str(Nsig)];
   nameStr=[' Name of the MAT file [',DefaultName,'] : '];
   name=input(nameStr,'s'); 
   while (length(name)>8),
    disp(' The name must have less than 8 characters');
    name=input(nameStr,'s'); 
   end
   if isempty(name),
    name=DefaultName;
   end
  end
  linlog=linlogtfr+2*linlogspec+4*sigenveloppe;
  isgrid=isgridsig+2*isgridspec+4*isgridtfr;
  param = [display,linlog,threshold,levelnumb,Nf2,layout,fs,isgrid];
  SavedColormap=colormap;
  if (nargin<=4),
   TfrQView=['colormap(SavedColormap); tfrqview(tfr,sig,t,method)'];
   TfrView =['clf;colormap(SavedColormap); tfrview(tfr,sig,t,method,param)'];
   eval(['save ',PathWorkDir,name,...
         ' tfr sig t f fs method param SavedColormap TfrView TfrQView']);
  elseif (nargin==5),
   TfrQView=['colormap(SavedColormap); tfrqview(tfr,sig,t,method,p1)'];
   TfrView =['clf; colormap(SavedColormap); tfrview(tfr,sig,t,method,param,p1)']; 
   eval(['save ',PathWorkDir,name, ...
         ' tfr sig t f fs method param p1 SavedColormap TfrView TfrQView']);
  elseif (nargin==6),
   TfrQView=['colormap(SavedColormap); tfrqview(tfr,sig,t,method,p1,p2)'];
   TfrView =['clf; colormap(SavedColormap); tfrview(tfr,sig,t,method,param,p1,p2)'];
   eval(['save ',PathWorkDir,name,...
         ' tfr sig t f fs method param p1 p2 SavedColormap TfrView TfrQView']);
  elseif (nargin==7),
   TfrQView=['colormap(SavedColormap); tfrqview(tfr,sig,t,method,p1,p2,p3)'];
   TfrView =['clf; colormap(SavedColormap); tfrview(tfr,sig,t,method,param,p1,p2,p3)'];
   eval(['save ',PathWorkDir,name,...
         ' tfr sig t f fs method param p1 p2 p3 SavedColormap TfrView TfrQView']);
  elseif (nargin==8),
   TfrQView=['colormap(SavedColormap); tfrqview(tfr,sig,t,method,p1,p2,p3,p4)'];
   TfrView =['clf; colormap(SavedColormap); tfrview(tfr,sig,t,method,param,p1,p2,p3,p4)'];
   eval(['save ',PathWorkDir,name,...
         ' tfr sig t f fs method param p1 p2 p3 p4 SavedColormap TfrView TfrQView']);
  elseif (nargin==9),
   TfrQView=['colormap(SavedColormap); tfrqview(tfr,sig,t,method,p1,p2,p3,p4,p5)'];
   TfrView =['clf; colormap(SavedColormap); tfrview(tfr,sig,t,method,param,p1,p2,p3,p4,p5)'];
   eval(['save ',PathWorkDir,name,...
         ' tfr sig t f fs method param p1 p2 p3 p4 p5 SavedColormap TfrView TfrQView']);
  end;
  disp(' ');
  fprintf('The file is saved in the directory %s\n',PathWorkDir);
  fprintf('under the name %s\n',name);

  fprintf('If you want to find again the exact layout of this screen, do\n');
  fprintf('load %s%s; eval(TfrView);\n\n', PathWorkDir,name);
  fprintf('If you want to restart the display session under tfrqview, do\n');
  fprintf('load %s%s; eval(TfrQView);\n',PathWorkDir,name);
  CallTfrView=0;

 elseif (choice==ChoiceSaveOptions),                 % Save options

  save options fs threshold linlogtfr linlogspec levelnumb  ...
       display layout colmap iscolorbar  ...
       isgridsig isgridspec isgridtfr issig sigenveloppe isspec;
  fprintf('\n Options saved\n');
  CallTfrView=0;
 
 elseif (choice==ChoicePrint),	                     % Print the current figure

  Nmethod=length(method);
  if comp(1:2)=='PC',
   DefaultName=[method(4:Nmethod),num2str(Nsig),'.eps'];
   [name,PathWorkDir] = uiputfile(DefaultName, 'Save As');
  else
   DefaultName=[method(4:Nmethod),num2str(Nsig)];
   nameStr=[' Name of the EPS file [',DefaultName,'] : '];
   name=input(nameStr,'s'); 
   while (length(name)>8),
    disp('The name must have less than 8 characters');
    name=input(nameStr,'s'); 
   end
   if isempty(name),
    name=DefaultName;
   end
  end
  eval(['print -deps ',PathWorkDir,name]); 
  fprintf(' The file is saved in the directory %s\n',PathWorkDir);
  fprintf('under the name %s\n',name);
  CallTfrView=0;

 end;

end;

% good bye. I hope that everything happened fine.
