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