Transformada Discreta De Fourier
O que acontece quando você pega um sinal e quer saber o que tem dentro dele
A transformada discreta de fourier é a ferramenta básica que converte uma sequência de amostras no tempo em uma representação nas frequências. Não é mágica, é álgebra linear aplicada a sinais discretos. O cálculo básico passa por multiplicar seu sinal por exponenciais complexas em cada frequência de interesse e somar os resultados. A fórmula pode parecer intimidante à primeira vista, mas o conceito por trás é simplesmente decompor o sinal em componentes senoidais. Se você está começando do zero, o caminho mais direto é escrever o loop Duplo que calcula cada bin de frequência separadamente. Para um sinal de N pontos, você vai precisar de N multiplicações complexas por cada uma das N saídas, o que resulta em uma complexidade O(N²). Isso funciona perfeitamente para sinais curtos, mas se seu sinal tiver dezenas de milhares de amostras, você vai esperar muito tempo pelo resultado. É aí que a FFT entra como otimização, reduzindo a complexidade para algo próximo de O(N log N). Na prática, a maioria das pessoas não implementa a FFT do zero. Você usa numpy com o módulo fft, ou MATLAB com fft, ou scipy.signal. O problema é que todo mundo pula a parte de entender o que realmente está acontecendo nos bastidores. Vou explicar por quê isso importa.
Dica importante: Quando você chama uma função FFT no Python, ela retorna um array complexo onde os primeiros N/2 elementos correspondem às frequências positivas e os N/2 seguintes às frequências negativas, ordenadas de forma que o índice 0 é a componente DC, o índice 1 é a menor frequência positiva, e assim por diante. Se você plotar diretamente o output sem fazer fftshift, vai ver algo confuso porque as frequências negativas aparecem no final do array.
Problemas reais que ninguém conta nos tutoriais
Uma vez eu processei um sinal de vibração mecânica com cerca de 50 mil amostras a 10 kHz de taxa de amostragem. A FFT mostrou picos claros em 50 Hz e 150 Hz, que eu sabia serem harmônicos de uma máquina giratória. O problema veio quando percebi que o pico em 50 Hz tinha uma amplitude absurdamente alta comparada ao esperado. Descobri depois que era fuga de espectro (spectral leakage). A frequência do sinal não cair exatamente em um dos bins da FFT porque minha janela de aquisição não capturou um número inteiro de períodos da senoide. O efeito é que a energia "vaza" para os bins vizinhos, criando um padrão de lóbulo lateral que distorce completamente a amplitude real. A solução prática que eu uso: aplicar uma janela de Hamming ou Blackman-Harris antes de calcular a FFT. A janela de Hamming é fácil de implementar e reduz significativamente o leakage. A de Blackman-Harris é mais agressiva, com atenuação de até 94 dB nos lóbulos laterais, mas alarga um pouco o pico principal. Para medições de amplitude precisa, eu prefiro Blackman-Harris. Para identificar frequência com resolução fina, Hamming costuma ser suficiente. Outro problema que todo mundo encontra: o aliasing. Se seu sinal original tem conteúdo acima da metade da frequência de amostragem (frequência de Nyquist), essas componentes de alta frequência vão "dobrar" para baixo no espectro e aparecer como frequências falsas. O remedy aqui é sempre passar um filtro antialiasing analógico antes do conversor A/D, com cutoff abaixo de fs/2. Sem isso, não adianta nada a qualidade da sua FFT.

O que as pessoas costumam errar
A primeira armadilha comum é confudir magnitude com potência. O output da FFT é um número complexo. A magnitude absoluta desse número diz respeito à amplitude da componente senoidal correspondente, mas se você quer potência real, precisa quadratizar e normalizar corretamente. Para um sinal real, a potência distribuída em cada bin deve considerar que a energia está espalhada entre as partes positiva e negativa do espectro. A segunda é ignorar a resolução em frequência. A resolução da FFT é igual a fs/N, onde fs é a taxa de amostragem e N o número de pontos. Se você tem fs = 1000 Hz e N = 1024, sua resolução será de aproximadamente 0,98 Hz. Dois tons próximos com menos de 0,98 Hz de separação aparecerão como um único pico alargado. Para melhorar a resolução, você precisa aumentar N (mais amostras) ou usar técnicas de sobreamostramento com zero-padding, embora o zero-padding não adicione informação real ao sinal, apenas interpola o espectro. Ponto que quase ninguém menciona: a FFT assume implicitamente que o sinal é periódico e que o trecho que você analisou se repete infinitamente. Se houver descontinuidade nas bordas do seu trecho de análise, você vai ter artefatos no espectro que não existem no sinal original. Por isso é crucial que o trecho analisado contenha um número inteiro de períodos dos sinais presentes, ou usar janelas adequadas.
Quando a FFT não resolve seu problema
Existem cenários onde a transformada discreta de fourier simplesmente não é a melhor abordagem. Se seu sinal é altamente não-estacionário, com componentes de frequência que mudam rapidamente ao longo do tempo, a FFT tradicional perde essa informação temporal. Ela te dá o espectro global, mas não diz quando cada frequência apareceu. Nesses casos, você precisa de uma transformada de Fourier de curta duração (STFT), que basicamente corta o sinal em pequenos segmentos, aplica FFT em cada um, e monta um spectrogram. Ou então métodos como wavelets, que oferecem melhor resolução conjunta tempo-frequência para certos tipos de sinais. Outra alternativa é o método de Lomb-Scargle, útil quando seus dados não estão igualmente amostrados no tempo. Um limite prático da FFT também é a quantidade de memória necessária. Para sinais muito longos, como gravações de áudio de horas de duração, você não consegue colocar tudo na memória de uma vez. A solução é processamento em blocos com overlap-add ou overlap-save, divindo o sinal em segmentos menores e combinando os resultados corretamente para evitar artefatos nas junções.
Implementação simples que funciona
Aqui está um exemplo mínimo em Python usando numpy: import numpy as np
from scipy import signal
Configurações
fs = 1000 taxa de amostragem em Hz
N = 1024 número de pontos
t = np.arange(N) / fs
Sinal de teste: senoide a 50 Hz com ruído
sinal = np.sin(2 * np.pi * 50 * t) + 0.5 * np.random.randn(N)
Janela e FFT
janela = signal.windows.hamming(N)
sinal_janelado = sinal * janela
espectro = np.fft.fft(sinal_janelado)
freqs = np.fft.fftfreq(N, d=1/fs)
Magnitude e plot (somos positivos)

Galeria
-
Transformada Discreta De Fourier - REVOEDUCA -
Transformada Discreta de Fourier (DFT) | PDF | Transformada discreta de ... -
Tabla Transformada De Fourier Frecuencia Latina TRANSFORMADA DISCRETA