FFT in Matlab
FFT in Matlab
3° Laboratorio
MATLAB: visualizzazione
Più grafici possono coesistere in un’unica finestra grafica di MATLAB, che può essere suddivisa in più
aree grafiche. Il comando che permette di inserire più grafici nella stessa finestra è:
subplot(ny,nx,na)
dove nx e ny rappresentano il numero di divisioni verticali e orizzontali della finestra, e na
rappresenta l’indice del grafico attivo tra i (nx*ny) grafici possibili. I grafici sono ordinati per righe. Ad
esempio per dividere la finestra attiva in 4 “quadranti” e selezionare il grafico in basso a sinistra, si
scriverà:
subplot(2,2,3)
Talvolta può essere molto utile sovraimporre un grafico ad un altro grafico già esistente nella finestra
attiva. Per evitare che quest’ultimo sia cancellato si deve utilizzare il comando:
hold on (hold off per disattivare)
» N=length(x);
» X=fftshift(fft(x))*dt;
1
» df=1/(N*dt);
» f=[-N/2+[0:N-1]]*df; % se N è pari
» f=[-(N-1)/2+[0:N-1]]*df; % se N è dispari
Per visualizzare il risultato è importante ricordare che la trasformata X sarà sempre un vettore
complesso. Quindi si potranno mostrare modulo e fase:
» subplot(2,1,1), plot(f,abs(X));
» subplot(2,1,2), plot(f,angle(X));
oppure parte reale e parte immaginaria:
» subplot(2,1,1), plot(f,real(X));
» subplot(2,1,2), plot(f,imag(X));
: Esercizio
Si generi un segnale x(t), rettangolo di durata 0.1 sec, e ampiezza A=3. L’intervallo di discretizzazione
è dt=1 ms. L’asse temporale su cui è definito il segnale è t=[0:dt:4]. Si calcoli in MATLAB la
trasformata di Fourier del segnale x(t), e lo si confronti con il risultato teorico noto.
• Cosa si modifica modificando l’asse temporale come t=[0:dt:2]?
• Cosa si modifica diminuendo il passo di discretizzazione dt (ad esempio si provi con dt=5 ms,
10 ms). Perché la trasformata di Fourier calcolata può differire da quella teorica?
dt=.001;
A =3;
t =[0:dt:4];
R =A*rect(t,0,.1-dt);
Rf=fftshift(fft(R))*dt;
N =length(t);
df=1/(N*dt);
f=[-(N-1)/2+[0:N-1]]*df; % N è dispari
RfT=A*.1*sin(pi*f*.1)./(pi*f*.1);
RfT((length(f)+1)/2)=A*.1; % MATLAB non risolve limiti notevoli!!
figure,
subplot(2,1,1),
plot(f,abs(RfT),'-b'),
hold on,
plot(f,abs(Rf),'.r'),
subplot(2,1,2),
plot(f,angle(RfT),'-b'),
hold on,
plot(f,angle(Rf),'.r'),
xlabel(‘Frequenza [Hz]’);
2
: Esercizio
Si generi un segnale x(t), triangolo di durata 0.2 sec, e ampiezza A=1. L’intervallo di discretizzazione è
dt=1 ms. L’asse temporale su cui è definito il segnale è t=[0:dt:4]. Si calcoli in MATLAB la
trasformata di Fourier del segnale x(t), e lo si confronti con il risultato teorico noto. A partire da questo
esempio si possono verificare alcune proprietà della trasformata di Fourier.
Campionamento ed equivocazione
L’effetto della discretizzazione di un segnale continuo è replicare la risposta in frequenza del segnale a
passo fc=1/dt. In prima approssimazione quindi le uniche frequenze rappresentabili sono limitate
all’intervallo ±1/(2*dt). Frequenze più elevate vengono interpretate come altre frequenze nell’intervallo
definito in precedenza (equivocazione).
Date due sinusoidi campionate con freq. di campionamento fc=20 Hz, la prima a frequenza f1 minore di
fc/2 (non equivocata) e l’altra a frequenza f2=f1+fc, si può verificare come i campioni delle due
sinusoidi si sovrappongono perfettamente (equivocazione).
figure
subplot(2,1,1),
plot(t,sin(2*pi*f1*t),'*',t,sin(2*pi*f2*t),'o')
xlabel('tempo')
subplot(2,1,2),
3
t1=[0:dt/10:2];
plot(t1,sin(2*pi*f1*t1),t1,sin(2*pi*f2*t1),t, sin(2*pi*f1*t),'*')
xlabel('tempo')