Trasformata discreta di Fourier di una sequenza finita : algoritmi FFT
Trasformata discreta di Fourier di una sequenza finita : algoritmi FFT
Trasformata discreta di Fourier di una sequenza finita : algoritmi FFT
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
<strong>di</strong><strong>una</strong><strong>sequenza</strong><strong>finita</strong>: <strong>algoritmi</strong><strong>FFT</strong><br />
La TDF <strong>di</strong> <strong>una</strong> <strong>sequenza</strong> <strong>finita</strong> può essere calcolata utilizzando<br />
<strong>algoritmi</strong>, computazionalmente efficienti, quali gli <strong>algoritmi</strong> Fast<br />
<strong>Fourier</strong> Transform (<strong>FFT</strong>).<br />
L’efficienza degli <strong>algoritmi</strong> <strong>FFT</strong> consiste nel numero <strong>di</strong><br />
operazioni necessarie per calcolare la TDF <strong>di</strong> <strong>una</strong> <strong>sequenza</strong><br />
<strong>finita</strong> <strong>di</strong> N campioni:<br />
-il calcolo della TDF, a partire dalla definizione, implica l’utilizzo<br />
<strong>di</strong> 8N 2 -2N operazioni<br />
-tramite <strong>algoritmi</strong> <strong>FFT</strong> si arriva a 8log 2 (N)+6N operazioni<br />
Tale velocità <strong>di</strong> calcolo giustifica l’utilizzo <strong>di</strong> <strong>algoritmi</strong> <strong>FFT</strong> per il<br />
calcolo della convoluzione tra due sequenze.
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab<br />
Vedremo un’esercitazione relativa al calcolo della trasformata<br />
<strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong> <strong>di</strong> alcune sequenze finite.<br />
Il comando per calcolare la trasformata <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong> in<br />
ambiente Matlab® prende il nome <strong>di</strong> fft(.)<br />
Se la <strong>sequenza</strong> <strong>finita</strong> viene memorizzata in un vettore x <strong>di</strong> N<br />
elementi, il comando y=fft(x) fornisce nel vettore y <strong>di</strong> N<br />
elementi, i coefficienti della TDF, previa <strong>di</strong>visione per il numero<br />
<strong>di</strong> campioni N<br />
L’algoritmo dal punto <strong>di</strong> vista computazionale è particolarmente<br />
efficiente se N è uguale ad <strong>una</strong> potenza <strong>di</strong> 2
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab<br />
Il risultato <strong>di</strong>fferisce ne caso in cui il numero N sia pari o <strong>di</strong>spari.<br />
N pari : la prima posizione del vettore <strong>di</strong> uscita y contiene il<br />
coefficiente X[0], che rappresenta la componente continua della<br />
trasformata, alla posizione N il vettore contiene il coefficiente<br />
X[N-1]<br />
Consideriamo un segnale sinusoidale definito su un intervallo<br />
temporale tra -10 e 10 secon<strong>di</strong>, con T=1 sec<br />
x<br />
=<br />
sin( 2<br />
∗<br />
pi<br />
∗<br />
f<br />
0<br />
∗t)<br />
con t=[-10:1:10] e f0=0.2 Hz
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab<br />
La TDF calcolata su N=21 punti viene mostrata in modulo e fase<br />
nelle figure seguenti.<br />
A destra viene visualizzato l’intervallo tra 0 e (N-1)/NT<br />
A sinistra viene eseguito l’operazione <strong>di</strong> fftshift che utilizza<br />
l’intervallo frequenziale -(N-1)/2NT:(N-1)/2NT<br />
Si deve notare che la risoluzione frequenziale scelta non<br />
permette <strong>di</strong> visualizzare il valore 0.2 Hz
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab<br />
La stessa trasformata calcolata su 20 punti dando come opzione<br />
al comando fft(.) il numero N=20: Y=fft(x,20)<br />
Essendo x lungo 21 elementi, la fft viene calcolata sul segnale<br />
troncato.<br />
In questo caso la risoluzione frequenziale è tale da poter<br />
visualizzare 0.2 Hz.<br />
L’operazione <strong>di</strong> fftshift (figura <strong>di</strong> destra) porta, come primo<br />
elemento del vettore, la frequenza pari a N/(2NT), detta<br />
frequenza <strong>di</strong> Nyquist, che ritroveremo quin<strong>di</strong> al valore f=-0.5 Hz
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab:<br />
analisi TF <strong>sequenza</strong><br />
Ripren<strong>di</strong>amo la relazione <strong>di</strong> campionamento in frequenza.<br />
X<br />
1<br />
( k) = X<br />
⎜<br />
N ⎟ 0 ⎝ N0T<br />
⎠<br />
Da questa relazione si evince che è possibile utilizzare la fft per<br />
stimare la <strong>Trasformata</strong> <strong>di</strong> <strong>Fourier</strong> X ( f ) della <strong>sequenza</strong> aperio<strong>di</strong>ca<br />
x[n]:<br />
X ⎛ k ⎞<br />
⎜<br />
N0T<br />
⎟ =<br />
⎝ ⎠<br />
⎛<br />
N<br />
0<br />
k<br />
⎞<br />
X ( k)<br />
Tramite la fft si possono calcolare gli X(k) e dalla questi i valori<br />
della X ( f ) .<br />
Vedremo un esempio <strong>di</strong> come fare questa stima e migliorarla con la<br />
Tecnica dello zero pad<strong>di</strong>ng: in questo caso aggiungere zeri, vuol <strong>di</strong>re<br />
aumentare N 0 e quin<strong>di</strong> aumentare la risoluzione frequenziale <strong>di</strong> X f<br />
( )
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab:<br />
analisi TF <strong>sequenza</strong><br />
Come esempio consideriamo la <strong>Trasformata</strong> <strong>di</strong> <strong>Fourier</strong> <strong>di</strong> un<br />
impulso rettangolare <strong>di</strong>screto<br />
La <strong>Trasformata</strong> <strong>di</strong> <strong>Fourier</strong> vale X<br />
( f )<br />
La figura seguente ne rappresenta il modulo<br />
n<br />
=<br />
sin<br />
sin<br />
( 5 fT )<br />
( πfT<br />
)<br />
π − j4πfT<br />
e
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab:<br />
analisi TF <strong>sequenza</strong><br />
Noi partiremo da un vettore contenente gli elementi non nulli della<br />
<strong>sequenza</strong> <strong>di</strong> partenza: quin<strong>di</strong> <strong>di</strong> 5 elementi.<br />
Si esegue la fft(.) sul vettore perio<strong>di</strong>cizzato, rispettivamente con N=5<br />
con N=10 e N=20. Nel caso <strong>di</strong> N=10 e N=20, è necessario aggiungere in<br />
coda al vettore <strong>di</strong> partenza rispettivamente 5 e 15 zeri. Questo può<br />
essere ottenuto sempre come seconda opzione del comando fft:<br />
y=fft(x,N)
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab:<br />
analisi TF <strong>sequenza</strong><br />
Il grafico del modulo del risultato della fft(.) è sovrapposto a quello della<br />
<strong>Trasformata</strong> <strong>di</strong> <strong>Fourier</strong> della <strong>sequenza</strong>. Si fa notare che se non<br />
effettuiamo la normalizzazione per N l’algoritmo fft, nella versione <strong>di</strong><br />
Matlab, fornisce già il valore N 0 X( k )<br />
N=5 N=10 N=20
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab: durata delle<br />
osservazioni<br />
Se ipotizziamo che la nostra <strong>sequenza</strong> <strong>finita</strong> derivi dal campionamento<br />
<strong>di</strong> un segnale tempo continuo, può essere interessante vedere cosa<br />
succede se aumento il mio intervallo <strong>di</strong> osservazione. Consideriamo<br />
sempre il segnale x = sin( 2 ∗ pi ∗ f 0 ∗t)<br />
con t=[-32:1:31] e f0=0.2 Hz.<br />
Abbiamo scelto la finestra temporale in modo da avere ancora 64<br />
campioni come nel caso del seno precedentemente stu<strong>di</strong>ato, così come<br />
lo stesso è l’intervallo <strong>di</strong> campionamento: questo implica che lo spettro<br />
è rappresentato per gli stessi valori della frequenza. Quello che<br />
cambia è la risoluzione frequenziale. Ve<strong>di</strong>amo cosa cambia nello<br />
spettro del segnale.
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab: durata delle<br />
osservazioni<br />
Ve<strong>di</strong>amo che in corrispondenza <strong>di</strong> f=2 Hz e f=-2Hz sono presenti due<br />
picchi pronunciati, mentre nel caso precedente sono più smussati e<br />
presentano delle ondulazioni.<br />
Questo fenomeno è l’effetto del troncamento del segnale:<br />
un troncamento più pesante e quin<strong>di</strong> l’osservazione <strong>di</strong> un numero<br />
inferiore <strong>di</strong> campioni si può schematizzare come il prodotto tra la<br />
<strong>sequenza</strong>, supposta <strong>di</strong> durata in<strong>finita</strong> e <strong>una</strong> finestra rettangolare<br />
w[n]. Dal teorema del prodotto segue che lo spettro finale è dato<br />
dalla convoluzione tra i due spettri.<br />
La <strong>di</strong>fferenza tra i due casi precedenti si può capire se ricor<strong>di</strong>amo<br />
che lo spettro <strong>di</strong> w[n] si concentra sempre più nello zero<br />
all’aumentare della durata della finestra, mentre presenta un lobo<br />
principale e i lobi laterali sempre più ampi al <strong>di</strong>minuire <strong>di</strong> T.
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab<br />
Il prossimo esempio mostra la TDF <strong>di</strong> un impulso rettangolare e<br />
della sua versione ritardata.<br />
Le successioni e gli spettri sono <strong>di</strong>segnati a tratto continuo:<br />
bisogna comunque ricordare sempre che sono a valori <strong>di</strong>screti.<br />
Si deve evidenziare l’effetto sulla fase della trasformata del<br />
ritardo temporale. Infatti dal teorema del ritardo si ha:<br />
x<br />
TDF<br />
2πkn<br />
0<br />
− j<br />
[] n ↔ X ( k ) ⇒ x[ n − n ] ↔ X ( k ) e<br />
N<br />
con somma sulla fase <strong>di</strong> un termine che varia linearmente con la<br />
frequenza.<br />
0<br />
TDF
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab<br />
Si deve notare che, nella figura <strong>di</strong> destra, le oscillazioni sulla<br />
fase presente nel grafico <strong>di</strong> fase dell’impulso non ritardato non<br />
sono apprezzabili a causa della scala scelta.<br />
Il grafico <strong>di</strong> fase è stato realizzato utilizzando unwrap(.) che<br />
permette la visualizzazione della fase non limitandosi<br />
all’intervallo [ − π ,π ]
<strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Tramite <strong>FFT</strong> in ambiente Matlab<br />
Il prossimo esempio mostra le TDF <strong>di</strong> un onda quadra e <strong>di</strong> un<br />
triangolare.<br />
Dallo spettro <strong>di</strong> ampiezza si ha la conferma che il modulo dei<br />
coefficienti <strong>di</strong> <strong>Fourier</strong> X(k) decresce secondo come 1/k per<br />
l’onda quadra e come 1/k 2 per l’onda triangolare
Calcolo della convoluzione tra due sequenze<br />
utilizzando la <strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
La convoluzione tra due sequenze finite x[n]e h[n] può essere<br />
calcolata tramite la TDF utilizzando l’efficienza degli <strong>algoritmi</strong> fft.<br />
Infatti detta<br />
y<br />
+∞<br />
∑<br />
=−∞<br />
[] n = x[][ k h n − k]<br />
k<br />
la convoluzione lineare tra le<br />
due sequenze e date P e Q le lunghezze rispettivamente <strong>di</strong> x[n]e y[n],<br />
si verifica che la convoluzione lineare coincide con un periodo della<br />
convoluzione circolare delle due sequenze, perio<strong>di</strong>cizzate <strong>di</strong> N=P+Q-1.<br />
y<br />
1 N ∑ −<br />
k = 0<br />
1<br />
[] n = x[][ k h n − k]<br />
N
Calcolo della convoluzione tra due sequenze<br />
utilizzando la <strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
I passi da seguire sono:<br />
-calcolare le TDF, tramite fft, delle due sequenze perio<strong>di</strong>cizzate<br />
-moltiplicare le due TDF e antitrasformare il risultato<br />
La perio<strong>di</strong>cizzazione della <strong>sequenza</strong> è implicita quando si utilizza la<br />
TDF:<br />
il periodo corretto viene in<strong>di</strong>cato con l’operazione dello zero pad<strong>di</strong>ng<br />
in modo da avere, per ogni <strong>sequenza</strong>, <strong>una</strong> TDF calcolata su N=P+Q-1<br />
campioni
Calcolo della convoluzione tra due sequenze<br />
utilizzando la <strong>Trasformata</strong> <strong><strong>di</strong>screta</strong> <strong>di</strong> <strong>Fourier</strong><br />
Nell’esempio viene mostrata la convoluzione<br />
lineare tra due rect.<br />
Nella figure in basso a destra il risultato della<br />
convoluzione circolare tramite fft senza zero<br />
pad<strong>di</strong>ng, nella figura <strong>di</strong> sinistra con zero<br />
pad<strong>di</strong>ng.