FFT – Realizac¸ ˜ao Eficiente da DFT
Lu´ıs Caldas de Oliveira1. Algoritmos de Decimac¸ ˜ao no Tempo
2. Algoritmos de Decimac¸ ˜ao na Frequ ˆencia
3. Realizac¸ ˜ao dos Algoritmos FFT
4. Algoritmos para N Factoriz ´avel
5. Realizac¸ ˜ao da DFT Usando a Convoluc¸ ˜ao
Complexidade Computacional da DFT
Medida de complexidade computacional utilizada: n ´umero de multiplicac¸ ˜oes e so-mas.
multiplicac¸ ˜oes complexas;
somas complexas; aproximadamente
operac¸ ˜oes complexas;
aproximadamente
!
operac¸ ˜oes reais;
requer
registos complexos.
Lu´ıs Caldas de Oliveira 2
Decimac¸ ˜ao no Tempo
" # n par $$$ % n ´ımpar $$$ & ' ( & % # & ' % ( ) % # * ) e * t ˆem per´ıodo + .
Decomposic¸ ˜ao da DFT
3 2 1 −j2π N e = k k X(0) X(1) X(2) X(3) X(4) X(5) x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) X(7) X(6) 0 4 5 6 7 G(0) H(0) H(3) H(2) H(1) G(3) G(2) G(1)DFT de N/2 pontos
DFT de N/2 pontos
O n ´umero de multiplicac¸ ˜oes complexas diminui para
%
Decomposic¸ ˜ao da DFT
0 2 4 6 0 2 4 6 3 2 1 −j2Nπ e X(0) X(1) X(2) X(3) X(4) X(5) x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) X(7) X(6) = 0 4 5 6 7 k k DFT de N/4 DFT de N/4 DFT de N/4 DFT de N/4O n ´umero de multiplicac¸ ˜oes complexas diminui para
% %
Lu´ıs Caldas de Oliveira 5
DFT de 2 Pontos
A decomposic¸ ˜ao da DFT prossegue at ´e se chegar a DFTs de 2 pontos:
x(0)
X(0)
X(1)
x(1)
1
−1
No total o n ´umero de multiplicac¸ ˜oes complexas da FFT ´e de
Lu´ıs Caldas de Oliveira 6
FFT
0 4 0 4 0 4 0 2 4 6 0 2 4 6 3 2 1 X(0) X(1) X(2) X(3) X(4) X(5) x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) X(7) X(6) = k 0 4 0 4 5 6 7 k −j2π e 8Reduc¸ ˜ao Adicional dos C ´alculos
Cada borboleta tem a forma geral:
−j r2π N e 2π N e −j (r + )N 2 X (q) X (q) m m−1 m−1 m X (q) X (q) & & & −j r2π N e X (q) m m−1 m−1 m X (q) −1 1 X (p) X (p)
O n ´umero de multiplicac¸ ˜oes reduz-se para
FFT de 8 Pontos com Decimac¸ ˜ao no Tempo
2 2 2 3 0 0 1 0 X(0) X(1) X(2) X(3) X(4) X(5) x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) X(7) X(6) = k −j k 2π e 8 1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 1 1 1 1 1 1 1 1 1 1 1Lu´ıs Caldas de Oliveira 9
Realizac¸ ˜ao In-Place
Utiliza-se um conjunto de registos complexos. Os registos s ˜ao inicializados com
as amostras temporais re-ordenadas:
...
Os registos s ˜ao actualizados pela seguinte recurs ˜ao:
% & &
Lu´ıs Caldas de Oliveira 10
Ordenac¸ ˜ao Bit-Reversed
O re-ordenamento da sequ ˆencia de entrada da FFT com decimac¸ ˜ao no tempo ´e realizada na ordem:
Decimac¸ ˜ao na Frequ ˆencia - Amostras Pares
# Amostras pares: ' " & % % ( & ( &
Decimac¸ ˜ao na Frequ ˆencia - Amostras ´Impares
# Amostras ´ımpares: ' % & % ( (Lu´ıs Caldas de Oliveira 13
Decomposic¸ ˜ao da DFT por Decimac¸ ˜ao na Frequ ˆencia
0 1 2 3 X(0) X(2) x(0) x(2) x(5) x(7) X(7) = k −j k 2π e 8 −1 −1 −1 −1 x(1) x(3) x(4) x(6) X(4) X(6) X(1) X(5) X(3) g(1) g(2) g(3) h(0) h(1) h(2) h(3) g(0) DFT de N/2 pontos DFT de N/2 pontos
Lu´ıs Caldas de Oliveira 14
FFT de 8 Pontos com Decimac¸ ˜ao na Frequ ˆencia
0 1 2 3 0 0 2 2 X(0) X(2) x(0) x(2) x(5) x(7) X(7) k −j2π −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 x(1) x(3) x(4) x(6) X(4) X(6) X(1) X(5) X(3)
Realizac¸ ˜ao In-Place
−j r2π N
e
−1 1 X (q) m m−1 m−1 m X (q) X (p) X (p) % # &FFT Inversa
A realizac¸ ˜ao directa da FFT pode ser usada para calcular a DFT inversa de uma sequ ˆencia.
Sendo
a DFT de uma sequ ˆencia X(k):
Pode-se obter a transformada inversa de X(k) por:
Lu´ıs Caldas de Oliveira 17
FFT de Sequ ˆencias Reais
Pode-se calcular a DFT de N pontos de uma sequ ˆencia real
usando uma FFT
de
+ pontos:
1. Formar uma sequ ˆencia
, para 2. Calcular a FFT de pontos de 3. Determinar ( ): 4. Finalmente:
no caso contr ´ario
Lu´ıs Caldas de Oliveira 18
Realizac¸ ˜ao da FFT na Linguagem C
A linguagem C n ˜ao disp ˜oe nem de estruturas de dados nem de operadores
aritm ´eticos para n ´umeros complexos.
A realizac¸ ˜ao apresentada tem fins did ´acticos:
– o algoritmo foi dividido em func¸ ˜oes para melhor legibilidade;
– n ˜ao se utilizam tabelas com valores pr ´e-calculados.
A realizac¸ ˜ao poderia ser mais eficiente expandindo as func¸ ˜oes e pr ´e-calculando os factores multiplicativos.
N ´
umeros Complexos
Definic¸ ˜ao das func¸ ˜oes matem ´aticas e da estrutura de dados para armazenamento de n ´umeros complexos: #include <math.h> struct Complex { double re; double im; };
Operac¸ ˜
oes B ´asicas com N ´
umeros Complexos
struct Complex Csoma(struct Complex z1, struct Complex z2) { z1.re += z2.re;
z1.im += z2.im; return z1; }
struct Complex Csub(struct Complex z1, struct Complex z2) { z1.re -= z2.re;
z1.im -= z2.im; return z1; }
struct Complex Cmul(struct Complex z1, struct Complex z2) { struct Complex z3;
z3.re = z1.re * z2.re - z1.im * z2.im; z3.im = z1.re * z2.im + z1.im * z2.re; return z3;
}
Lu´ıs Caldas de Oliveira 21
Realizac¸ ˜ao da Re-ordenac¸ ˜ao
void Ctroca(struct Complex *z1, struct Complex *z2) { struct Complex tmp; tmp = *z1; *z1 = *z2; *z2 = tmp; } /* re-ordenacao da entrada */
void reord(int N, struct Complex X[]) { int dir, inv, pot2;
inv = 0;
for (dir = 1; dir < N; dir++) {
/* incrementa contador de ordem inversa dos bits */ for (pot2 = N/2; pot2 <= inv; pot2 /= 2)
inv -= pot2; inv += pot2; if (dir < inv) Ctroca(&X[dir], &X[inv]); } }
Lu´ıs Caldas de Oliveira 22
C ´alculos dos Factores Multiplicativos
static int Log2N;
static struct Complex Wr[20];
/* Calcula a tabela de factores multiplicativos */ void factores(int N) {
double arg = 1.5707963; /* pi/2 */ int m; Log2N = (int)(log(N+.1)/log(2.)); Wr[0].re = 1; Wr[0].im = 0; Wr[1].re = 0; Wr[1].im = -1; for (m = 2; m < Log2N; m++) { arg /= 2.;
Wr[m].re = (double) cos(arg); Wr[m].im = (double) -sin(arg); }
}
Realizac¸ ˜ao das DFTs de 2 Pontos
m m−1 m−1 m −1 1 1 X (p+1) X (p+1) X (p) X (p)
/* primeiro passo (m=1): DFTs de 2 pontos */ void dft2(int N, struct Complex X[]) {
int p = 0; struct Complex tmp; /* q = p + 1 * Xm(p) = Xm-1(p) + Xm-1(q) * Xm(q) = Xm-1(p) - Xm-1(q) */ for (p = 0; p < N; p+=2) { tmp = X[p+1]; X[p+1] = Csub( X[p], tmp ); X[p] = Csoma( X[p], tmp ); } }
Realizac¸ ˜ao das Borboletas
−j r2Nπ e X (q) m m−1 m−1 m X (q) −1 1 X (p) X (p) /* borboletas de m=2 a log2(N) */void borbol(int N, struct Complex X[]) { struct Complex tmp, Wm;
int m, j, p, potm2 = 2, potm22 = 4;
for (m = 2; m <= Log2N; m++) { Wm = Wr[0];
for (j = 0; j < potm2; j++) { /* potm2 = 2ˆ(m-1) */ for (p = j; p < N; p += potm22) { /* potm2 = 2ˆm */
tmp = Cmul( X[p+potm2], Wm ); X[p+potm2] = Csub( X[p], tmp ); X[p] = Csoma( X[p], tmp ); } Wm = Cmul( Wm, Wr[m-1] ); } potm2 = potm22; potm22 *= 2; } }
Lu´ıs Caldas de Oliveira 25
Realizac¸ ˜ao da FFT
/* algoritmo fft de N pontos com decimacao no tempo */ void fft(int N, struct Complex X[]) {
static int Nanterior = 0;
reord(N, X); if (N != Nanterior) { Nanterior = N; factores(N); } dft2(N, X); borbol(N, X); }
Lu´ıs Caldas de Oliveira 26
Algoritmos Cooley-Tukey (N Factoriz ´avel)
Conceito de mapas de ´ındices
% %
e tomam todos os valores entre 0 e
sem repetic¸ ˜oes.
Decomposic¸ ˜ao da DFT
% % # % ) ) ) ) %Casos Particulares
% %Decimac¸ ˜ao no tempo:
+
Decimac¸ ˜ao na frequ ˆencia:
+
Lu´ıs Caldas de Oliveira 29
Caso Geral
$$ $ Algoritmos de base :Se a entrada estiver ordenada normalmente a sa´ıda ficar ´a ordenada pela
in-vers ˜ao dos d´ıgitos do ´ındice na base .
Exemplo: % $ $$ % % % % $ $ $ %
Algoritmos mistos: A decomposic¸ ˜ao ´e efectuada em factores diferentes.
Lu´ıs Caldas de Oliveira 30
Algoritmo da Transformada Chirp (CTA)
O algoritmo CTA permite determinar qualquer conjunto de amostras da FT
equi-espac¸adas no c´ırculo unit ´ario.
%
Este algoritmo pode ser realizado usando a convoluc¸ ˜ao:
Diagrama da CTA
x(n) h(n) y(n) m (n) g(n) m (n) 1 2caso contr ´ario
´e n ˜ao causal e tem comprimento
Vantagens da CTA
n ˜ao ´e necess ´ario que
;
e
n ˜ao precisam de ser factoriz ´aveis;
´e arbitr ´ario.
Lu´ıs Caldas de Oliveira 33
Realizac¸ ˜ao Causal
x(n) h(n) y(n) m (n) g(n) m (n) 1 2 %
caso contr ´ario
%
Lu´ıs Caldas de Oliveira 34
C ´alculo da DFT Usando a CTA
e Neste caso: x(n) h(n) y(n) m (n) g(n) m (n) 1 2 # %
caso contr ´ario
# %