L'FFT è un algoritmo utilizzato per il calcolo della DFT:
La premessa per l'utilizzo della fft è avere sequenze che hanno per durata
una potenza di 2.
Il principio fondamentale che sta sulla base dell'algoritmo di Cooley e Turkey
consiste nello spezzare la computazione di una fft in più fft su sequenze di
durata inferiore.
Infatti, il calcolo di tutti i valori della sequenza X(k) richiede N^2 prodotti complessi e N(N-1) somme
complesse, ma se spezziamo il calcolo in sequenze dimezzate avremo 2(N/2)^2 e
2(N/2)(N/2-1) somme complesse.
La scomposizione applicata in maniera ricorsiva ci porta al calcolo di N/2 fft
di sequenze a durata 2.
D'ora in poi useremo questa relazione:
Ci son due metodi applicabili:
Vedremo che nella decimazione nel tempo le sequenze vengono separate in sequenze a indici pari e dispari 2n e 2n+1 nel dominio del tempo, e saranno sequente adiacenti nel dominio della frequenza n e n+1, mentre nella decimazione nella frequenza avremo il contrario.
In entrambi i casi la complessità computazionale è O(N logN).
Separiamo x(n) in due sequenze x(2n) e x(2n+1), ovvero la prima ha gli elementi che nella sequenza originale avevano gli indici pari, mentre la seconda ha quelli con gli indici dispari.
La DFT X(k) è la somma di 2 DTF di lunghezza N/2:
con k nell'intervallo [0, N/2 - 1].
Com'è possibile notare dal disegno, la sequenza originale ha gli indici permutati, dunque come troviamo l'indice corrispondente nella trasformazione? Basta invertire i bit del nostro indice!
Per invertire si intende leggere al contrario, e non prendere la negazione del bit.
0 = 000 -- 000 = 0
1 = 001 -- 100 = 4
2 = 010 -- 010 = 2
3 = 011 -- 110 = 6
4 = 100 -- 001 = 1
5 = 101 -- 101 = 5
6 = 110 -- 011 = 3
7 = 111 -- 111 = 7
Questa tecnica prende il nome di bit-reversal.
Questa volta spezziamo la sequenza x(n) in due sequenze adiacenti:
x1(n) = x(n) for n in [0, N/2-1]
x2(n) = x(n + N/2) for n in [0, N/2-1]
Per queste sequenze valgono le sequenti relazioni:
Le due espressioni sopra sono le DTF su N/2 campioni delle sequenze f(n) e g(n) definite come:
Abbiamo infine le seguenti relazioni:
con n nell'intervallo [0, N/2 - 1].
Le trasformate DFT delle sequenze f(n) e g(n) ci danno dunque i termini pari e dispari, relativamente. Il procedimento viene iterato fino ad operare con sequenze di 2 campioni.
Come potete vedere nel disegno, le moltiplicazioni con le W vengono fatte dopo le somme (o differenze quando abbiamo -1).
Inoltre possiamo notare che mentre nella decimazione nel tempo partivamo con
indici permutati, qui partiamo con indici ordinati e finiamo con indici
permutati sempre con la stessa regola del bit-reversal.
Se la nostra sequenza è reale, possiamo sfruttare la proprietà di simmetria per ridurre il numero di operazioni necessarie.
Costruiamo la sequenza z(n):
z(0) = x(0) + ix(1)
z(1) = x(2) + ix(3)
...
x(N/2-1) = x(N-2) + ix(N-1)
Per la nostra sequenza vale la seguente relazione:
Combiniamo le due sequenze reali x(n) e y(n) nella sequenza:
z(n) = x(n) + iy(n)
Avremo la seguente relazione:
L'algoritmo per calcolare la ifft è lo stesso utilizzato per il calcolo della
fft con l'accorgimento di sostituire i vari Wk con (Wk)^(-1) e di dividere
il risultato finale per N.
