Il 0% ha trovato utile questo documento (0 voti)
3 visualizzazioni

FFT in Matlab

FFT

Caricato da

rubiakleya
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
3 visualizzazioni

FFT in Matlab

FFT

Caricato da

rubiakleya
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 4

FONDAMENTI DI SEGNALI E TRASMISSIONE

3° Laboratorio

Paolo Mazzucchelli [email protected]

 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)

 Trasformata di Fourier di segnali continui in MATLAB


Ad un segnale x(t) funzione del tempo, si può associare una funzione X(f), funzione della frequenza che
serve a descrivere x(t) come combinazione lineare di esponenziali complessi. L’operatore che calcola
X(f) a partire da x(t) si chiama Trasformata di Fourier (TDF). Esiste ovviamente l’operatore
Trasformata di Fourier Inversa (TDFI) che da X(f) permette di calcolare x(t).
Anche il dominio delle frequenze continue può essere descritto in MATLAB solo per un insieme
discreto di valori (sequenze). Quindi cercheremo la sequenza Xf che approssima la funzione X(f) per un
vettore di punti equispaziati in frequenza con passo di discretizzazione df.
La funzione MATLAB che calcola la sequenza che approssima la trasformata di Fourier di un segnale
(anch’esso ovviamente memorizzato come sequenza!) è:
X=fft(x)*dt;
Il termine moltiplicativo dt permette di avere ampiezze congruenti con la definizione di trasformata di
Fourier di segnali continui. La lunghezza del vettore X, trasformata di Fourier, è uguale alla lunghezza
del segnale nei tempi (sequenza x). L’operazione di trasformazione di Fourier inversa è invece:
x=ifft(X)/dt;
I segnali discreti (sequenze nel tempo con passo di discretizzazione dt) che possono essere
rappresentate in MATLAB, hanno trasformate periodiche in frequenza, di periodo 1/dt. La sequenza X,
output della funzione fft() rappresenta l’osservazione su un solo periodo della trasformata di
Fourier. Le frequenze su cui è definita la sequenza X vanno quindi da –1/(2*dt) a +1/(2*dt). Il primo
estremo è incluso solo se la lunghezza del vettore x è un numero pari, mentre entrambi gli estremi sono
esclusi per lunghezze dispari.
Le convenzioni adottate da MATLAB sono che il primo campione di x, x(1), è quello che corrisponde
a t=0, ed il primo campione di X, X(1) è quello che corrisponde a f=0. Esiste però la funzione
fftshift() che permette di riordinare le frequenze.
Quindi per poter calcolare la trasformata di Fourier del segnale x(t) (approssimato dalla sequenza x):

» 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).

fc=20; % freq. campionamento


dt=1/fc; % intervallo campionamento
t=[0:dt:2]; % asse campione tempi
f1=2; % freq. non aliasata
f2=f1+fc; % freq. aliasata

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')

Potrebbero piacerti anche