caricato da Utente7076

05 - FFT (Fast Fourier Transform) - Algoritmo

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