Capitolo 2 parte III
Transcript
Capitolo 2 parte III
Appunti di Elaborazione numerica dei segnali Capitolo 2 - DFT (parte III) Fast Fourier Transform ..................................................................................1 Introduzione ............................................................................................1 Esempio .............................................................................................3 FFT con decimazione nel tempo................................................................4 Costo dell’algoritmo.........................................................................12 Osservazione: sequenza x(n) reale.....................................................13 FFT con decimazione nelle frequenze ......................................................14 Ulteriori considerazioni sulla FFT con decimazione .................................19 Osservazione: FFT con decimazione nei tempi per una sequenza x(n) reale 21 Osservazione: algoritmi di decimazioni per sequenze di lunghezza qualsiasi 22 Fast Fourier Transfor m I NTRODUZIONE Riprendiamo nuovamente la formula per il calcolo della DFT di una sequenza di campioni x(n): N −1 X(k ) = ∑ x (n )WN−nk k = 0,1,...., N - 1 n =0 j 2π N dove ricordiamo che WN = e . L’obbiettivo che ci poniamo adesso è quello di rendere più efficiente possibile il calcolo del vettore X(k) a partire dal vettore x(n). Cominciamo allora a valutare il costo di quella formula: se N sono i campioni nel tempo (ed anche quelli in frequenza), possiamo semplicemente vedere quella formula come un sistema di N equazioni in N incognite: al variare di k, infatti, abbiamo che N −1 k = 1 → X ( 1 ) = x (n )WN− n ∑ n =0 N −1 k = 2 → X ( 2 ) = x (n ) WN−2 n ∑ n =0 ... N −1 k = N − 1 → X ( N − 1 ) = x (n ) WN− n ( N −1) ∑ n =0 Appunti di “Elaborazione numerica dei segnali” - Capitolo 2 Le incognite sono ovviamente i termini del vettore X(k). In forma matriciale, possiamo usare la seguente simbologia: [X(k)] = [WN ]⋅ [x(n )] N N N* N Il vettore X(k) è ottenuto come prodotto righe*colonne di una matrice quadrata di ordine N per il vettore x(n). Per calcolare il generico campione X(k), servono N moltiplicazioni ed N-1 somme; dato che i campioni da calcolare sono N, abbiamo N2 moltiplicazioni ed N(N-1) somme. Le somme non ci danno grossi problemi, per cui il problema è fondamentalmente nelle N2 moltiplicazioni (quindi N moltiplicazioni per ciascun campione). La complessità deriva anche dal fatto che tali moltiplicazioni (come anche le somme) coinvolgono, in generale, quantità complesse1. Ci chiediamo, allora, se possiamo in qualche modo ridurre il numero di moltiplicazioni. Ad j 2π N esempio, possiamo cercare di sfruttare la forte periodicità dei termini WN = e : questi rappresentano dei vettori di modulo unitario disposti regolarmente su un cerchio centrato nell’origine del piano complesso e godono delle proprietà per cui k+N N W =e j 2π (k+ N) N WNk + N / 2 = e =e 2π N j k+ N 2 j 2π k N =e j e j 2π N N 2π k N e j =e 2π N N 2 j 2π k N =e j e j 2 πN 2π k N =e j 2π k N e jπ = − e j = WNk 2π k N = − WNk ∀k ∀k La prima relazione dice che le funzioni WN sono periodiche di periodo N, mentre la seconda relazione indica una proprietà molto utile nei calcoli. La periodicità, in particolare, comporta che la matrice [WN ] sia una matrice cosiddetta trasposta: 1 1 X(0) 1 X(1) WN−1 1 X(2) WN−2 = ... .... ... − X( N − 2) 1 WN ( N −2) WN X( N − 1) 1 1 WN− 2 WN− 4 ... WN4 WN2 ... 1 .... WN2 ... WN4 ... ... ... WN−4 ... WN−2 1 x (0) WN x (1) WN2 x (2) ⋅ ... ... WN−2 x ( N − 1) WN−1 x ( N − 2) Analiticamente, il fatto che la matrice [WN ] sia trasposta significa che è simmetrica (come è evidente) e, inoltre, che gode della proprietà per cui 1 [WN ]* = [WN ]−1 N Si sfrutta allora questa proprietà2, nel modo che vedremo, per rendere efficiente il calcolo della DFT. L’algoritmo che si usa prende il nome di FFT (Fast Fourier Transform, ossia trasformata di Fourier veloce). Nei prossimi paragrafi vedremo quali sono le migliori tipologie di algoritmi FFT3. 1 E’ ovvio che possiamo passare dal numero di moltiplicazioni complesse al numero di moltiplicazioni reali (che poi sono quelle effettivamente realizzate): infatti, la moltiplicazione tra due numeri complessi z=x+jy e s=σ+jµ equivale a 4 moltiplicazioni reali (xσ, xµ, yσ, yµ), per cui il numero di moltiplicazioni reali è 4 volte quello di moltiplicazioni complesse. 2 Notiamo che la proprietà appena citata indichi, di fatto, l’invertibilità della matrice [WN]. Questo mostra, una volta di più, che la DFT sia invertibile, ossia che esista la IDFT. Autore: Sandro Petrizzelli 2 Trasformata di Fourier discreta (parte III) Esempio Prima di passare agli algoritmi FFT, facciamo un esempio semplice di calcolo di DFT. Consideriamo in particolare la seguente sequenza x(n) lunga 4 campioni: x (n ) = (0 1 2 3) Vogliamo calcolare il vettore X(k) non applicando la definizione di DFT, ma tramite il calcolo matriciale esposto poco fa. Il primo passo è, allora, evidentemente quello di calcolare la matrice [WN], dove, in questo caso, N=4: sfruttando la già proprietà in base alla quale WNk + N / 2 = − WNk , abbiamo che W40 0 [W4 ] = W40 W4 0 W4 W40 W41 W42 W43 W40 W42 W44 W46 W40 1 1 1 W43 1 W4 = 2 W46 1 W4 3 W49 1 W4 1 W42 W44 W46 1 1 1 1 1 3 W4 1 − j − 1 j = W46 1 − 1 1 − 1 W49 1 j − 1 − j Il secondo ed ultimo passo consiste nel moltiplicare questa matrice per il vettore x(n): 1 1 0 6 1 1 1 − j − 1 j 1 − 2 + 2 j = [X(k )] = [W4 ][ x (n )] = 1 − 1 1 − 1 2 − 2 1 j − 1 − j 3 − 2 − 2 j Se volessimo determinare, a questo punto, la IDFT, sarebbe molto semplice: infatti, dato che [X(k )] = [W4 ][ x (n )] , ci basterebbe moltiplicare, a sinistra, il vettore [X(k)] per l’inversa di [W4 ], la 1 −1 * quale, per la proprietà vista prima, è [WN ] = [WN ] : N [x (n )] = [W4 ] [X(k )] = −1 1 [W4 ]* [X(k)] 4 Non dobbiamo dunque calcolare nessuna matrice inversa, dato che [W4]-1 si ottiene semplicemente da [W4] complementando tutti i termini e poi dividendoli per 4: [W4 ]−1 = 1 [W4 ]* 4 3 1 1 1 1 1 j − 1 − j 1 = 1 − 1 4 1 j 1 − j − 1 j A questo punto è evidente la differenza tra DFT e FFT, che spesso vengono scambiate come sinonimi: la DFT è la formula di trasformazione discreta di Fourier, mentre FFT è l’algoritmo usato concretamente per il calcolo della DFT. 3 Autore: Sandro Petrizzelli Appunti di “Elaborazione numerica dei segnali” - Capitolo 2 FFT CON DECIMAZIONE NEL TEMPO Un primo modo di rendere efficiente il calcolo della DFT è quello di separare, nella sequenza di N campioni temporali, i campioni di posizione pari e quelli di posizione dispari: questo equivale semplicemente a scrivere che N −1 N / 2 −1 N / 2−1 n =0 i =0 i =0 X(k ) = ∑ x (n ) WN− nk = ∑ x(2i) WN−2ki + ∑ x(2i + 1) W − k ( 2 i +1) N E’ importante notare che le due sommatorie così ottenute non rappresentano, ciascuna, una particolare DFT: infatti, essendo le due sommatorie estese ad un numero N/2 di termini, esse j 2π N/2 dovrebbero usare dei pesi WN / 2 = e . Tornando adesso a quella espressione, semplifichiamo le nostre simbologie: poniamo xp(i) = x(2i) = sequenza dei campioni pari xd(i) = x(2i+1) = sequenza dei campioni dispari Con questa posizione, possiamo scrivere che X( k ) = N / 2−1 ∑ x p (L) WN−2 kL + L=0 N / 2−1 ∑x i =0 d (i) WN−k ( 2i+1) Se poi ci concentriamo sulla sommatoria estesa ai campioni di posizione dispari, possiamo osservare che WN− k ( 2i+1) = WN− k ⋅ WN−2 ki da cui scaturisce che X( k ) = N / 2−1 ∑x L=0 p (L) WN−2 kL + WN− k N / 2−1 ∑x i=0 d (i) WN−k 2i Possiamo poi considerare una ulteriore proprietà delle funzioni WN: possiamo infatti scrivere che − 2 ki N W =e j 2π 2i N =e j 2π ki N/2 = WN−ki/ 2 Sulla base di questa proprietà, possiamo esprimere la DFT nella forma X( k ) = N / 2−1 ∑ x p (L)WN−kL/ 2 + WN−k L=0 N / 2 −1 ∑x i =0 d (i) WN− ki/ 2 In questo modo, ci siamo ricondotti a quanto detto prima, nel senso che adesso le due sommatorie rappresentano, di fatto, due DFT, di lunghezza N/2, rispettivamente della sequenza di campioni temporali pari e dispari: X (k ) = X P (k ) + WN− k X D (k ) Autore: Sandro Petrizzelli 4 Trasformata di Fourier discreta (parte III) E’ ovvio che XP (k) e XD(k), essendo lunghe N/2 ma essendo estese allo stesso intervallo di tempo di X(k), sono periodiche di periodo metà (N/2) rispetto ad X(k). Dato che il coefficiente di pesatura WN− k è periodico di periodo N, la somma è periodica di periodo N, come deve essere. In definitiva, quindi, abbiamo “trasformato” il calcolo di una DFT di lunghezza N in due DFT ciascuna di lunghezza N/2. Questa operazione ha senso solo se il numero di moltiplicazioni da fare è minore di N2 ed in effetti è così: infatti, una DFT di lunghezza N/2 richiede un numero di moltiplicazioni pari a N2 /4, per cui due DFT di lunghezza N/2 richiedono un numero di moltiplicazioni pari a N2/2. Abbiamo dunque trovato che spezzando la DFT di partenza, X(k), in due DFT di lunghezza metà (ottenute usando la sequenza di campioni temporali pari e quella di campioni dispari), il numero di moltiplicazioni si dimezza. In realtà, non è proprio così, perchè, alle N2/2 moltiplicazioni appena calcolate vanno aggiunte le N/2 moltiplicazioni complesse necessarie a calcolare il prodotto WN− k X D (k ) . Concludiamo, quindi, che, spezzando la DFT di partenza, X(k), in due DFT di lunghezza metà, il numero di moltiplicazioni diventa N2 N N TOT ,1 = + 2 2 Rispetto alle N2 moltiplicazioni necessarie al calcolo diretto della DFT, il fattore di riduzione è dunque leggermente inferiore a 2 e tende a 2 per N molto grande. A questo punto, però, è ovvio che possiamo ulteriormente iterare il metodo, spezzando XP (k) e XD(k) ciascuna in altre due DFT (ottenute sempre separando i termini in posizione pari e quelli in posizione dispari), di lunghezza N/4: X P ( k ) = X PP ( k ) + WN− k/ 2 X PD ( k ) X D (k ) = X DP ( k ) + WN− k/ 2 X DD (k ) Quindi, se arriviamo a questo passaggio, il calcolo della DFT complessiva richiede di calcolare 4 DFT, ciascuna su N/4 campioni, per cui avremo in totale 4(N/4)2 moltiplicazioni complesse, cui dovremo aggiungere N/4 moltiplicazioni per calcolare WN− k/ 2 X PD (k ) , N/4 moltiplicazioni per calcolare WN−k/ 2 X DD (k ) e poi, come visto prima, N/2 moltiplicazioni per calcolare WN− k X D (k ) . il totale delle moltiplicazioni da fare è dunque 2 N TOT , 2 N N N N2 N = 4 + + + = +N 4 4 2 4 4 Confrontando sempre con le N2 /2 moltiplicazioni da fare con il calcolo diretto, la riduzione è ancora maggiore. Il procedimento può evidentemente continuare in questo modo. Non andrà però all’infinito, ma avrà necessariamente un termine: ci si deve necessariamente fermare quando si arriva a dover calcolare la DFT di una sequenza di lunghezza 1 (che poi è semplicemente pari ad una costante pari all’ampiezza del campione stesso). In realtà, è sufficiente arrestare il calcolo alla DFT di una sequenza di 2 campioni, che è comunque abbastanza facile da calcolare: si può facilmente verificare che il numero di passi necessario per arrivare a calcolare solo DFT di sequenze lunghe 2 è log 2 N . Questi discorsi, però, presuppongono alcune condizioni di partenza: 5 Autore: Sandro Petrizzelli Appunti di “Elaborazione numerica dei segnali” - Capitolo 2 • intanto, è necessario che la sequenza x(n) di partenza sia costituita da un numero pari di campioni, in quanto solo in questo caso è possibile separare, in x(n), i campioni temporali pari da quelli dispari; • non solo, ma si può arrivare fino al calcolo di una sequenza di 2 campioni solo se la sequenza iniziale ha una lunghezza pari ad una potenza di 2: ad esempio, se abbiamo una sequenza di 8 campioni, possiamo dividerla prima in due sequenze da 4 e poi passare a 4 sequenze da 2; se, invece, avessimo una sequenza, per esempio, di 10 campioni, potremmo dividerla in due sequenza da 5 e poi non potremmo fare più niente. Siamo dunque nell’ipotesi che la sequenza x(n) abbia lunghezza pari ad una potenza di 2: N=2m. Sotto questa ipotesi, deduciamo che, per ricondurci al calcolo di trasformate elementari (cioè DFT di sequenze lunghe 2), sono necessari log 2 N = log 2 2 m = m passi. Serviamoci di un esempio concreto. Consideriamo una sequenza x(n) lunga N=8 campioni: x (0) x (1), x (2), x (3), x (4), x (5), x (6), x (7) DFT → X (0), X (1), X(2), X(3), X(4), X(5), X (6), X(7) Anche la corrispondente X(k) sarà composta da 8 campioni. Avviamo il procedimento iterativo: al primo passo, possiamo separare i campioni temporali in posizione pari e quelli in posizione dispari e calcolare le rispettive DFT con le formule illustrate prima: X( k ) = N / 2−1 N / 2 −1 3 3 L=0 i =0 L =0 i =0 ∑ x p (L)WN−kL/ 2 + WN−k ∑ x d (i) WN−ki/ 2 = ∑ x p (L) W4−kL + W8−k ∑ x d (i) W4−ki E’ comodo usare, per rappresentare l’equazione appena ottenuta, uno schema logico del tipo seguente: x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) N / 2 −1 ∑x p (L)WN−kL /2 L=0 DFT campioni pari NN/ 2/ 2−1−1 ∑xx ((Li))W W ∑ Li==00 −−ki kL N N // 22 pd DFTcampioni campionidispari pari DFT XP(0) XP(1) XP(2) XP(3) XD(0) XD(1) XD(2) XD(3) Dati gli 8 campioni temporali in ingresso, li mandiamo in due blocchi logici, dei quali uno effettua la DFT dei campioni di posizione pari, mentre l’altro effettua la DFT dei campioni di posizione dispari. Ovviamente, per calcolare la X(k) a partire da XP (k) e XD(k), dobbiamo tenere conto di varie considerazioni: • in primo luogo, mentre gli XP (k) vanno considerati così come sono, gli XD(k), prima di essere considerati, vanno pesati per WN− k . Autore: Sandro Petrizzelli 6 Trasformata di Fourier discreta (parte III) • in secondo luogo, sia XP (k) sia XD(k) sono periodiche di periodo N/2, ossia in questo caso di periodo 4; • infine, le − ( k + N / 2) N W funzioni −k N =W −N / 2 N ⋅W WN− k pesi −k N =W sono periodiche di periodo N (=8), per cui −k N ⋅ (−1) = − W . Sulla base di queste considerazioni, analiticamente abbiamo quanto segue: k =0 → X(0) = X P (0) + WN0 X D (0) k = 1 → X(1) = X P (1) + WN−1X D (1) k =2 → X (2) = X P (2) + WN− 2 X D (2) k = 3 → X (3) = X P (3) + WN−3 X D (3) k =4 → X (4) = X P (4) + WN− 4 X D (4) = X P (0) + WN− 4 X D (0) = X P (0) − WN0 X D (0) k = 5 → X(5) = X P (5) + WN−5 X D (5) = X P (1) − WN−1X D (1) k =6 → X(6) = X P (6) + WN−6 X D (6) = X P (2) − WN− 2 X D (2) k=7 → X (7) = X P (7) + WN−7 X D (7) = X P (3) − WN−3 X D (3) Queste relazioni ci consentono dunque di completare lo schema logico per il calcolo di X(k) a partire semplicemente dai campioni x(n) in posizione pari ed in posizione dispari: x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) N / 2 −1 ∑x p XP(0) XP(1) XP(2) XP(3) − kL N/2 (L)W L=0 DFT campioni pari NN/ 2/ 2−− 11 XD(0) XD(1) XD(2) XD(3) ∑xx ((Li))W W ∑ Li==00 pd −−ki kL N N // 22 DFTcampioni campionidispari pari DFT ⋅ WN0 ⋅ WN−1 ⋅ WN−2 ⋅ WN−3 + + + + + + + + + + + + - X(0) X(1) X(2) X(3) X(4) X(5) X(6) X(7) Si nota immediatamente che i primi 4 campioni della X(k) sono ottenuti sommando i campioni corrispondenti delle due DFT (di cui quelli di XD(k) opportunamente pesati), mentre i successivi 4 campioni sono ottenuti sottraendo, ai campioni XP (k), i campioni XD(k) (sempre opportunamente pesati). Le moltiplicazioni complesse da effettuare sono 4 per la DFT dei campioni pari, 4 per la DFT dei dispari e 4 per i coefficienti di peso. In generale, quindi, la struttura che si ottiene è del tipo seguente: + X(k) + ⋅ WN− k + - X(k+N/2) 7 Autore: Sandro Petrizzelli Appunti di “Elaborazione numerica dei segnali” - Capitolo 2 Questa è una tipica struttura a farfalla (o grafo a farfalla): si parte da due valori complessi, si moltiplica il secondo per il coefficiente di peso WN− k e poi si effettuano due combinazioni lineari, in particolare una somma ed una differenza. Partendo da 8 campioni x(n), abbiamo ottenuto 4 farfalle di quel tipo, sovrapposte. L’insieme di tali farfalle sovrapposte costituisce uno stadio a farfalla. A questo punto, come osservato prima, l’operazione si può ripetere per il calcolo della DFT dei campioni pari, XP (k), e della DFT dei campioni dispari, XD(k): si tratta cioè di esplicitare meglio le due black box presenti nello schema di prima. Consideriamo ad esempio il calcolo della DFT dei campioni temporali di posizione pari, XP (k): con il metodo diretto, abbiamo che X P (k ) = N / 2 −1 ∑x L=0 3 p − kL (L) WN− kL = x p (0) W40 + x p (1) W4− k + x p (2)W4−2 k + x p (3) W4−3k / 2 = ∑ x p ( L ) W4 L=0 ⇓ X P (0) = x p (0)W40 + x p (1) W40 + x p (2) W40 + x p (3) W40 0 −1 −2 −3 X P (1) = x p (0) W4 + x p (1)W4 + x p (2) W4 + x p (3) W4 0 −2 −4 −6 X P (2) = x p (0) W4 + x p (1) W4 + x p (2)W4 + x p (3) W4 0 −3 −6 −9 X P (3) = x p (0) W4 + x p (1) W4 + x p (2) W4 + x p (3) W4 ⇓ x p (0) = x (0) x p (1) = x (2) DFT di lunghezza N/2 → X P (0), X P (1), X P (2), X P (3) = x ( 2 ) x ( 4 ) p x (6) = x (6) p Possiamo invece scindere il calcolo della DFT nel calcolo di due DFT, di lughezza 2, prendendo i campioni x(0) ed x(4) (cioè quelli in posizione pari all’interno di xp(i)) per la prima DFT e i campioni x(2) ed x(6) (cioè quelli in posizione dispari all’interno di xp(i)) per la seconda: 3 X P (k ) = ∑ x p (L) W4−kL = X PP (k ) + W4−k X PD (k ) L=0 dove X PP (k ) = ∑x i =0 , 4 p (i) W2− ki X PD (k ) = e ∑x i = 2, 6 p (i) W2− ki Il criterio da adottare è identico a prima, per cui avremo un nuovo stadio a farfalla, del tipo seguente: Autore: Sandro Petrizzelli x(0) XP(0) x(4) XP(1) x(2) XP(2) x(6) XP(3) 8 Trasformata di Fourier discreta (parte III) Abbiamo, per semplicità, tralasciato di indicare le moltiplicazioni per i coefficienti di peso e i segni con cui i campioni vanno sommati. Ad ogni modo, le moltiplicazioni da compiere in questo stadio sono solo 4: infatti, abbiamo 1 moltiplicazione per la DFT di x(0) ed x(4), 1 moltiplicazione per la DFT di x(2) ed x(6) e 2 moltiplicazioni per i coefficienti di peso W4−k . Discorso assolutamente analogo vale per i campioni temporali in posizione dispari: se usassimo il metodo diretto, avremmo X D (k ) = N / 2−1 ∑x L=0 3 d − kL = x d (0) W40 + x d (1) W4− k + x d (2) W4− 2k + x d (3) W4−3k (L) WN−kL / 2 = ∑ x d ( L) W4 L=0 ⇓ X D (0) = x d (0) W40 + x d (1) W40 + x d (2) W40 + x d (3)W40 0 −1 −2 −3 X D (1) = x d (0) W4 + x d (1)W4 + x d (2) W4 + x d (3)W4 −2 −4 −6 0 X D (2) = x d (0)W4 + x d (1) W4 + x d (2)W4 + x d (3) W4 X (3) = x (0)W 0 + x (1) W −3 + x (2) W −6 + x (3) W −9 d 4 d 4 d 4 d 4 D ⇓ x d (0) = x (1) x d (1) = x (3) DFT di lunghezza N/2 → X D (0), X D (1), X D (2), X D (3) x d (2) = x (5) x d (6) = x (7) Se invece separiamo il calcolo della DFT dei campioni x(1) ed x(5) ed il calcolo della DFT dei campioni x(3) ed x(7), abbiamo che 3 X D (k ) = ∑ x d (L) W4− kL = X DP (k ) + W4−k X DD (k ) L =0 dove X DP (k ) = ∑x i =1, 5 d (i) W2−ki X DD (k ) = e ∑x i =3 , 7 d (i) W2− ki Lo schema funzionale (quindi un ulteriore stadio a farfalla) è il seguente: x(1) XD(0) x(5) XD(1) x(3) XD(2) x(7) XD(3) Anche qui abbiamo in totale 4 moltiplicazioni complesse, di cui due dovute ai coefficienti di peso W4−k . 9 Autore: Sandro Petrizzelli Appunti di “Elaborazione numerica dei segnali” - Capitolo 2 Così facendo, abbiamo ancora 4 black box, ciascuna delle quali rappresenta la DFT di una sequenza lunga 2 campioni. Potremmo ripetere il discorso di prima, ma ci troveremmo a calcolare 8 DFT di sequenze lunghe 1, per cui possiamo sicuramente arrestarci prima, calcolando le 4 DFT di sequenze di lunghezza 2: la formula generale, per ciascuna di queste 4 DFT, sarà evidentemente del tipo 1 ∑ x (n ) W − kn 2 n =0 Lo schema dettagliato di quest’ultimo calcolo è il seguente: x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) ∑ x (n ) W − kn 2 n =2 , 6 XP(1) XP(2) ∑ x (n ) W n =0 , 4 − kn 2 ∑ x (n ) W n =1,5 − kn 2 ∑ x (n ) W n = 3, 7 XP(0) − kn 2 XP(3) XD(0) XD(1) XD(2) XD(3) Il totale delle moltiplicazioni complesse, rivedendo quanto appena descritto, è 4+4+4=12, dove 4 sono le moltiplicazioni per calcolare XP (k), 4 quelle per calcolare XD(k) ed infine 4 quelle per calcolare WN− k X D (k ) . Riprenderemo questo aspetto più tardi. E’ interessante invece notare l’ordinamento dei campioni x(n) in ingresso. Si può infatti osservare che tale ordinamento corrisponde al cosiddetto reverse bit order, cioè l’ordine dei numeri decimali ottenuto nel modo seguente: 000 000 0 001 100 4 010 010 2 011 110 6 i bit (ad esempio da 011 a 110) invertendo → 100 001 1 101 101 5 110 011 3 111 111 7 In pratica, si parte dalle configurazioni binarie corrispondenti alle prime 8 cifre decimali (0,1,...,8), si inverte l’ordine dei bit e si riconverte in decimale: l’ordine decimale ottenuto è esattamente quello riportato, nella schema di prima, per i campioni x(n) in ingresso. La figura seguente mostra i due passi 10 Autore: Sandro Petrizzelli Trasformata di Fourier discreta (parte III) necessari per ottenere, dai campioni x(n) ordinati in modo naturale, i campioni x(n) ordinati in reverse bit order: ordine naturale reverse bit order x(0) x(0) x(0) x(1) x(2) x(4) x(2) x(4) x(2) x(3) x(6) x(6) x(4) x(1) x(1) x(5) x(3) x(5) x(6) x(5) x(3) x(7) x(7) x(7) Figura 1 - Modifica dell’ordinamento dei campioni x(n) dall’ordine naturale all’ordine binario inverso (reverse bit order): il numero di passaggi da effettuare, nel caso di N=23 , è 2. In generale, se N=2m , il numero di passaggi da effettuare è m-1. L’algoritmo descritto per il calcolo della DFT prende il nome di FFT con decimazione nel tempo (o anche FFT radix 2). Come abbiamo appena visto, per avere in uscita i campioni X(k) in ordine crescente è necessario, in questo caso, disporre i campioni x(n) in ingresso secondo il reverse bit order. Si può anche osservare un importante vantaggio di questo procedimento; consideriamo per esempio lo schema necessario al calcolo del vettore XP (k): x(0) XP(0) x(4) XP(1) x(2) XP(2) x(6) XP(3) Il programma che esegue i calcoli memorizza i primi due campioni, x(0) ed x(4), in due celle di memoria, dopo di che calcola la loro DFT; a questo punto, anche se non siamo ancora in grado di calcolare gli XP (k), non abbiamo comunque più bisogno di x(0) ed x(4), per cui possiamo usare le loro locazioni di memoria per memorizzare i risultati della DFT appena calcolata. Quando siamo in presenza di un numero elevato di campioni, questo fatto consente un notevole risparmio di memoria. 11 Autore: Sandro Petrizzelli Appunti di “Elaborazione numerica dei segnali” - Capitolo 2 Costo dell’algoritmo A questo punto, torniamo a parlare del costo dell’algoritmo appena descritto, al fine di giudicarne l’efficienza. A voler essere rigorosi, dovremmo considerare non solo le moltiplicazioni, ma anche le addizioni e le operazioni di indirizzamento. Trascuriamo però questi ultimi due fattori1, limitandoci al numero di moltiplicazioni complesse: • abbiamo già detto in precedenza che il calcolo diretto2 della DFT di una sequenza x(n) lunga N comporta N2 moltiplicazioni (complesse); se la lunghezza è una potenza di 2, ossia N=2m, allora le moltiplicazioni da compiere sono N2=22m; se, ad esempio N=8=23, le moltiplicazioni da compiere sarebbero 64; • se invece usiamo l’algoritmo di decimazione nel tempo, il numero di moltiplicazioni complesse diminuisce: infatti, ogni stadio di applicazione dell’algoritmo comporta il calcolo di N/2 grafi a farfalla, ognuno dei quali costa una moltiplicazione (quella per il coefficiente di peso); gli stadi N a farfalla sono in tutto log2N, per cui le moltiplicazioni da compiere sono log 2 N , che 2 ovviamente diventa 2 m−1 ⋅ m se N=2m. Se, ad esempio N=8, si trova che le moltiplicazioni da compiere sono 12, , così come abbiamo osservato nello schema generale disegnato prima. In realtà, questo conto si può anche correggere per un motivo molto semplice: quando si giunge allo stadio finale, nel quale calcoliamo DFT di sequenze lunghe 2, usiamo, come funzioni j 2π N base della scomposizione, i termini W2; ricordando allora che WN = e , è evidente che W2 =±1; questo significa che, in tale stadio finale, non abbiamo più moltiplicazioni complesse, ma solo somme o differenze; di conseguenza, se l’ultimo stadio a farfalla non richiede moltiplicazioni, il numero di moltiplicazioni complesse diventa N tot = N N N (log 2 N − 1) = N (log 2 N − log 2 2 ) = N log 2 N → N tot = 2 log 2 2 2 2 2 2 dove abbiamo proprio tenuto in conto il fatto che gli stadi a farfalla richiedenti N/2 moltiplicazioni sono in realtà (log 2 N − 1) e non log2N. Ad esempio, nel caso in cui N=8=23, le moltiplicazioni da compiere sono 8. Confrontando con il metodo diretto, abbiamo guadagnato un fattore 64/8=8. In generale, il guadagno, in termini di moltiplicazioni complesse, è N2 N2 2N G= = = N N N tot N log 2 log 2 2 2 2 La tabella seguente mostra la comparazione tra il costo dell’algoritmo diretto di calcolo della DFT e il costo dell’algoritmo radix 2 (trascurando l’ultima osservazione circa l’ultimo stadio a farfalla) al variare di N (sempre potenza di 2): 1 Si può comunque verificare che il numero di somme complesse è Nlog2N 2 cioè applicando la normale definizione Autore: Sandro Petrizzelli 12 Trasformata di Fourier discreta (parte III) Numero di punti Algoritmo diretto N2 Algoritm radix 2 N log 2 N 2 Guadagno 2N log 2 N N 4 8 32 64 128 16 64 256 1.024 4.096 4 12 32 80 192 4 5.3 8 12.8 21.3 256 512 1.024 16.384 65.536 262.144 1.048.576 448 1.024 2.304 5.120 36.6 64 113,8 206,8 Si nota che, all’aumentare di N, il guadagno ottenuto con la decimazione è sempre maggiore. Lo schema della figura seguente è riepilogativo del procedimento appena illustrato, nel caso sempre di N=8: x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) 2-point DFT 2-point DFT 2-point DFT 2-point DFT Combinazione delle 2-point DFT X(0) X(1) X(2) Combinazione delle 4-point DFT X(3) X(4) X(5) Combinazione delle 2-point DFT X(5) X(6) Algoritmo di decimazione nei tempi per il calcolo di una DFT basata su 8 campioni (8-point DFT): l’algoritmo comporta 3 stadi (in generale, log2 N), partendo dai campioni x(n) (disposti secondo il reverse bit order) e giungendo ai campioni X(k) (disposti nell’ordine naturale), per un totale di 12 moltiplicazioni complesse e 24 somme complesse. Osservazione: sequenza x(n) reale Il metodo appena descritto ha due inconvenienti fondamentali: • il primo è quello per cui la sequenza x(n) di partenza deve avere lunghezza N pari ad una potenza di 2: se così non fosse, l’unica soluzione sarebbe quella di aggiungere tanti zeri fittizi quanti ne servono per arrivare alla condizione N=2m; 13 Autore: Sandro Petrizzelli Appunti di “Elaborazione numerica dei segnali” - Capitolo 2 • il secondo inconveniente è che l’algoritmo dà uno spreco quando stiamo usando la DFT per implementare la convoluzione tra due sequenze reali. FFT CON DECIMAZIONE NELLE FREQUENZE Nel paragrafo precedente abbiamo dunque visto un primo modo di calcolare la DFT di una sequenza x(n) lunga N: la sdoppiamo in due DFT, una relativa ai campioni x(n) in posizione pari e l’altra relativa ai campioni x(n) in posizione dispari, pesiamo quest’ultima in modo opportuno e poi sommiamo. Si può seguire anche un’altra strada. Consideriamo nuovamente la definizione di DFT di una sequenza x(n) di lunghezza N: N −1 X(k ) = ∑ x (n )WN−nk k = 0,1,...., N - 1 n =0 j 2π dove WN = e N . Così come nel paragrafo precedente, supponiamo che il numero N di campioni x(n) considerati sia pari. Spezziamo la sequenza x(n) ancora una volta in due parti, ma questa volta separiamo semplicemente i primi N/2 campioni ed i successivi N/2 campioni: X( k ) = N / 2−1 ∑ x(n )WN−nk + n =0 N −1 ∑ x (n ) W − nk N n=N / 2 Per comodità di notazione, indichiamo con x1m(n) i primi N/2 campioni e con x2m(n) i successivi: X( k ) = N / 2−1 ∑ x1m (n) WN−nk + n =0 N −1 ∑x 2m (n ) WN−nk n=N / 2 Ci possiamo inoltre ricordare una fondamentale proprietà del vettore degli X(k), in base alla quale, con riferimento alla seconda sommatoria, possiamo scrivere che N −1 ∑x n=N / 2 − nk = 2 m ( n ) WN N / 2 −1 ∑x n =0 2m (n )WN−k (n + N / 2 ) Possiamo dunque riscrivere la DFT nella forma X( k ) = N / 2−1 ∑ x1m (n) WN−nk + n =0 N / 2 −1 ∑x n =0 2m (n )WN−k (n + N / 2 ) Ci troviamo nuovamente nella condizione per cui le due sommatorie non sono delle DFT, per il semplice fatto che esse, pur essendo estese ad N/2 elementi, hanno coefficienti di peso WN anzichè WN/2. Per ricondurci, allora, alla somma di due DFT, ci basta separare, nel vettore X(k), i campioni in posizione pari (k=2p) e i campioni in posizione dispari (k=2p+1): Autore: Sandro Petrizzelli 14 Trasformata di Fourier discreta (parte III) • per ottenere i campioni X(k) in posizione pari, ci basta porre k=2p: X(2p) = N / 2−1 ∑ x1m (n )WN−n 2 p + N / 2−1 n =0 = N / 2 −1 ∑x 1m ∑ x 2 m (n) WN−2 p (n + N / 2 ) = N / 2 −1 ∑ x1m (n) WN−n 2 p + WN−pN n =0 − pN (n ) WN−np / 2 + WN n =0 N / 2−1 ∑x 2m (n ) WN−np/ 2 = n =0 N / 2−1 ∑x n =0 1m (n )WN− np /2 + n =0 N / 2 −1 ∑x 2m N / 2 −1 ∑x n =0 n =0 dove abbiamo tenuto conto di due proprietà: in primo luogo, che W secondo luogo, che WN−2 pn = e =e 2π ⋅pN j N/2 (n )WN−2 pn = (n ) WN− np /2 − pN N 2π j ⋅2 pN N 2m =e j 2π ⋅pN N = 1 e, in = WN−pn/ 2 ; • in modo analogo, per ottenere i campioni X(k) in posizione dispari, ci basta porre k=2p+1: X(2p + 1) = N / 2 −1 ∑ x1m (n )WN−n ( 2p +1) + N / 2 −1 n =0 = N / 2 −1 ∑x 1m ∑x (n ) WN−n 2 p WN−n + n =0 N / 2 −1 ∑x 2m (n ) WN− 2 pn WN−n WN−pN WN− N / 2 = n =0 N / 2 −1 ∑x (n ) WN−( 2 p+1)( n + N / 2 ) = n =0 n =0 = 2m 1m (n ) WN−pn/ 2 WN− n − N / 2 −1 ∑x n =0 2m −n (n ) WN− pn / 2 WN dove abbiamo tenuto conto delle stesse proprietà di cui al punto precedente ed inoltre della proprietà per cui WN− N / 2 = e j 2π N ⋅ N 2 = e jπ = −1 ; Consideriamo allora i campioni X(k) in posizione pari: X(2p) = N / 2−1 ∑ x1m (n )WN−np/ 2 + n =0 N / 2 −1 ∑x n =0 2m (n )WN−np /2 E’ evidente, dall’espressione trovata, che ci siamo ricondotti al calcolo di due DFT di lunghezza metà (N/2) rispetto ad X(k). Tali due DFT sono quella dei primi N/2 campioni x(n) e quella dei successivi N/2 campioni x(n). In realtà, possiamo ricondurci ad un unica DFT, osservando che le due sommatorie sono estese agli stessi intervalli, per cui possono essere inglobate in una sola: X(2p) = N / 2 −1 ∑ [x n =0 1m (n ) + x 2 m (n )]WN− np /2 Passiamo ai campioni X(k) in posizione pari: in base a quanto trovato, possiamo mettere insieme le due sommatorie e scrivere che X(2p + 1) = N / 2−1 ∑x n =0 1m −n (n )WN−pn / 2 WN − N / 2 −1 ∑x n =0 2m −n (n )WN−pn / 2 WN = 15 N / 2 −1 ∑ [x n =0 1m (n ) − x 2 m (n )]WN−n WN−pn /2 Autore: Sandro Petrizzelli Appunti di “Elaborazione numerica dei segnali” - Capitolo 2 Questa è la DFT della sequenza [x 1m (n ) − x 2 m (n )]WN− n ottenuta come differenza, pesata per WN− n , tra i primi N/2 campioni x(n) e i successivi N/2 campioni. Si capisce dunque che siamo pervenuti ad un algoritmo diverso da quello esaminato nel paragrafo precedente: con la decimazione nei tempi, dovevamo prima calcolare la trasformata di due sequenze temporali lunghe metà e poi combinare le due trasformate, mentre adesso dobbiamo prima combinare opportunamente i campioni x(n), separando la prima metà dalla secona metà, e poi dobbiamo trasformare le due sequenze ottenute. Possiamo ancora una volta servirci di un esempio. Consideriamo sempre il caso di una sequenza x(n) lunga N=8: x (0) x (1), x (2), x (3), x (4), x (5), x (6), x (7) DFT → X (0), X (1), X(2), X(3), X(4), X(5), X (6), X(7) L’algoritmo ci dice che, dati i campioni x(n), dobbiamo separare i primi 4 dai successivi 4 e poi li dobbiamo combinare opportunamente. Analiticamente, abbiamo dunque quanto segue: 3 X ( 0 ) [x1m (n) + x 2m (n)]W40 = ∑ n =0 3 X ( 2 ) [x1m (n) + x 2m (n)]W4−n = ∑ 3 n =0 →X(2p) = ∑[x1m (n) + x 2m (n)]W4−np → X(k) pari 3 n =0 X(4) = [x (n) + x (n)]W−2n ∑ 1m 2m 4 n =0 3 X(6) = [x (n) + x (n)]W−3n ∑ 1m 2m 4 n =0 3 X ( 1 ) = [x1m (n) − x 2m (n)]WN−n WN0 / 2 ∑ n =0 3 X ( 3 ) = [x1m (n) − x2m (n)]WN−n WN−n/ 2 ∑ 3 n =0 X(k) dispari →X(2p + 1) = ∑[x1m (n) − x 2m (n)]WN−n WN−pn → /2 3 n =0 X(5) = [x (n) − x (n)]W−n W−2p ∑ 1m 2m N N/ 2 n =0 3 X(7) = [x (n) − x (n)]W−n W−3p ∑ 1m 2m N N/ 2 n =0 E’ sicuramente più comodo mostrare il tutto mediante uno schema a blocchi, che sarà del tipo seguente: Autore: Sandro Petrizzelli 16 Trasformata di Fourier discreta (parte III) x(0) X(0) 4-point DFT x(1) x(2) X(2) X(4) X(6) x(3) x(4) - x(5) x(6) x(7) ⋅ WN0 ⋅ WN−1 −2 N ⋅W X(1) 4-point DFT X(3) X(5) −3 N ⋅W X(7) E’ importante sottolineare nuovamente il fatto che, mentre i campioni pari di X(k) si ottengono sommando semplicemente gli x1m(n) e x2m(m) e poi calcolando la DFT, i campioni dispari di X(k) si ottengono sottraendo gli x2m(n) dagli x1m(m), moltiplicando per i coefficienti di peso WNn e dopo calcolando la DFT. Le moltiplicazioni complesse da compiere sono: 16 per la DFT dei primi 4 campioni x(n), altre 16 per la DFT degli ultimi 4 campioni x(n) ed altre 4 per i coefficienti di peso WNn . In tutto, 36 moltiplicazioni complesse. Ancora una volta, abbiamo guadagnato rispetto all’algoritmo diretto, che ne richide 82=64. Il discorso, a questo punto, è analogo a quello del paragrafo precedente: dato che X(2p) = N / 2−1 ∑ x1m (n) WN−np/ 2 + n =0 X(2p + 1) = N / 2 −1 ∑x 1m N / 2−1 ∑x n =0 2m −n (n ) WN−pn / 2 WN − n =0 (n ) WN−np/ 2 N / 2 −1 ∑x 2m (n ) WN−pn/ 2 WN− n n =0 possiamo considerare separatamente le 4 DFT e applicare a ciascuna di essere lo stesso discorso seguito prima. Si può così iterare il procedimento, arrestandosi ancora una volta al passo in cui ci si trova a dover calcolare DFT di sequenza di lunghezza 2. Nel caso di una sequenza x(n) di partenza lunga 8, ci vorranno ancora una volta 3 passi per arrivare a calcolare DFT di sequenze di lunghezza 2. Si può anche osservare che, applicando il procedimento iterativo e partendo dai campioni x(n) disposti secondo l’ordine naturale, si ottengono, in uscita, i campioni X(k) disposti secondo il reverse bit order: 17 Autore: Sandro Petrizzelli Appunti di “Elaborazione numerica dei segnali” - Capitolo 2 campioni x(n) x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) 000 001 010 011 i bit (ad esempio da 011 a 110) invertendo → 100 101 110 111 000 100 010 110 001 101 011 111 0 4 2 6 1 5 3 7 campioni X(k) X(0) X(4) X(2) X(6) X(1) X(5) X(3) X(7) Se invece, come nel caso della decimazione nei tempi, disponiamo i campioni x(n) in ingresso secondo il reverse bit order, otteniamo in uscita i campioni X(k) in ordine naturale e questo consente, come in quel caso, di risparmiare memoria, in quanto è possibile sovrapporre il risultato ai campioni originari. In generale, con riferimento anche l’algoritmo con decimazione nei tempi, possiamo affermare che si “entra” in ordine naturale e si “esce” in reverse bit order e viceversa. L’algoritmo appena descritto prende il nome di FFT con decimazione in frequenza. Il costo dell’algoritmo è identico a quello con decimazione nel tempo: ad esempio, nel caso di N=8, ci vogliono in tutto 3 stadi, ciascuno dei quali richiede 4 moltiplicazioni (dovute solo ai coefficienti di peso), per cui le moltiplicazioni totali sono 12. La figura seguente mostra il diagramma completo degli stadi a farfalla, per l’algoritmo con decimazione in frequenza, nel caso di N=8: Si nota chiaramente che il grafo a farfalla è, in questo caso, del tipo seguente: Autore: Sandro Petrizzelli 18 Trasformata di Fourier discreta (parte III) a + b + - A =a+b + ⋅ WNk B = (a − b )WNk Esso è sostanzialmente identico a quello visto per la decimazione nei tempi, con la differenza che la moltiplicazione per il coefficiente di peso WNk avviene, sul ramo inferiore, dopo la differenza. ULTERIORI CONSIDERAZIONI SULLA FFT CON DECIMAZIONE Abbiamo dunque esaminato, nei paragrafi precedenti, due possibili algoritmi per il calcolo della DFT di una sequenza x(n) di campioni temporali, di lunghezza N. In entrambi i casi, il concetto di fondo è quello di spezzare iterativamente una sequenza x(n) di partenza in due sequenze lunghe metà, calcolare la DFT di tali sequenze e combinare opportunamente le sequenze. Questo consente di guadagnare approssimativamente un fattore 2 nel numero delle moltiplicazioni complesse1. Ad esempio, se consideriamo l’algoritmo di decimazione in frequenza, possiamo scrivere quanto segue: y( n ) = x ( n ) N z( n ) = x n + 2 x (n ) = lunghezza N N −1 2 N per n = 0,....., − 1 2 per n = 0,....., y( n ) + lunghezza N/2 z (n ) N −1 N / 2 −1 n =0 n =0 DFT → X(k ) = ∑ x (n ) WN−kn = ∑ y( n ) W − kn N + N / 2−1 ∑ z( n ) W −k ( n + N / 2 ) N n =0 lunghezza N/2 Data x(n), prendiamo la sequenza y(n) costituita dai primi N/2 campioni e la sequenza z(n) costituita dagli ultimi N/2 campioni, calcoliamo le rispettive DFT e le combiniamo opportunamente per ottenere X(k). Stesso discorso possiamo fare per la FFT con decimazione nei tempi, dove y(n) e z(n) diventano l’una la sequenza dei campioni x(n) di posizione dispari e l’altra la sequenza dei campioni x(n) di posizione dispari2. Scelta questa maniera di operare, diventa importante poter calcolare contemporaneamente la DFT delle sequenze y(n) e z(n). Ci mettiamo allora in una ipotesi ben precisa: supponiamo che x(n) sia una sequenza reale, il che significa che anche y(n) e z(n) siano sequenze reali. Il motivo per cui ci riferiamo a sequenze reali è il seguente: gli algoritmi FFT sono ottimizzati per calcolare moltiplicazioni e addizioni tra numeri complessi3, per cui ha senso chiedersi se si possa sfruttare questa peculiarità della DFT nei confronti dei numeri complessi per ottimizzare il calcolo della DFT di una sequenza reale. 1 Il guadagno è approssimativamente 2, perchè bisogna comunque considerare il costo della ricombinazione delle sequenze, che consistenella moltiplicazione di una delle due per opportuni coefficienti di peso. 2 Si veda, a tal proposito, l’osservazione in coda a questo paragrafo 3 Il motivo di ciò è molto semplice: anche se la sequenza x(n) di partenza è reale, dopo il primo stadio a farfalla, a causa della presenza di fattori di fase complessi, tutte le quantità sono verosimilmente complesse 19 Autore: Sandro Petrizzelli Appunti di “Elaborazione numerica dei segnali” - Capitolo 2 Se calcoliamo la DFT di x(n) con il metodo diretto, sappiamo che ci servono N2 moltiplicazioni; se, N N invece, applichiamo uno qualsiasi degli algoritmi FFT, sappiamo che ci servono N TOT = log 2 2 2 moltiplicazioni. Vediamo allora se possiamo ulteriormente ridurre il numero di moltiplicazioni. Se y(n) e z(n) sono reali, possiamo creare una nuova sequenza, questa volta complessa, nel modo seguente: c(n ) = y(n ) + jz (n ) La lunghezza di questa sequenza è ancora N/2. La sua DFT, applicando la proprietà di linearità della DFT, è C(k ) = Y(k ) + jZ(k ) Abbiamo due modi di calcolare questa C(k): • il primo è quello di calcolare prima Y(k) e Z(k) e quindi risalire a C(k), ma questo non aggiunge niente ai discorsi che stiamo facendo; • il secondo modo è invece quello di calcolare direttamente la DFT della sequenza c(n). Questo secondo modo ci interessa molto di più: infatti, se trovassimo conveniente il calcolo diretto della DFT della sequenza c(n), potremmo sfruttare tale calcolo per risalire successivamente a Y(k) e Z(k), che sono le DFT di nostro interesse. Dobbiamo dunque chiederci, prima di ogni altra cosa, se, nota C(k), è possibile risalire a Y(k) e Z(k), ossia, in altre parole, se la trasformazione C(k ) = Y(k ) + jZ(k ) è invertibile. Il dato certo, da cui possiamo partire, è che Y(k) e Z(k) sono DFT di sequenze reali, il che significa che godono della simmetria hilbertiana: in formule, abbiamo dunque che N Y − k = Y * (k ) 2 N Z − k = Z* (k ) 2 Si tenga conto che le due sequenza Y(k) e Z(k) sono di lunghezza N/2, per cui l’ultimo campione, per entrambe, è quello di posizione N/2 e non quello di posizione N. Adesso, se moltiplichiamo la seconda relazione per j e sommiamo membro a membro con la prima relazione, otteniamo N N Y − k + jZ − k = Y * (k ) + jZ * (k ) 2 2 La quantità a primo membro è evidentemente C(N/2-k), per cui scriviamo che N C − k = Y * (k ) + jZ * (k ) 2 Se adesso calcoliamo il complesso coniugato di ambo i membri, otteniamo evidentemente che [ ] * N C* − k = Y * (k ) + jZ * (k ) = Y(k ) − jZ(k ) 2 Autore: Sandro Petrizzelli 20 Trasformata di Fourier discreta (parte III) A questo punto, il gioco è fatto, in quanto possiamo combinare questa relazione con l’equazione C(k ) = Y(k ) + jZ(k ) : semplici passaggi algebrici ci danno che N C(k ) + C * − k 2 Y( k ) = 2 N C( k ) − C * − k 2 Z( k ) = 2j Abbiamo dunque trovato ciò che volevamo, ossia la possibilità di risalire ad Y(k) e Z(k) a partire da C(k). Resta da vedere se questo modo di procedere sia conveniente. Ci basta applicare quanto detto in precedenza: calcolando la DFT di C(k), che è di lunghezza N/2, abbiamo bisogno di un numero di moltiplicazioni pari a M TOT = N N log 2 4 4 Confrontando con il numero Ntot di moltiplicazioni necessarie per la FFT direttamente di x(n), abbiamo guadagno più di un fattore 2. In realtà, però, dobbiamo considerare che, nota C(k), dobbiamo risalire prima a Y(k) e Z(k) e poi, tramite altre N/2 moltiplicazioni (per i coefficienti di peso), possiamo finalmente avere X(k). Quindi, otteniamo un guadagno che è approssimativamente 2 rispetto agli algoritmi FFT. In pratica, quindi, sfruttando il fatto che x(n) è una sequenza reale (di lunghezza N) e che gli algoritmi FFT sono ottimizzati per sequenze complesse, abbiamo trovato il modo di dimezzare (approssimativamente) il numero di moltiplicazioni, rispetto a quelle richieste dalla FFT di x(n), applicando la stessa FFT ad una sequenza complessa c(n) di lunghezza N/2. Osservazione: FFT con decimazione nei tempi per una sequenza x(n) reale Il discorso appena fatto può essere ripetuto ugualmente anche per l’algoritmo FFT con decimazione nei tempi. Vediamo come si sviluppa. Mettiamoci dunque nell’ipotesi che la sequenza x(n) di partenza sia reale. Scomponiamola nella somma di due sequenze, una costruita con gli x(n) di posizione pari e l’altra con gli x(n) di posizione dispari: indichiamo tali due sottosequenze rispettivamente con xp(n) e xd(n). Possiamo adesso costruire una nuova sequenza y(n), questa volta complessa, nel modo seguente: g(n ) = x p (n ) + jx d (n ) Abbiamo cioè costruito una sequenza compessa dove la parte reale è costituita dagli x(n) in posizione pari e il coefficiente della parte immaginaria è costituito dagli x(n) di posizione dispari. Applicando la linearità della DFT, possiamo sicuramente scrivere che G (k ) = X P (k ) + jX D (k ) Anche qui ha senso chiedersi se possiamo calcolare contemporaneamente le sequenze XP (k) e XD(k), sfruttando la conoscenza di G(k). In effetti, la risposta è affermativa, in quanto possiamo 21 Autore: Sandro Petrizzelli Appunti di “Elaborazione numerica dei segnali” - Capitolo 2 procedere esattamente come nel caso della decimazione in frequenza. Mentre lì abbiamo considerato la trasformazione C(k ) = Y(k ) + jZ(k ) , dove y(n) era la sequenza dei primi N/2 campioni e z(n) quella dei successivi campioni, adesso stiamo sostituendo xp(n) a y(n) e xd(n) a z(n), ma il ragionamento è identico. Ovviamente, in questo caso, una volta calcolata G(k) ed essendo quindi risaliti a XP (k) e XD(k), dobbiamo considerare che X(k ) = X P (k ) + WN− k X D (k ) Osservazione: algoritmi di decimazioni per sequenze di lunghezza qualsiasi Sia l’algoritmo con decimazione nel tempo sia quello con decimazione nelle frequenze sono stati applicati, nei paragrafi precedenti, solo a sequenze x(n) la cui lunghezza fosse una potenza di 2: N=2m. In realtà, è banale l’estensione di tali algoritmi a sequenze x(n) di lungheza generica. Consideriamo, per esempio, la decimazione nel tempo. Supponiamo che x(n) sia lunga una potenza di 3: N=3m. In questo caso, ci basta effettuare la decimazione non più in base 2, ma in base 3. Ciò significa costruire, a partire da x(n), tre nuove sequenze y(n), z(n) e w(n), secondo il seguente schema: sequenza x(n) sequenza y(n) sequenza z(n) sequenza w(n) Ciascuna sequenza è in pratica ottenuta prendendo un campione ogni 3: • y(n) si ottiene considerando i campioni x(n) a partire da n=0: y( n ) ← → x (0), x (3), x (6), x (9), x (12),... • z(n) si ottiene considerando i campioni x(n) a partire da n=1: z( n ) ← → x (1), x (4), x (7), x (10), x (13),... • w(n) si ottiene considerando i campioni x(n) a partire da n=2: w (n ) ← → x (2), x (5), x (8), x (11), x (14),... Autore: Sandro Petrizzelli 22 Trasformata di Fourier discreta (parte III) In generale, possiamo dunque scrivere che y(n ) = x (3n ) z(n ) = x (3n + 1) w (n ) = x (3n + 2) Vediamo allora come possono essere utilizzate queste sequenze: partendo dalla definizione della DFT della sequenza x(n), abbiamo che N −1 N / 3−1 N / 3−1 N / 3−1 n =0 i =0 i =0 i=0 X(k ) = ∑ x (n ) WN− nk = = ∑ x (3i)WN−3ki + ∑ x (3i + 1)WN−k (3i+1) + N / 3−1 N / 3−1 N / 3−1 i =0 i =0 i =0 ∑ y(i)WN−3ki + ∑ z(i) WN−k (3i+1) + ∑ x(3i + 2)W − k ( 3i + 2 ) N = ∑ w (i) W − k ( 3i + 2 ) N Ripetendo discorsi analoghi a quelli già visti, abbiamo evidentemente che X( k ) = N / 3−1 N / 3−1 N / 3−1 i =0 i =0 i =0 = ∑ y(i)WN−3ki + N / 3−1 ∑ y(i) W − 3 ki N ∑ z(i) WN−k (3i+1) + + WN−k i =0 = N / 3−1 ∑ y(i) W i =0 − ki N/3 N / 3−1 ∑ z (i ) W ∑ w (i) W − k 3i N + WN−2 k i =0 + WN− k N / 3−1 ∑ z ( i) W i =0 − ki N/3 − k ( 3i + 2 ) N = N / 3−1 ∑ w (i) W − k 3i N = i =0 + WN−2 k N / 3−1 ∑ w (i) W − ki N/3 = Y (k ) + WN−k Z(k ) + WN−2 k W (k ) i =0 Ci siamo così ricondotti al calcolo di 3 DFT, ciascuna di lunguezza N/3, che vanno poi combinate opportunamente. E’ ovvio che il discorso può essere ripetuto ugualmente quando la lunghezza N della sequenza x(n) di partenza è una potenza di qualsiasi base: in generale, se risulta N=Mm, la decimazione andrà fatta a passo M e ci si ricondurrà al calcolo di M DFT, ciascuna di lunghezza N/M. Autore: SANDRO PETRIZZELLI e-mail: [email protected] sito personale: http://users.iol.it/sandry succursale: http://digilander.iol.it/sandry1 23 Autore: Sandro Petrizzelli