Transformada Rápida de Fourier (FFT) A FFT é um algoritmo eficiente para calcular a DFT A DFT de uma sequência x n de comprimento finito N é definida como: N 1 N 1 X k = x n e j2π N kn = x n W N kn, 0 k N 1 n=0 n=0 A FFT mais eficiente é para N = 2 m, onde m é um inteiro Algoritmos mais utilizados: decimação no tempo e decimação na frequência
FFT com Decimação no Tempo Para ilustrar o método da FFT com decimação no tempo, consideramos N = 8 = 2 3. Decompondo a sequência x n em duas partes, uma com as amostras de n par (x 0 n = x(2n)) e outra com as amostras de n ímpar (x 1 n = x(2n + 1)) : X k = 7 x n W 8 kn n=0 = x 0 W 8 0k + x 2 W 8 2k + x 4 W 8 4k + x 6 W 8 6k +x 1 W 8 1k + x 3 W 8 3k + x 5 W 8 5k + x 7 W 8 7k onde W 8 = e j2π/8.
FFT com Decimação no Tempo Como W 8 2 = e j4π/8 = e j2π/4 = W 4, temos: X k = x 0 0 W 0k 4 + x 0 1 W k 4 + x 0 2 W 2k 3k 4 + x 0 3 W 4 +W k 8 x 1 0 W 0k 4 + x 1 1 W k 4 + x 1 2 W 2k 3k 4 + x 1 3 W 4 ou seja, onde X k = X 0 k 4 + W 8 k X 1 k 4 X 0 k : DFT de 4 pontos de x 0 n X 1 k : DFT de 4 pontos de x 1 n
FFT com Decimação no Tempo Generalizando para N = 2 m : N/2 1 N/2 1 X k = x 2l W N 2kl + x 2l + 1 W N k(2l+1) l=0 l=0 = X 0 k N/2 + W N k X 1 k N/2, 0 k N 1 Complexidade computacional: enquanto que o cálculo da DFT pela definição requer N 2 multiplicações complexas e N(N 1) somas complexas, pela equação acima temos: 2 N/2 2 + N = N 2 /2 + N multiplicações complexas 2 N/2 N/2 1 + N = N 2 /2 somas complexas
FFT com Decimação no Tempo Algoritmo FFT com decimação no tempo após primeiro estágio de decomposição:
FFT com Decimação no Tempo O procedimento da decimação no tempo pode ser repetido para as sucessivas DFTs menores, num total de m = log 2 N estágios, ou seja: N/4 1 N/4 1 X 0 k = x 0 2l W N/2 2kl + x 0 2l + 1 W N/2 k(2l+1) l=0 l=0 = X 00 k N/4 + W N/2 k X 01 k N/4, 0 k N/2 1 N/4 1 l=0 N/4 1 l=0 X 1 k = x 1 2l W N/2 2kl + x 1 2l + 1 W N/2 k(2l+1) = X 10 k N/4 + W N/2 k X 11 k N/4, 0 k N/2 1
FFT com Decimação no Tempo Algoritmo FFT com decimação no tempo após segundo estágio de decomposição:
FFT com Decimação no Tempo Diagrama completo do algoritmo FFT com decimação no tempo (m = log 2 N = 3 estágios):
FFT com Decimação no Tempo Complexidade computacional do algoritmo completo para N = 2 m : N log 2 N multiplicações complexas N log 2 N somas complexas A complexidade pode ser reduzida pela metade se explorarmos a seguinte propriedade do diagrama do algoritmo de decimação no tempo: Cada estágio é fomado por treliças (butterfly)
FFT com Decimação no Tempo Cada treliça pode ser simplificada para reduzir pela metade o número de multiplicações A complexidade computacional do algoritmo FFT com decimação no tempo para N = 2 m fica: (N/2) log 2 N multiplicações complexas N log 2 N somas complexas
FFT com Decimação no Tempo Algoritmo FFT com decimação no tempo com treliças simplificadas:
FFT com Decimação no Tempo Exemplo: A complexidade computacional para obter a DFT de N = 1024 pontos de uma sequência é: Pelo somatório da DFT: N 2 10 6 multiplicações e somas complexas Pelo algoritmo FFT: N log 2 2 N 5.10 3 multiplicações complexas e N log 2 N 10 4 somas complexas redução por um fator de 200 no número de multiplicações e 100 no número de somas
FFT com Decimação na Frequência No algoritmo da decimação na frequência, o somatório da DFT é separado em dois somatórios menores, da seguinte forma: N/2 1 N 1 X k = x n W N kn + x n W N kn n=0 n=n/2 N/2 1 = x n W N kn + W N kn/2 N/2 1 x n + N/2 W N kn n=0 n=0 N/2 1 = x n + W N kn/2 x n + N/2 W N kn n=0 k = 0,1,, N 1
FFT com Decimação na Frequência Observando que W N N/2 = e j(2π N )(N 2 ) = e jπ = 1: N/2 1 X k = x n + ( 1) k x n + N/2 W N kn n=0 Para k = 2r par: N/2 1 2rn X 2r = x n + x n + N/2 W N, r = 0,, N 2 1 n=0 Definindo x 0 n = x n + x n + N/2, n = 0,, N 2 1, temos N/2 1 rn X 2r = x 0 n W N/2 = X 0 r n=0
FFT com Decimação na Frequência Para k = 2r + 1 ímpar: N/2 1 X 2r + 1 = x n x n + N/2 W N (2r+1)n, r = 0,, N 2 1 n=0 Definindo x 1 n = x n x n + N/2 W N n, n = 0,, N 2 1, temos N/2 1 X 2r + 1 = x 1 n W N/2 rn = X 1 r n=0 O procedimento da decimação na frequência pode ser repetido para as sucessivas DFTs menores, num total de m = log 2 N estágios.
FFT com Decimação na Frequência Algoritmo FFT com decimação na frequência após primeiro estágio de decomposição:
FFT com Decimação na Frequência Diagrama completo do algoritmo FFT com decimação na frequência (m = log 2 N = 3 estágios):
FFT com Decimação na Frequência A complexidade computacional do algoritmo FFT com decimação na frequëncia para N = 2 m é igual à do algoritmo FFT com decimação no tempo: (N/2) log 2 N multiplicações complexas N log 2 N somas complexas
DFT Inversa utilizando o Algoritmo FFT A IDFT de tamanho N é definida como: x n = 1 N N 1 k=0 X k W N kn, 0 n N 1 O complexo conjugado da expressão acima é: x n = 1 N Portanto: x n = 1 N N 1 k=0 X k N 1 X k k=0 W N kn W N kn = 1 FFT X k N
DFT Inversa utilizando o Algoritmo FFT A IDFT pode ser calculada de forma eficiente usando um algoritmo FFT
Algoritmos FFT Radix-4 Os algoritmos FFT com decimação no tempo e na frequência para N = 2 m são os mais utilizados e conhecidos como algoritmos FFT Radix- 2 Quando N = 4 m, podemos utilizar algoritmos FFT Radix- 4 Para ilustrar o procedimento, derivamos o algoritmo FFT Radix- 4 com decimação na frequência
Algoritmos FFT Radix-4 Para k = 4r, r = 0,, N 4 1: N/4 1 X 4r = x n + x n + N/4 + x n + N/2 + x n + 3N/4 W N/4 rn n=0 Para k = 4r + 1, r = 0,, N 4 1: N/4 1 X 4r + 1 = x n jx n + N/4 x n + N/2 + jx n + 3N/4 W N n W N/4 rn n=0 Para k = 4r + 2, r = 0,, N 4 1: N/4 1 X 4r + 2 = x n x n + N/4 + x n + N/2 x n + 3N/4 W N 2n W N/4 rn n=0 Para k = 4r + 3, r = 0,, N 4 1: N/4 1 X 4r + 3 = x n + jx n + N/4 x n + N/2 + jx n + 3N/4 W N 3n W N/4 rn n=0
Algoritmos FFT Radix-4
Algoritmo FFT Mixed-Radix ou Cooley-Tukey Quando N 2 m, mas N = N 1 N 2, é possível obter a DFT de tamanho N por um algoritmo mais rápido do que pelo somatório da DFT. Usando o método da decimação na frequência, podemos escrever as amostras da DFT como: N 1 1 N 2 1 X k = X N 2 k 1 + k 2 = x[n 1 + N 1 n 2 ] n 1 =0 n 2 =0 onde 0 k 1 N 1 1 e 0 k 2 N 2 1 W N [n 1 +N 1 n 2 ] N 2 k 1 +k 2 Podemos observar que: W N n 1 N 2 k 1 = W N1 n 1 k 1, W N N 1 k 2 N 2 k 1 = 1, W N N 1 n 2 k 2 = W N2 n 2 k 2
Algoritmo FFT Mixed-Radix ou Cooley-Tukey Portanto, podemos reescrever a DFT como: N 1 1 N 2 1 X N 2 k 1 + k 2 = x[n 1 + N 1 n 2 ] n 1 =0 n 2 =0 W N1 n 1 k 1 W N n 1 k 2 W N2 n 2 k 2 ou como: N 1 1 N 2 1 n X N 2 k 1 + k 2 = x[n 1 + N 1 n 2 ] W 2 k 2 n N2 W 1 k 2 N n 1 =0 n 2 =0 W N1 n 1 k 1 A expressão acima pode ser interpretada como: I. Cálculo de N 1 DFTs de N 2 pontos II. Cálculo de N 2 DFTs de N 1 pontos III. n Multiplicação pelos N fatores W 1 k 2 N
Algoritmo FFT Mixed-Radix ou Cooley-Tukey Diagrama do algoritmo Cooley-Tukey para N = 3 5 = 15:
Algoritmo de Goertzel Cálculo recursivo da DFT, usado quando se quer calcular apenas algumas amostras da DFT ou uma nova DFT para cada nova amostra do sinal (running DFT) Podemos reescrever a expressão da DFT como: X k = W N kn N 1 l=0 Definindo a sequência: onde y k n = n 1 l=0 x e n = x l W N kl N 1 = x l W N k(n l) l=0 x e l W N k(n l) = x e n h k n x n, 0 n N 1 0, 0 < n e n > N
Algoritmo de Goertzel e Podemos observar que: h k n = W N kn, n 0 0, 0 < n X k = y k [n] n=n No domínio da transformada z, temos: onde Y k z = X e z 1 W N k z 1 = H k(z)x e (z) 1 H k (z) = 1 W k N z 1
Algoritmo de Goertzel e h k n = W N kn, n 0 0, 0 < n Podemos observar que: X k = y k [n] n=n No domínio da transformada z, temos: X e (z) Y k (z) = 1 W k N z 1 As amostras da DFT podem ser obtidas pela recursão:
Algoritmo de Goertzel Cálculo da k-ésima amostra da DFT pelo algoritmo de Goertzel:
Algoritmo de Goertzel As amostras da DFT podem ser obtidas pela recursão: y k n = x e n + W N k y k n 1, 0 n N com y k 1 = 0 e x e N =0. Quando n = N, a saída do filtro y k N é igual a X k Para obter cada amostra de X[k], são necessárias N multiplicações e N somas complexas Para calcular todas as N amostras de X[k], é necessário o mesmo número de operações que o cálculo direto Observando que: H k z = k z 1 1 1 W k N z = 1 + W N 1 1 2 cos 2π N nk z 1 + z 2
Algoritmo de Goertzel As amostras da DFT podem ser obtidas pelas equações: v k n = x e n + 2 cos 2π N k v k n 1 v k n 2, 0 n N X k = y k N = v k N W N k v k N 1 Apenas a parte recursiva deve ser calculada para 0 n N A parte não recursiva somente necessita ser calculada para n = N Para x[n] real, são necessárias N + 1 multiplicações e 2N + 1 somas reais para cada X[k] Portanto, há uma redução pela metade no número de multiplicações em relação ao cálculo direto
Algoritmo de Goertzel Cálculo da k-ésima amostra da DFT pelo algoritmo de Goertzel:
Cálculo Eficiente da Convolução Linear A convolução linear de uma sequência de comprimento finito com uma de comprimento infinito pode ser calculada de forma eficiente através de FFTs A principal aplicação desta técnica é no cálculo em tempo real da saída de filtros FIR de ordens elevadas para entradas muito longas Seja h(n) uma sequência de comprimento finito M e x(n) uma sequência de comprimento infinito. A convolução linear das duas sequências é: M 1 y n = h l x(n l) Dois métodos eficientes para obter y n serão apresentados: overlap-add e overlap-save l=0
Método Overlap-Add No método overlap-add, a sequência x n é segmentada em subsequências x m (n) contíguas de comprimento finito N, ou seja: onde x(n) = x m n = m=0 x m (n mn) x n + mn, 0 n N 1 0, 0 < n e n > N Substituindo x(n) acima na expressão da convolução: M 1 y n = h l x m (n l mn) l=0 M 1 m=0 = h(l)x m (n l mn) m=0 l=0 = y m (n mn) m=0
Método Overlap-Add Cada subsequência de saída y m n é a convolução de x m n e h n e tem comprimento M + N 1 y m n pode ser calculada estendendo as sequências x m n e h n, com M 1 e N 1 zeros, respectivamente, e usando FFTs de tamanho M + N 1: y m n = IFFT{FFT x m,e n FFT h e n } As subsequências são somadas após compensar os atrasos y(n) = m=0 y m (n mn) Haverá sobreposição de M 1 amostras de subsequências consecutivas, que serão somadas (daí o nome overlap-add)
Método Overlap-Add
Método Overlap-Save No método overlap-save, a sequência x n é segmentada em subsequências x m (n) de comprimento finito N + M 1 com sobreposição de M 1 amostras, ou seja: onde x m n = x(n) = m=0 x m (n mn) x n + mn, 0 n N + M 2 0, 0 < n e n > N + M 2 Calcula-se a convolução circular de cada subsequência x m n e de h e n, obtendo-se sequências w m n de comprimento N + M 1 As primeiras M 1 amostras de w m n são incorretas e são descartadas, enquanto que as N seguintes correspondem a amostras corretas da convolução linear de x n e h n
Método Overlap-Save As subsequências de saída y m n formadas pelas amostras salvas de w m n (daí o nome overlap-save) são dadas por y m n = 0, n < M 1 e n > N + M 2 w m n + M 1, 0 n N 1 A sequência de saída é pela concatenação das subsequências y m n, ou seja, y(n) = y m (n mn) m=0
Método Overlap-Save
Métodos Overlap-Add and Overlap-Save Complexidade computacional: Para x n de comprimento K, é necessário calcular K N DFTs de tamanho L = N + M 1 (uma para cada x m (n)) e K IDFTs de tamanho N L (uma para cada y m n ). A DFT de h e (n) pode ser calculada apenas uma vez (igual para todo m). O número total de multiplicações complexas necessárias para obter as K amostras de y n pelo método overlap-add ou overlap-save (usando o algoritmo FFT com L = 2 m ) é N mult = 2 K N + 1 L 2 log 2 L + K N L Por exemplo, para K = 10 6 e M = 100, teríamos: Para L = 128 (N = 29): N mult =3,5.10 7 Para L = 256 (N = 157): N mult =1,5. 10 7 Para L = 512 (N = 413): N mult =1,2. 10 7 Para L = 1024 (N = 925): N mult =1,2. 10 7 Pelo cálculo de y n pelo somatório da convolução: N mult = KM = 10 8
Métodos Overlap-Add and Overlap-Save Para K = 10 6 e M = 256, teríamos: Para L = 512 (N = 413): N mult =2. 10 7 Para L = 1024 (N = 769): N mult =1,5. 10 7 Pelo cálculo de y n pelo somatório da convolução: N mult = KM = 2,56.10 8 Para K = 10 9 e M = 500, teríamos: Para L = 1024 (N = 525): N mult =2,2. 10 10 Para L = 2048 (N = 1549): N mult =1,6. 10 10 Pelo cálculo de y n pelo somatório da convolução: N mult = KM = 5.10 11