Grupo4 - FFT

De Física Computacional
Revisão de 00h15min de 24 de outubro de 2017 por Gabrgiov (discussão | contribs)
Ir para navegação Ir para pesquisar

A Transformada rápida de Fourier (em inglês Fast Fourier Transform, ou FFT) é um algoritmo que torna o cálculo da Transformada Discreta de Fourier (DFT) viável para a maior parte das aplicações.


Transformada Discreta de Fourier

Em muitas aplicações se tem informação sobre um conjunto de dados, ao invés de uma função contínua. A Transformada Discreta de Fourier transforma esse conjunto de dados em um conjunto de tamanho igual com informação sobre as frequências da função que satisfaz o conjunto de dados.

Para um conjunto de dados igualmente espaçados, pode-se, ao considerar os dados como um período de uma função periódica, cujo período normalmente é considerado entre [−π,π] para facilitar o cálculo (e que pode sempre ser transformada em uma função nesse interválo), mostrar que a transformada discreta de Fourier pode ser dada pela equação:

Fk=∑n=0N−1fne−i2πnk/N

A sua inversa é, em paralelo ao caso da transformada contínua,

fn=1N∑n=0N−1Fkei2πnk/N

A transformada também pode ser expressa em forma vetorial, como

F→=𝐖𝐧𝐤f→ onde 𝐖𝐧𝐤 é definido como

𝐖𝐧𝐤=[e−2πi0⋅0/Ne−2πi0⋅1/N⋯e−2πi0⋅k/Ne−2πi1⋅0/Ne−2πi1⋅1/N⋯e−2πi1⋅k/N⋮⋮⋱⋮e−2πin⋅0/Ne−2πin⋅1/N⋯e−2πin⋅k/N]

O cálculo dessa expressão leva em torno de N2 passos para o resultado. Uma amostra com 3,000 pontos precisa de 9,000,000 operações para a transformada ser obtida, tornando a DFT inviável para aplicações rápidas.


Transformada Rápida de Fourier

É possível calcular a transformada com Nlog2N passos. Para isso se dispõe de um algoritmo chamado Transformada Rápida de Fourier. Considera-se um conjunto de pontos N=2p (com p inteiro, então, da definição da DFT

Fk=∑n=0N−1fn⋅e−i2πN⋅k⋅n

podemos dividir o somatório em 2:

Fk=∑n=0N/2−1f2n⋅e−i2πN⋅k⋅2n+∑n=0N/2−1f2n+1⋅e−i2πN⋅k⋅(2n+1)

Fk=∑n=0N/2−1f2n⋅e−i2πN/2⋅k⋅n+e−i2πNk∑n=0N/2−1f2n+1⋅e−i2πN/2⋅k⋅n

Fk=∑n=0N/2−1f2n⋅e−i2πN/2⋅k⋅n+C(k)∑n=0N/2−1f2n+1⋅e−i2πN/2⋅k⋅n

onde a soma em vermelho é a parte par e a soma em azul é a parte ímpar da transformada. As duas somas tem o mesmo expoente, que agora é dividido por N/2. Desse expoente, é evidente a relação entre o ponto k e o ponto k+N/2

e−i2πN/2⋅k⋅n=e−i2πN/2⋅(k+N/2)⋅n=e−i2πN/2⋅k⋅n⋅e−i2πN/2⋅N/2⋅n=e−i2πN/2⋅k⋅n⋅1

Com essa relação, podemos ver que Fk e Fk+N/2 tem o mesmo expoente e podem ser calculadas ao mesmo tempo. Mais que isso, a nova forma da transformada pode ser sucessivamente dividida, cada vez produzindo somas com limites menores.


Exemplo

Suponha que temos a função sinusoidal a(t)=sin(2π⋅1Hz⋅t) e fazemos quatro medidas no intervalo de 1 segundo, resultando em

a0=0.00 a1=1.00 a2=0.00 a3=−1.00

Com essas 4 medidas, podemos dividir a soma 2 vezes:

Ak=∑t=03at⋅e−i2π4⋅k⋅t

Ak=∑t1=01a2t1⋅e−i2π2⋅k⋅t1+Ck1∑t1=01a2t1+1⋅e−i2π2⋅k⋅t1

Ak=∑t2=00a4t2⋅e−i2π1⋅k⋅t2+Ck2∑t2=00a4t2+2⋅e−i2π1⋅k⋅t2+Ck1∑t2=00a4t2+1⋅e−i2π1⋅k⋅t2+Ck3∑t2=00a4t2+3⋅e−i2π1⋅k⋅t2

e como temos Ckj=(e−i2πNk)j podemos calcular

A0=1.00⋅C01−1.00⋅C03=0.00+i0.00

A1=1.00⋅C11−1.00⋅C13=0.00−i2.00

A2=1.00⋅C21−1.00⋅C23=0.00+i0.00

A3=1.00⋅C31−1.00⋅C33=0.00+i2.00

FFT para N diferente de uma potência de 2

Mesmo com a FFT sendo um algoritmo extremamente eficiente para N=2p, esse dificilmente é o caso que encotramos. Ainda assim, para N altamente composto (N=r1⋅r2⋅...⋅rm) o algoritmo ainda resulta em uma boa queda no tempo de cálculo.

Para o caso mais simples N=r1⋅r2 a transformada pode ser escrita como

F(k1,k0)=∑n0=0r2−1[∑n1=0r1−1x(n1,n0)e−i2π⋅k⋅n1⋅r2]e−i2π⋅k⋅n0

onde k=k1⋅r1+k0 , k0=0,1,...,r1−1 e k1=0,1,...,r2−1

n=n1⋅r2+n0 , n0=0,1,...,r2−1 e n1=0,1,...,r1−1

assim a transformada que antes necessitava de N calculos, agora pode ser vista como r1+r2 calculos