ALGORITMO FFT (Fast Fourier Transform) Richiami sulla DFT Sia f un segnale periodico di periodo N rappresentato dal vettore N-dimensionale di componenti f[0], f[1], ….., f[N-1] Si definisce Trasformata di Fourier Discreta (DFT) del segnale f la successione F: F[ k ] = N −1 ∑ f [ m ]e −i 2π km N m =0 ∀ k = 0 ,1, K , N − 1 Formula di inversione: f [m ] = 1 N N −1 ∑ F[ k ] e i 2π km N k =0 ∀ m = 0 ,1, K , N − 1 La DFT di un vettore può essere calcolata attraverso un prodotto matrice-vettore 2π introducendo la matrice A (di dimensione N×N) t.c. −i km N −1 N −1 m =0 m =0 Infatti: ( A ⋅ f )[k ] = ∑ A km f [m] = ∑ e 2π −i km N A km = e f [ m] = F[ k ] N F = A⋅f Il prodotto matrice-vettore Af richiede il calcolo di N prodotti per ogni componente di F. Essendo N le componenti di F, il costo computazionale totale sarà N 2 1 Algoritmo FFT L’algoritmo FFT (Fast Fourier Transform) è basato su un metodo estremamente efficiente per il calcolo della DFT, con una sostanziale riduzione del tempo di calcolo attraverso una riduzione del numero di operazioni. N = 2p Assumiamo che N sia un potenza di 2: Introducendo W = e 2π −i N N −1 la DFT può essere riscritta come F[k ] = ∑ f [m]W km m=0 La FFT si basa fondamentalmente su 2 ingredienti: • le proprietà di W • la decomposizione binaria degli indici k ed m 1) PROPRIETÀ DI W Se q=0,1,….,N-1 Infatti: W =e q 2π −i q N Wq sono le radici N-esime dell’unità (W ) = e q N −i In particolare se q è multiplo di 2 p : q = n 2 p Infatti: W =e q −i 2π q N =e −i 2π p n2 2p 2π qN / N / = e −i 2 πq = 1 ⇒ Wq = 1 = e −i 2 πn = 1 2) DECOMPOSIZIONE BINARIA DEGLI INDICI k, m m = 2 p −1 m p −1 + 2 p −2 m p − 2 + K + 2 2 m 2 + 21 m1 + m 0 m i , k i ∈ {0,1} k = 2 p −1 k p −1 + 2 p − 2 k p − 2 + K + 2 2 k 2 + 21 k1 + k 0 Il prodotto mk si potrà quindi esprimere: ( ( ) mk = m p −1 2 p −12 p −1 k p −1 + 2 p −12 p − 2 k p − 2 + L + 2 p −12 2 k 2 + 2 p −12k 1 + 2 p −1 k 0 + m p − 2 2 p − 2 2 p −1 k p −1 + 2 p − 2 2 p − 2 k p − 2 + L + 2 p − 2 2 2 k 2 + 2 p − 2 2k1 + 2 p − 2 k 0 + m1 m0 da cui: (2 2 k (2 k 1 p −1 p −1 p −1 p −1 1 p −2 +2 2 +2 p −2 M ) ) k p −2 + L + 212 2 k 2 + 212k1 + 21 k 0 + k p − 2 + L + 2 k 2 + 2k1 + k 0 2 ) ( ( ) ) mk = m p −1 2 p −2 2 p k p −1 + 2 p −3 2 p k p − 2 + L + 2 ⋅ 2 p k 2 + 2 p k1 + 2 p −1 k 0 + m p − 2 2 p −3 2 p k p −1 + 2 p − 4 2 p k p − 2 + L + 2 p k 2 + 2 p −1 k1 + 2 p − 2 k 0 + m1 m0 (2 k (2 k p p −1 p −1 +2 p −1 p −1 +2 M ) k p − 2 + L + 23 + 2 2 k1 + 21 k 0 + p −2 k p − 2 + L + 2 k 2 + 2k1 + k 0 2 ) 2 Avendo espresso il prodotto mk come somma di vari termini (che indichiamo genericamente con a, b ,c …) possiamo esprimere: W mk = W a + b + c +L = W a ⋅ W b ⋅ W c ⋅ L Dalle proprietà di W, è però noto che se q è multiplo di 2p, Wq=1 Nello sviluppo di mk, tutti gli addendi multipli di 2p non daranno alcun contributo e possono essere ignorati. Gli unici a dare contributo sono quelli sottolineati. Poniamo: c 0 = 2 p −1 k 0 m p −1 ( ) c1 = 2 p −1 k1 + 2 p −2 k 0 m p −2 M ( ) c p −1 = 2 p −1 k p −1 + 2 p − 2 k p −2 + L + 2k1 + k 0 m 0 W mk = W c0 ⋅ W c1 ⋅L W c p−1 Ritornando alla formula della DFT possiamo quindi esprimere tutto in funzione degli indici mi , ki : F[k ] = F[k , k ,L , k , k ] p −1 p−2 1 0 f [m] = f [m p −1 , m p − 2 , L , m1 , m 0 ] F[k p−1 , k p −2 , L , k1 , k 0 ] = 1 1 1 1 ∑ ∑ L ∑ ∑ f [m m 0 = 0 m1 = 0 m p−2 = 0 m p−1 = 0 p −1 , m p −2 , L , m1 , m 0 ]W c0 ⋅ W c1 ⋅ L W c p−1 Costo computazionale: ∀ componente di F è richiesto il calcolo di p sommatorie (essendo N=2p p=log2N) ognuna contenente due termini. Costo ∀ componente : 2log2N Costo totale : 2Nlog2N Implementazione della FFT L’implementazione della FFT si esegue in passi successivi attraverso l’introduzione dei cosidetti p vettori intermedi f(i). F[k p−1 , k p −2 , L , k1 , k 0 ] = 1 1 1 1 ∑ ∑ L ∑ ∑ f [m m 0 = 0 m1 = 0 m p−2 = 0 m p−1 = 0 p −1 , m p −2 , L , m1 , m 0 ]W c0 ⋅ W c1 ⋅ L W c p−1 f (1) f (2 ) M f (p −1) f (p ) Il primo vettore intermedio f(1) (calcolato a partire dal vettore f di input) diventa l’argomento della seconda sommatoria per il calcolo del secondo vettore intermedio f(2) e così via. 3 Esplicitando i vettori intermedi e facendo attenzione agli indici da cui dipendono: f (1) [k 0 , m p − 2 , L, m1 , m 0 ] = f ( 2) [k 0 , k1 ,L , m1 , m 0 ] = 1 ∑ f [m m p−1 = 0 1 (1) ∑f m p−2 = 0 M f ( p ) [k 0 , k1 ,L , k p − 2 , k p −1 ] = Esempio: p=4 1 ∑f p −1 , m p− 2 ,L , m1 , m 0 ]W c0 [k 0 , m p − 2 , L, m1 , m 0 ]W c1 ( p −1) m0 =0 [k 0 , k1 ,L , k p − 2 , m 0 ]W c p −1 ; N=2p=16 La formula della FFT diventa: F[k 3 , k 2 , k1 , k 0 ] = 1 1 1 1 ∑ ∑ ∑ ∑ f [m , m 3 m 0 = 0 m1 = 0m 2 = 0 m 3 = 0 c0 = 2 k 0m3 2 , m1 , m 0 ]W c0 ⋅ W c1 ⋅ W c 2 ⋅ W c3 3 mentre per i ci: ( ) c1 = 23 k1 + 2 2 k 0 m 2 c 2 = (2 k 2 + 2 k1 + 2k 0 )m1 c 3 = 23 k 3 + 2 2 k 2 + 2k 1 + k 0 m 0 3 2 ( I vettori intermedi: ) f (1) [k 0 , m 2 , m1 , m 0 ] = f ( 2 ) [k 0 , k1 , m1 , m 0 ] = f [k 0 , k1 , k 2 , m 0 ] = ( 3) f [k 0 , k1 , k 2 , k 3 ] = (4) 1 ∑ f [m , m 3 m3 =0 1 ∑f (1) m 2 =0 1 ∑f (2) m1 = 0 1 ∑f m 0 =0 ( 3) 2 , m1 , m 0 ]W c 0 [k 0 , m 2 , m1 , m 0 ]W c1 [k 0 , k1 , m1 , m 0 ]W c 2 [k 0 , k1 , k 2 , m 0 ]W c3 Dopo il calcolo del quarto vettore intermedio si arriva a: F[k 3 , k 2 , k1 , k 0 ] = f ( 4) [k 0 , k1 , k 2 , k 3 ] La componente [k3, k2, k1, k0] del vettore F coincide con la componente [k0, k1, k2, k3] del vettore f(4). Una volta ottenuto il quarto vettore intermedio, bisogna riordinare le sue componenti attraverso un’operazione di BIT-REVERSAL per ottenere le componenti di F nel giusto ordine. Per esempio: F[0] = F[ 0 , 0 , 0, 0 ] = f ( 4 ) [ 0 , 0, 0 , 0 ] = f ( 4 ) [0] k k 3 k 2 k1 k 0 k 0 k1 k 2 k 3 k 3 k 2 k1 k 0 k 0 k1 k 2 k 3 F[1] = F[ 0 , 0 , 0, 1 ] = f ( 4) [ 1 , 0 , 0 , 0 ] = f ( 4) [8] k 4 Schema a farfalla Calcoliamo esplicitamente alcune componenti di 2 vettori intermedi. 1) f (1) [k 0 , m 2 , m1 , m 0 ] = 1 ∑ f [m , m , m , m 3 m3 =0 f (1) [0] = f [0]W 0 + f [8]W 0 f (1) [1] = f [1]W 0 + f [9]W 0 2 f ( 4 ) [ k 0 , k1 , k 2 , k 3 ] = 0 ]W c 0 ( k 0 = m 2 = m1 = m 0 = 1; m 3 ∈ {0,1}) 1 ∑f ( 3) m 0 =0 ; c0 = 23 k 0 m 3 ( k 0 = m 2 = m1 = m 0 = 0 ; m 3 ∈ {0,1}) (k 0 = m 2 = m1 = 0 ; m 0 = 1; m 3 ∈ {0,1}) M f (1) [15] = f [7]W 0 + f [15]W 8 2) 1 [k 0 , k1 , k 2 , m 0 ]W c 3 f ( 4) [0] = f (3) [0]W 0 + f ( 3) [1]W 0 ; c 3 = ( 2 3 k 3 + 2 2 k 2 + 2k 1 + k 0 ) m 0 (k 0 = k1 = k 2 = k 3 = 0 ; m 0 ∈ {0,1}) f [1] = f [0]W + f [1]W (k 0 = k1 = k 2 = 0 ; k 3 = 1; m 0 ∈ {0,1}) M f ( 4) [15] = f (3) [14]W 0 + f ( 3) [15]W15 ( k 0 = k1 = k 2 = k 3 = 1; m 0 ∈ {0,1}) ( 4) ( 3) 0 ( 3) 8 Come si interpreta il grafico a farfalla: 1. Le sbarrette e le frecce indicano le componenti del vettore intermedio precedente che entrano in gioco per il calcolo del successivo. 2. Se la sbarretta termina senza freccia la componente del vettore intermedio precedente va moltiplicata per W0; con la freccia va moltiplicata per il Wq indicato. 3. Secondo la terminologia da noi usata: f ( 0 ) (0) = f [0] ∧ f (0) = F[0] 5 Relazione tra FT e DFT ˆ Sia f(x) una funzione nell’intervallo [-X,X] e f(ω) la sua trasformata di Fourier in [-Ω,Ω]. Campionamento della f(x) su N punti: x m = − X + mδ x m = 0,L , N − 1 Campionamento della f(ω) su N punti: ωk = −Ω + kδω k = 0, L , N − 1 Valgono le relazioni: Si può dimostrare che: πN ΩΧ = 2 π ⇒ δω = Χ N −1 f̂ (ωk ) = ( −1) k δ x ∑ (−1) m f ( x m )e −i 2X N 2Ω δω = N δx = 2π mk N m=0 Il calcolo della trasformata di Fourier (discretizzata) di una funzione può essere fatto utilizzando la DFT: 1. Campionamento della f(x) 2. Moltiplicazione per la fase (-1)m 3. Calcolo della DFT 4. N −1 f(xm) ∑ f [m]e f[m]=(-1)mf (xm) 2π −i mk N m=0 Moltiplicazione per la fase (-1)k e per il fattore di normalizzazione δx 6