22.01.2014 Views

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

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!