% Programma per la visualizzazione grafica di un segnale cosinusoidale
%
%  x(t) = A*cos( 2*pi*fo*t + Q )
%
% finestrato in un intervallo temporale  di durata pari ad un multiplo
% del suo periodo.
%
% Il programma chiede in ingresso i parametri A , fo , e Q 
% Inoltre chiede il Periodo di campionamento Tc e la Risoluzione Spettrale DeltaF
% e rappresenta graficamente:
%
%  1) Andamento temporale e Campioni nel tempo ( massimo 3 periodi del coseno )
%  2) Modulo e Fase dello Spettro stimato campionando lo Spettro tramite DFT
%
% --------------------------------------------------------------------------------


clear all ;

% -------------  Inserimento Parametri --------------------------------------

A      = input( 'Inserire Ampiezza del Coseno:  ');
fo     = input( 'Inserire Frequenza del Coseno  (in Hz):  ');
ThetaG = input( 'Inserire Fase del Coseno (in Gradi):  ');
Fc     = input( 'Inserire Frequenza di Campionamento (in Hz):  ');
NumT   = input( 'Inserire il Numero di Periodi su cui osservare il Coseno: ');
% -----------------------------------------------------------------------------


T      = 1/fo        ; % Periodo del Coseno
DeltaT = NumT * T    ; % Intervallo di Osservazione pari a 'NumT' Periodi
Tc     = 1/Fc        ; % Intervallo di Campionamento
N      = DeltaT / Tc ; % Numero di Campioni del Coseno

Theta  = ThetaG * pi/180 ; % Fase in Radianti


% ---------------    Inserimento Risoluzione Spettrale

DeltaF =  inf ; % Inizializzazione Variabile per Controllo 'while'
while DeltaF > (Fc/N) 
  textInput = ['Inserire Risoluzione Spettrale \DeltaF [ =< ', num2str(Fc/N) , ' Hz]  '];
  DeltaF    = input( textInput );
end
%----------------------------------------------------------------------------------------



t      = [0:N-1] * Tc ;               % Vettore Istanti di Campionamento
xc     = A*cos( 2*pi*fo*t + Theta);   % Vettore del Coseno Campionato

tplot  = [0:10*(N-1)] * Tc/10 ;       % Vettore Istanti di Sovra-Campionamento per il Grafico
xplot  = A*cos(2*pi*fo*tplot + Theta);% Vettore del Coseno per il Grafico ("Tempo Continuo")



Nfft   = max( N , fix(Fc/DeltaF) ) ; % Numero di Campioni su cui si calcola lo Spettro
                                     % Nfft >= Numero Campioni nel tempo

DeltaF = Fc / Nfft ;  % Risoluzione Spettrale 
                      % (Intervallo di Campionamento dell'asse delle Frequenze)


Xf     = fft( xc , Nfft );         % Spettro Campionato del Segnale
f      = [ 0 : Nfft-1 ] * DeltaF ; % Asse delle Frequenze Campionato


% -------------- Grafico nel tempo del Coseno Campionato
figure ;
subplot(211); % Ripartizione del Grafico su un'unica figura

plot( tplot , xplot ,'-b'); hold on ; stem( t , xc ,'k' ); grid on ; hold off ;
axis([ 0, min( 3*T , DeltaT ) ,-1.5*A , 1.5*A ]); % Visulaizzazione massima = 3 Periodi del Coseno

xlabel('Tempo  (sec)'); ylabel( 'x(t)' );
TitleText = ['Andamento nel Tempo e Spettro di un Coseno di frequenza fo=', num2str( fo ) , ' Hz di Durata  \DeltaT= ' , num2str(DeltaT) ' sec.'  ];
title( TitleText);



Index_fo  = round( fo/DeltaF ) + 1; % Indice sul vettore delle frequenze 'f' che
                                    % corrisponde a 'fo' dove è significativa la Fase del Coseno
                                   
Index_fo2 = round( (Fc-fo)/DeltaF ) +1 ; % Infice di 'f' corrispond a Fc-fo                                 

Ifo = [ Index_fo , Index_fo2 ];


% -------------- Grafico del Modulo dello Spettro 

subplot( 223 ); % Ripartizione dei Grafici su un'unica Finestra 

plot( f , abs(Xf)/N , 'r' ); grid on ; % Divido per N = DeltaT/Tc per compensare
                                       % Il campionamento (Tc) ed il Finestramento (DeltaT)
                                       
% Evidenzio il valore dello spettro alla frequenza 'fo' del Coseno e a 'Fc-fo'
                              
hold on ;  stem( f(Ifo) , abs( Xf(Ifo)/N ) , 'k' ); hold off ;  
                                      
                                       
ylabel( '| X(f) |') ; xlabel( 'Frequenza (Hz)'); axis([0,Fc,0,0.6*A]);

% -------------------------------------------------------------------------------------------


% -------------- Grafico della Fase dello Spettro



subplot( 224 ); % Ripartizione dei Grafici su un'unica Finestra


plot( f , angle(Xf)*180/pi ,'r'); grid on ; % Fase Disegnata in Gradi

hold on ; stem( f(Ifo) , angle( Xf(Ifo) )*180/pi , 'k' ); hold off ; 

ylabel( 'Fase[ X(f) ]   (Gradi)') ; xlabel( 'Frequenza (Hz)'); axis([0,Fc, -180 , 180 ]);

% -------------------------------------------------------------------------------------------
