FFT Realização Eficiente da DFT Luís Caldas de Oliveira lco@istutlpt Instituto Superior Técnico FFT p1/40
Resumo Algoritmos de Decimação no Tempo FFT p2/40
Resumo Algoritmos de Decimação no Tempo Algoritmos de Decimação na Frequência FFT p2/40
Resumo Algoritmos de Decimação no Tempo Algoritmos de Decimação na Frequência Realização dos Algoritmos FFT FFT p2/40
Resumo Algoritmos de Decimação no Tempo Algoritmos de Decimação na Frequência Realização dos Algoritmos FFT Algoritmos para N Factorizável FFT p2/40
Resumo Algoritmos de Decimação no Tempo Algoritmos de Decimação na Frequência Realização dos Algoritmos FFT Algoritmos para N Factorizável Realização da DFT Usando a Convolução FFT p2/40
Objectivo Problema: precisamos de reduzir o número de operações matemáticas necessárias para o cálculo da DFT FFT p3/40
Objectivo Problema: precisamos de reduzir o número de operações matemáticas necessárias para o cálculo da DFT Solução: vamos diminuir o número de operações, calculando DFTs de menor ordem e combinando os seus coeficientes FFT p3/40
Complexidade Computacional da DFT Medida de complexidade computacional utilizada: número de multiplicações e somas X(k) = N n=0 x(n)e j 2π N kn, 0 k N 1 N 2 multiplicações complexas; FFT p4/40
Complexidade Computacional da DFT Medida de complexidade computacional utilizada: número de multiplicações e somas X(k) = N n=0 x(n)e j 2π N kn, 0 k N 1 N 2 multiplicações complexas; N(N 1) somas complexas; FFT p4/40
Complexidade Computacional da DFT Medida de complexidade computacional utilizada: número de multiplicações e somas X(k) = N n=0 x(n)e j 2π N kn, 0 k N 1 N 2 multiplicações complexas; N(N 1) somas complexas; aproximadamente 2N 2 operações complexas; FFT p4/40
Complexidade Computacional da DFT Medida de complexidade computacional utilizada: número de multiplicações e somas X(k) = N n=0 x(n)e j 2π N kn, 0 k N 1 N 2 multiplicações complexas; N(N 1) somas complexas; aproximadamente 2N 2 operações complexas; aproximadamente 8N 2 operações reais; FFT p4/40
Complexidade Computacional da DFT Medida de complexidade computacional utilizada: número de multiplicações e somas X(k) = N n=0 x(n)e j 2π N kn, 0 k N 1 N 2 multiplicações complexas; N(N 1) somas complexas; aproximadamente 2N 2 operações complexas; aproximadamente 8N 2 operações reais; requer N registos complexos FFT p4/40
Decimação no Tempo X(k) = N n=0 = n par x(n)e j 2π N kn, 0 k N 1 + n ímpar = N 2 r=0 2π j x(2r)e N/2 kr + e j 2π N k = G(k) + e j 2π N k H(k) N 2 r=0 2π j x(2r + 1)e N/2 kn FFT p5/40
Decimação no Tempo X(k) = N n=0 = n par x(n)e j 2π N kn, 0 k N 1 + n ímpar = N 2 r=0 2π j x(2r)e N/2 kr + e j 2π N k = G(k) + e j 2π N k H(k) N 2 r=0 2π j x(2r + 1)e N/2 kn G(k) e H(k) têm período N/2 FFT p5/40
Decomposição da DFT x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) DFT de N/2 pontos DFT de N/2 pontos G(0) G(1) G(2) G(3) H(0) H(1) H(2) H(3) 0 1 2 3 4 5 6 7 X(0) X(1) X(2) X(3) X(4) X(5) X(6) X(7) k j 2π N = e k FFT p6/40
Decomposição da DFT x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) DFT de N/2 pontos DFT de N/2 pontos G(0) G(1) G(2) G(3) H(0) H(1) H(2) H(3) 0 1 2 3 4 5 6 7 X(0) X(1) X(2) X(3) X(4) X(5) X(6) X(7) k j 2π N = e Número de multiplicações complexas: N + 2( N 2 )2 k FFT p6/40
Decomposição da DFT x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) DFT de N/4 DFT de N/4 DFT de N/4 DFT de N/4 0 2 4 6 0 2 4 6 0 1 2 3 4 5 6 7 X(0) X(1) X(2) X(3) X(4) X(5) X(6) X(7) k j 2π = e N k FFT p7/40
Decomposição da DFT x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) DFT de N/4 DFT de N/4 DFT de N/4 DFT de N/4 0 2 4 6 0 2 4 6 0 1 2 3 4 5 6 7 X(0) X(1) X(2) X(3) X(4) X(5) X(6) X(7) k j 2π = e N k Número de multiplicações complexas: N + N + 4( N 4 )2 FFT p7/40
DFT de 2 Pontos A decomposição da DFT prossegue até se chegar a DFTs de 2 pontos: x(0) x(1) 1 X(0) X(1) FFT p8/40
DFT de 2 Pontos A decomposição da DFT prossegue até se chegar a DFTs de 2 pontos: x(0) x(1) X(0) X(1) Número de multiplicações complexas da FFT é de N log 2 N 1 FFT p8/40
Diagrama de Fluxo da FFT x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) 4 4 4 4 0 0 0 0 0 2 4 6 0 2 4 6 0 1 2 3 4 5 6 7 X(0) X(1) X(2) X(3) X(4) X(5) X(6) X(7) k = j 2π k e 8 FFT p9/40
Redução Adicional dos Cálculos Cada borboleta tem a forma geral: X (q) m 2π j r e N X (q) m X (q) m j 2π N (r + N 2 ) e X (q) m e j 2π N (r+ N 2 ) = e jπ e j 2π N r = e j 2π N r X (p) m 1 X (p) m X (q) m 2π j r e N X (q) m FFT p10/40
Redução Adicional dos Cálculos Cada borboleta tem a forma geral: X (q) m 2π j r e N X (q) m X (q) m j 2π N (r + N 2 ) e X (q) m e j 2π N (r+ N 2 ) = e jπ e j 2π N r = e j 2π N r X (p) m 1 X (p) m X (q) X (q) m 2π m j r e N Número de multiplicações: N 2 log 2 N FFT p10/40
Diagrama de Fluxo da FFT de Ordem 8 com Decimação no Tempo x(0) 1 1 1 X(0) x(4) 1 1 X(1) x(2) 1 0 1 X(2) x(6) 2 1 X(3) x(1) 1 1 0 X(4) x(5) 1 1 X(5) x(3) 1 0 2 X(6) x(7) 2 3 X(7) k = j 2π k e 8 FFT p11/40
Realização In-Place Utiliza-se um conjunto de N registos complexos Os registos são inicializados com as amostras temporais re-ordenadas: X 0 (0) = x(0) X 0 (1) = x(4) X 0 (2) = x(2) Os registos são actualizados pela seguinte recursão: { X m (p) = X m (p) + e j 2π N r X m (q) X m (q) = X m (p) e j 2π N r X m (q) FFT p12/40
Ordenação Bit-Reversed O re-ordenamento da sequência de entrada da FFT com decimação no tempo é realizada na ordem: X 0 (0 10 ) = X 0 (000 2 ) = x(000 2 ) = x(0 10 ) X 0 (1 10 ) = X 0 (001 2 ) = x(100 2 ) = x(4 10 ) X 0 (2 10 ) = X 0 (010 2 ) = x(010 2 ) = x(2 10 ) X 0 (3 10 ) = X 0 (011 2 ) = x(110 2 ) = x(6 10 ) X 0 (4 10 ) = X 0 (100 2 ) = x(001 2 ) = x(1 10 ) X 0 (5 10 ) = X 0 (101 2 ) = x(101 2 ) = x(5 10 ) X 0 (6 10 ) = X 0 (110 2 ) = x(011 2 ) = x(3 10 ) X 0 (7 10 ) = X 0 (111 2 ) = x(111 2 ) = x(7 10 ) FFT p13/40
Decimação na Frequência - Amostras Pares X(k) = Amostras pares: N n=0 x(n)e j 2π N kn, 0 k N 1 X(2r) = = = N n=0 N 2 x(n)e j 2π N n2r [x(n) + x(n + N 2 n=0 N 2 n=0 2π j g(n)e N/2 nr )]e j 2π N/2 nr FFT p14/40
Decimação na Frequência - Amostras Ímpares X(k) = Amostras ímpares: N n=0 x(n)e j 2π N kn, 0 k N 1 X(2r + 1) = = = N n=0 N 2 x(n)e j 2π N n(2r+1) [x(n) x(n + N 2π 2 )]e j N n e n=0 N 2 n=0 h(n)e j 2π N n 2π j e N/2 n 2π j N/2 n FFT p15/40
Decomposição da DFT por Decimação na Frequência x(0) g(0) X(0) x(1) x(2) g(1) g(2) DFT de N/2 pontos X(4) X(2) x(3) g(3) X(6) x(4) x(5) x(6) x(7) h(0) 0 h(1) 1 h(2) 2 h(3) 3 DFT de N/2 pontos X(1) X(5) X(3) X(7) k j 2π k = e 8 FFT p16/40
Diagrama de Fluxo de FFT com Decimação na Frequência x(0) X(0) x(1) X(4) x(2) 0 X(2) x(3) 2 X(6) x(4) 0 X(1) x(5) 1 X(5) x(6) 2 0 X(3) x(7) 3 2 X(7) k = j 2π k e 8 FFT p17/40
Realização In-Place X (p) m 1 X (p) m X (q) m j 2π r e N X (q) m { Xm (p) = X m (p) + X m (q) X m (q) = (X m (p) X m (q))e j 2π N r FFT p18/40
Transformação Inversa A realização directa da FFT pode ser usada para calcular a DFT inversa de uma sequência Sendo g(n) a DFT de uma sequência X(k): g(n) = N k=0 X(k)e j 2π N kn Pode-se obter a transformada inversa de X(k) por: x(n) = 1 N = 1 N N k=0 N k=0 X(k)e j 2π N kn X(k)e j 2π N k(n n) = 1 N g (((N n)) N) FFT p19/40
Optimização para Sequências Reais Pode-se calcular a DFT de N pontos de uma sequência real x(n) usando uma FFT de N/2 pontos: 1 Formar uma sequência g(n) = x(2n) + jx(2n + 1), para 0 n N 2 1 2 Calcular G(k) a FFT de N/2 pontos de g(n) 3 Determinar (0 k N 2 1): X 1 (k) = 1 2»» G R (k) + G R ((( N» 2 k)) N ) + j G I (k) G I ((( N 2 2 k)) N ) 2 X 2 (k) = e j 2π N k 2»» G I (k) + G I ((( N» 2 k)) N ) j G R (k) G R ((( N 2 2 k)) N ) 2 4 Finalmente: X(k) = 8 >< X 1 (k) + X 2 (k) 0 k N 2 1 X 1 (k N 2 >: ) X 2(k N 2 ) N 2 k N 1 0 no caso contrário FFT p20/40
Realização da FFT na Linguagem C A linguagem C não dispõe nem de estruturas de dados nem de operadores aritméticos para números complexos A realização apresentada tem fins didácticos: o algoritmo foi dividido em funções para melhor legibilidade; não se utilizam tabelas com valores pré-calculados A realização poderia ser mais eficiente expandindo as funções e pré-calculando os factores multiplicativos FFT p21/40
Números Complexos Definição das funções matemáticas e da estrutura de dados para armazenamento de números complexos: #include <mathh> struct Complex { double re; double im; }; FFT p22/40
Operações Básicas com Números Complexos struct Complex Csoma(struct Complex z1, struct Complex z2) { z1re += z2re; z1im += z2im; return z1; } struct Complex Csub(struct Complex z1, struct Complex z2) { z1re -= z2re; z1im -= z2im; return z1; } struct Complex Cmul(struct Complex z1, struct Complex z2) { struct Complex z3; z3re = z1re * z2re - z1im * z2im; z3im = z1re * z2im + z1im * z2re; return z3; } FFT p23/40
Troca de Conteúdos de Posições de Memória void Ctroca(struct Complex *z1, struct Complex *z2) { struct Complex tmp; tmp = *z1; *z1 = *z2; *z2 = tmp; } FFT p24/40
Realização da Re-ordenação /* 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]); FFT p25/40
Cálculos dos Factores Multiplicativos static int Log2N; static struct Complex Wr[20]; /* Calcula a tabela de factores multiplicativos */ void factores(int N) { double arg = 15707963; /* 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); } FFT p26/40
Realização das DFTs de 2 Pontos X (p) m 1 X (p) m X (p+1) m 1 X (p+1) m /* 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 ); } } FFT p27/40
Realização das Borboletas X (p) m 1 X (p) m X (q) m j 2π r N e X (q) m FFT p28/40
Realização das Borboletas /* 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; } } FFT p29/40
Realização 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); FFT p30/40
Algoritmos Cooley-Tukey (N Factorizável) N = N 1 N 2 Conceito de mapas de índices n = N 2 n 1 + n 2 { 0 n1 N 1 1 0 n 2 N 2 1 k = k 1 + N 1 k 2 { 0 k1 N 1 1 0 k 2 N 2 1 FFT p31/40
Algoritmos Cooley-Tukey (N Factorizável) N = N 1 N 2 Conceito de mapas de índices n = N 2 n 1 + n 2 { 0 n1 N 1 1 0 n 2 N 2 1 k = k 1 + N 1 k 2 { 0 k1 N 1 1 0 k 2 N 2 1 n e k tomam todos os valores entre 0 e N 1 FFT p31/40
Decomposição da DFT X(k 1 + N 1 k 2 ) = N 2 N 1 x(n 2 n 1 + n 2 )e j 2π N (k 1+N 1 k 2 )(N 2 n 1 +n 2 ) n 2 =0 n 1 =0 X(k 1 + N 1 k 2 ) = N 2 n 2 =0 2π j k N G(n 2, k 1 )e 2 n 2 2 G(n 2, k 1 ) = G(n 2, k 1 )e j 2π N k 1n 2 G(n 2, k 1 ) = N 1 n 1 =0 2π j k N x(n 2 n 1 + n 2 )e 1 n 1 1 FFT p32/40
Casos Particulares Decimação no tempo: Decimação na frequência: n = N 2 n 1 + n 2 k = k 1 + N 1 k 2 N 1 = N/2 N 2 = 2 N 1 = 2 N 2 = N/2 FFT p33/40
Caso Geral Algoritmos de base R: N = N 1 N 2 N v N = R v Se a entrada estiver ordenada normalmente a saída ficará ordenada pela inversão dos dígitos do índice na base R Exemplo: N = 2 v { n = 2 v n 1 + + 2n v + n v k = k 1 + 2k 2 + + 2 v k v A decomposição é efectuada em factores diferentes Algoritmos mistos: FFT p34/40
Algoritmo da Transformada Chirp (CTA) O algoritmo CTA permite determinar qualquer conjunto de M amostras da FT equi-espaçadas no círculo unitário ω k = ω 0 + k ω, 0 k M 1 X(e jω k ) = N n=0 x(n)e jω 0n e j ωkn FFT p35/40
Algoritmo CTA Usando a Convolução X(e jω k ) = N n=0 x(n)e jω 0n e j ωkn A equação pode ser representada na forma de uma convolução: X(e jω n2 n j ω ) = e 2 [g(n) e j ω n2 2 ] g(n) = x(n)e jω0n n2 j ω e 2 FFT p36/40
Diagrama da CTA x(n) g(n) h(n) y(n) m (n) 1 2 m (n) m 1 (n) = e jω0n n2 j ω e 2 h(n) = n2 j ω {e 2 (N 1) n M 1 0 caso contrário n2 j ω m 2 (n) = e 2 X(e jω n ) = y(n) FFT p37/40
Diagrama da CTA x(n) g(n) h(n) y(n) m (n) 1 2 m (n) m 1 (n) = e jω0n n2 j ω e 2 h(n) = n2 j ω {e 2 (N 1) n M 1 0 caso contrário n2 j ω m 2 (n) = e 2 X(e jω n ) = y(n) h(n) é não causal e tem comprimento N + M 1 FFT p37/40
Vantagens da CTA não é necessário que N = M; N e M não precisam de ser factorizáveis; ω 0 é arbitrário FFT p38/40
Realização Causal x(n) g(n) h(n) y(n) m (n) 1 2 m (n) m 1 (n) = e jω0n n2 j ω e 2 h(n) = { e j ω(n N+1) 2 /2 0 n N + M 2 0 caso contrário m 2 (n) = e j ω(n N+1)2 /2 X(e jω n ) = y(n + N 1) FFT p39/40
Cálculo da DFT Usando a CTA ω 0 = 0 e ω = 2π N Neste caso: x(n) g(n) h(n) y(n) m (n) 1 2 m (n) m 1 (n) = e j 2π N { h(n) = m 2 (n) = e j 2π N n 2 2 e j 2π n 2 N 2 1 n N + M 1 0 caso contrário n 2 2 X(e j 2π N n ) = y(n + N) FFT p40/40