function sigviz(y,t,timerange,freqrange,NSCALES,NFFT,plotindividuals)
%This function takes a given signal and analyzes and displays the Time history, DFT and Wavelet analysis
%Contact: Robert Love, University of Florida, rdlove@ufl.edu

%% Caculate necessary time information: sampling rate, full time signal, reduced time signal, and indices of reduced time signal
%Note: Isolate signal with limited time range from y-this is signal that will analyze with FFT and Wavelet  
song.time=t;                                                                %Full time signal
song.Fs=1/abs(t(2)-t(1));                                                   %Sampling Rate, Hz
timeloop = 0:(1/song.Fs):length(y)/song.Fs-(1/song.Fs);                     %Artificial full time vector for loop
count=1; for i=1:length(timeloop); if timeloop(i)>timerange(1) && timeloop(i)<timerange(2); song.timered(count)=timeloop(i); song.timeinterval(count)=i; count=count+1; end; end;

%% Obtain signal information
song.signal=y;                                                     %Full Input Signal
song.signalred=y(min(song.timeinterval):max(song.timeinterval));   %Reduced Input Signal

%% Calculate DFT of Desired Signal (all frequencies included, but not plotted unless included in freqrange)
L=length(song.signalred);                              %Measure of signal length 
song.dftsignal0=fft(song.signalred,NFFT)/L;            %Magnitude for the DFT spectrum
song.dftsignal=2*abs(song.dftsignal0(1:NFFT/2));    %Obtain single sided DFT spectrum
song.dftfreq = song.Fs/2*linspace(0,1,NFFT/2);      %Obtains the frequencies


%% Calculate Spectrogram of Signal
[S,song.specfreq,song.spectime,song.specmag]=spectrogram(song.signalred,round(length(song.signalred)/10),round(length(song.signalred)/10)-2,NFFT,song.Fs);% 30 and 31 form arbitrary window



%% Calc freq components for wavelet analysis
for wi=1:NSCALES
    fullfreqwav(wi,1)=0.796*song.Fs/wi;          %Full frequency vector for wavelet transform
end
song.freq=fullfreqwav;
count=1; for i=1:length(fullfreqwav); if fullfreqwav(i)>freqrange(1) && fullfreqwav(i)<freqrange(2); song.freqred(count)=fullfreqwav(i); song.freqinterval(count)=i; count=count+1; end; end;

%% Calculate Wavelet of Input Signal, (all frequencies included, but not plotted), then isolate only desired frequency range
song.waveletsignalred=cwt(song.signalred,1:NSCALES,'morl');  %Full Signal wavelet analysis, Morlet Wavelet


%% Plot Inidividual Plots
if plotindividuals==1;
%Time History
figure
plot(song.timered,song.signalred); xlabel('Time, sec','fontsize',15);  ylabel('Magnitude','fontsize',15); axis([timerange(1) timerange(2) min(song.signalred) max(song.signalred)]);
set(gcf,'position',[5,14,1275,675],'PaperPositionMode','auto'); %[distance from left, distance from bottom, width, height]
title1='timehistory.eps';
print ('-depsc2',char(title1));

%DFT
figure
semilogy(song.dftfreq,2*abs(song.dftsignal(1:NFFT/2)),'b'); xlabel('Frequency, Hz','fontsize',15);  ylabel('Magnitude','fontsize',15); axis([freqrange(1) freqrange(2) 10^-2 max(2*abs(song.dftsignal(1:NFFT/2)))]);
set(gcf,'position',[5,14,1275,675],'PaperPositionMode','auto'); %[distance from left, distance from bottom, width, height]
title2='fftpic.eps';
print ('-depsc2',char(title2));

%Spectrogram
figure
surf(song.spectime,song.specfreq,10*log10(abs(song.specmag))); xlabel('Time, sec','fontsize',15); ylabel('Frequency, Hz','fontsize',15); shading interp; colormap hsv; axis([timerange(1) timerange(2) freqrange(1) freqrange(2) min(min(10*log10(abs(song.specmag)))) max(max(10*log10(abs(song.specmag))))]); view(2); 
set(gcf,'position',[5,14,1275,675],'PaperPositionMode','auto'); %[distance from left, distance from bottom, width, height]
title3='spectrogram';
print ('-depsc2',char(title3));

%Wavelet Plots (viewed in 2D)
%wavelet_frequency_vs_time
figure
surf(song.timered,song.freq,song.waveletsignalred); xlabel('Time, sec','fontsize',15); ylabel('Frequency, Hz','fontsize',15); zlabel('Magnitude','fontsize',15); shading interp; colormap hsv;  axis([timerange(1) timerange(2) freqrange(1) freqrange(2) min(min(song.waveletsignalred)) max(max(song.waveletsignalred))]); view(2); 
set(gcf,'position',[5,14,1275,675],'PaperPositionMode','auto'); %[distance from left, distance from bottom, width, height]
title4='wavelet_frequency_vs_time';
print ('-depsc2',char(title4));

%wavelet_magnitude_vs_time
figure
surf(song.timered,song.freq,song.waveletsignalred); xlabel('Time, sec','fontsize',15); ylabel('Frequency, Hz','fontsize',15); zlabel('Magnitude','fontsize',15); shading interp; colormap hsv;  axis([timerange(1) timerange(2) freqrange(1) freqrange(2) min(min(song.waveletsignalred)) max(max(song.waveletsignalred))]); view(0,0);
set(gcf,'position',[5,14,1275,675],'PaperPositionMode','auto'); %[distance from left, distance from bottom, width, height]
title5='wavelet_magnitude_vs_time';
print ('-depsc2',char(title5));

%wavelet_magnitude_vs_frequency
figure
surf(song.timered,song.freq,song.waveletsignalred); xlabel('Time, sec','fontsize',15); ylabel('Frequency, Hz','fontsize',15); zlabel('Magnitude','fontsize',15); shading interp; colormap hsv;  axis([timerange(1) timerange(2) freqrange(1) freqrange(2) min(min(song.waveletsignalred)) max(max(song.waveletsignalred))]); view(90,0);
set(gcf,'position',[5,14,1275,675],'PaperPositionMode','auto'); %[distance from left, distance from bottom, width, height]
title6='wavelet_magnitude_vs_frequency';
print ('-depsc2',char(title6));
end

%% Plot everything together for one plot
figure
timehistory=subplot(2,3,1); plot(song.timered,song.signalred); xlabel('Time, sec','fontsize',15);  ylabel('Magnitude','fontsize',15); axis([timerange(1) timerange(2) min(song.signalred) max(song.signalred)]);
fftpic=subplot(2,3,2); semilogy(song.dftfreq,2*abs(song.dftsignal(1:NFFT/2)),'b'); xlabel('Frequency, Hz','fontsize',15);  ylabel('Magnitude','fontsize',15); axis([freqrange(1) freqrange(2) 10^-2 max(2*abs(song.dftsignal(1:NFFT/2)))]); 
specpic=subplot(2,3,3); surf(song.spectime,song.specfreq,10*log10(abs(song.specmag))); xlabel('Time, sec','fontsize',15); ylabel('Frequency, Hz','fontsize',15); shading interp; colormap hsv; axis([timerange(1) timerange(2) freqrange(1) freqrange(2) min(min(10*log10(abs(song.specmag)))) max(max(10*log10(abs(song.specmag))))]); view(2);
wavelet_frequency_vs_time=subplot(2,3,6); surf(song.timered,song.freq,song.waveletsignalred); xlabel('Time, sec','fontsize',15); ylabel('Frequency, Hz','fontsize',15); zlabel('Magnitude','fontsize',15); shading interp; colormap hsv;  axis([timerange(1) timerange(2) freqrange(1) freqrange(2) min(min(song.waveletsignalred)) max(max(song.waveletsignalred))]); view(2); 
wavelet_magnitude_vs_time=subplot(2,3,4); surf(song.timered,song.freq,song.waveletsignalred); xlabel('Time, sec','fontsize',15); ylabel('Frequency, Hz','fontsize',15); zlabel('Magnitude','fontsize',15); shading interp; colormap hsv;  axis([timerange(1) timerange(2) freqrange(1) freqrange(2) min(min(song.waveletsignalred)) max(max(song.waveletsignalred))]); view(0,0);
wavelet_magnitude_vs_frequency=subplot(2,3,5); surf(song.timered,song.freq,song.waveletsignalred); xlabel('Time, sec','fontsize',15); ylabel('Frequency, Hz','fontsize',15); zlabel('Magnitude','fontsize',15); shading interp; colormap hsv;  axis([timerange(1) timerange(2) freqrange(1) freqrange(2) min(min(song.waveletsignalred)) max(max(song.waveletsignalred))]); view(90,0);
set(gcf,'position',[5,14,1275,675],'PaperPositionMode','auto'); %[distance from left, distance from bottom, width, height]
title7='overview';
print ('-depsc2',char(title7));

%% Save unified variable (contains inputs and outputs)   
%Consolidate inputs into saved variable:
song.timerange=timerange;
song.freqrange=freqrange;
song.NSCALES=NSCALES;
song.NFFT=NFFT;
save ('Overall','song'); %all variables of interest are stored here
end


