Grupo4 - FFT: mudanças entre as edições

De Física Computacional
Ir para navegação Ir para pesquisar
Gabrgiov (discussão | contribs)
Sem resumo de edição
Gabrgiov (discussão | contribs)
Sem resumo de edição
Linha 70: Linha 70:
Com essas 4 medidas, podemos dividir a soma 2 vezes:
Com essas 4 medidas, podemos dividir a soma 2 vezes:


<math>\tilde{a_k} = \sum_{t=0}^3 a_t \cdot e^{-i \frac{2\pi}{4}\cdot k \cdot t}</math>
<math>A = \sum_{t=0}^3 a_t \cdot e^{-i \frac{2\pi}{4}\cdot k \cdot t}</math>


<math>\tilde{a_k} = \sum_{t_1=0}^1 a_{2t_1} \cdot e^{-i \frac{2\pi}{2}\cdot k \cdot t_1} + C_k^1\sum_{t_1=0}^1 a_{2t_1+1} \cdot e^{-i \frac{2\pi}{2}\cdot k \cdot t_1}</math>
<math>A = \sum_{t_1=0}^1 a_{2t_1} \cdot e^{-i \frac{2\pi}{2}\cdot k \cdot t_1} + C_k^1\sum_{t_1=0}^1 a_{2t_1+1} \cdot e^{-i \frac{2\pi}{2}\cdot k \cdot t_1}</math>


<math>\tilde{a_k} = \sum_{t_2=0}^0 a_{4t_2} \cdot e^{-i \frac{2\pi}{1}\cdot k \cdot t_2} + C_k^2\sum_{t_2=0}^0 a_{4t_2+2} \cdot e^{-i \frac{2\pi}{1}\cdot k \cdot t_2} + C_k^1\sum_{t_2=0}^0 a_{4t_2+1} \cdot e^{-i \frac{2\pi}{1}\cdot k \cdot t_2} + C_k^3\sum_{t_2=0}^0 a_{4t_2+3} \cdot e^{-i \frac{2\pi}{1}\cdot k \cdot t_2}</math>
<math>A = \sum_{t_2=0}^0 a_{4t_2} \cdot e^{-i \frac{2\pi}{1}\cdot k \cdot t_2} + C_k^2\sum_{t_2=0}^0 a_{4t_2+2} \cdot e^{-i \frac{2\pi}{1}\cdot k \cdot t_2} + C_k^1\sum_{t_2=0}^0 a_{4t_2+1} \cdot e^{-i \frac{2\pi}{1}\cdot k \cdot t_2} + C_k^3\sum_{t_2=0}^0 a_{4t_2+3} \cdot e^{-i \frac{2\pi}{1}\cdot k \cdot t_2}</math>


e como temos <math>C_k^j = (e^{-i\frac{2\pi}{N}k})^j</math> podemos calcular
e como temos <math>C_k^j = (e^{-i\frac{2\pi}{N}k})^j</math> podemos calcular


<math>\tilde{a_0} = 1.00 \cdot C_0^1 - 1.00 \cdot C_0^3 = 0.00 + i0.00</math>
<math>A_0 = 1.00 \cdot C_0^1 - 1.00 \cdot C_0^3 = 0.00 + i0.00</math>


<math>\tilde{a_1} = 1.00 \cdot C_1^1 - 1.00 \cdot C_1^3 = 0.00 - i2.00</math>
<math>A_1 = 1.00 \cdot C_1^1 - 1.00 \cdot C_1^3 = 0.00 - i2.00</math>


<math>\tilde{a_2} = 1.00 \cdot C_2^1 - 1.00 \cdot C_2^3 = 0.00 + i0.00</math>
<math>A_2 = 1.00 \cdot C_2^1 - 1.00 \cdot C_2^3 = 0.00 + i0.00</math>


<math>\tilde{a_3} = 1.00 \cdot C_3^1 - 1.00 \cdot C_3^3 = 0.00 + i2.00</math>
<math>A_3 = 1.00 \cdot C_3^1 - 1.00 \cdot C_3^3 = 0.00 + i2.00</math>


=== FFT para N diferente de uma potência de 2 ===
=== FFT para N diferente de uma potência de 2 ===


Mesmo com a FFT sendo um algoritmo extremamente eficiente para <math>N = 2^p</math>, esse dificilmente é o caso que encotramos. Ainda assim, para <math>N</math> altamente composto (<math>N = r_1\cdot r_2 \cdot ... \cdot r_m</math>) o algoritmo ainda resulta em uma boa queda no tempo de cálculo.
Mesmo com a FFT sendo um algoritmo extremamente eficiente para <math>N = 2^p</math>, esse dificilmente é o caso que encotramos. Ainda assim, para <math>N</math> altamente composto (<math>N = r_1\cdot r_2 \cdot ... \cdot r_m</math>) o algoritmo ainda resulta em uma boa queda no tempo de cálculo.

Edição das 00h01min de 24 de outubro de 2017

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=0N1fnei2πnk/N

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

fn=1Nn=0N1Fkei2πnk/N

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

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

𝐖𝐧𝐤=[e2πi00/Ne2πi01/Ne2πi0k/Ne2πi10/Ne2πi11/Ne2πi1k/Ne2πin0/Ne2πin1/Ne2πink/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=0N1fnei2πNkn

podemos dividir o somatório em 2:

Fk=n=0N/21f2nei2πNk2n+n=0N/21f2n+1ei2πNk(2n+1)

Fk=n=0N/21f2nei2πN/2kn+ei2πNkn=0N/21f2n+1ei2πN/2kn

Fk=n=0N/21f2nei2πN/2kn+C(k)n=0N/21f2n+1ei2πN/2kn

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

ei2πN/2kn=ei2πN/2(k+N/2)n=ei2πN/2knei2πN/2N/2n=ei2πN/2kn1

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π1Hzt) 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:

A=t=03atei2π4kt

A=t1=01a2t1ei2π2kt1+Ck1t1=01a2t1+1ei2π2kt1

A=t2=00a4t2ei2π1kt2+Ck2t2=00a4t2+2ei2π1kt2+Ck1t2=00a4t2+1ei2π1kt2+Ck3t2=00a4t2+3ei2π1kt2

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

A0=1.00C011.00C03=0.00+i0.00

A1=1.00C111.00C13=0.00i2.00

A2=1.00C211.00C23=0.00+i0.00

A3=1.00C311.00C33=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=r1r2...rm) o algoritmo ainda resulta em uma boa queda no tempo de cálculo.