# Transformada rápida de Fourier

La transformada rápida de Fourier, conocida por la abreviatura FFT (del inglés Fast Fourier Transform) es un algoritmo eficiente que permite calcular la transformada de Fourier discreta (DFT) y su inversa. La FFT es de gran importancia en una amplia variedad de aplicaciones, desde el tratamiento digital de señales y filtrado digital en general a la resolución de ecuaciones en derivadas parciales o los algoritmos de multiplicación rápida de grandes enteros. Cuando se habla del tratamiento digital de señales, el algoritmo FFT impone algunas limitaciones en la señal y en el espectro resultante ya que la señal muestreada y que se va a transformar debe consistir de un número de muestras igual a una potencia de dos. La mayoría de los analizadores de FFT permiten la transformación de 512, 1024, 2048 o 4096 muestras. El rango de frecuencias cubierto por el análisis FFT depende de la cantidad de muestras recogidas y de la proporción de muestreo.
La transformada rápida de Fourier es de importancia fundamental en el análisis matemático y ha sido objeto de numerosos estudios. La aparición de un algoritmo eficaz para esta operación fue un hito en la historia de la informática.

## Definición

Sea $x_{n}$ una señal aperiódica discreta en el tiempo. La transformada discreta de Fourier (DFT, por sus siglas en inglés) de esta señal se define como:
    $X_{k}=\sum _{n=0}^{N-1}x_{n}e^{-{\frac {2\pi i}{N}}kn},\qquad k=0,\dots ,N-1.$
en la cual $X_{k}$ es un conjunto de números complejos. La evaluación directa de esa fórmula requiere $O\left(N^{2}\right)$operaciones aritméticas, pero con un algoritmo FFT se puede obtener el mismo resultado con solo $O(N\log N)$operaciones. En general, dichos algoritmos dependen de la factorización de n pero, al contrario de lo que frecuentemente se cree, existen FFTs para cualquier n, incluso con n primo.
La idea que permite esta optimización, es la descomposición de la transformada a tratar en otras más simples y éstas a su vez hasta llegar a transformadas de 2 elementos donde k puede tomar los valores 0 y 1. Una vez resueltas las transformadas más simples hay que agruparlas en otras de nivel superior que deben resolverse de nuevo y así sucesivamente hasta llegar al nivel más alto. Al final de este proceso, los resultados obtenidos deben reordenarse.
Dado que la transformada discreta de Fourier inversa es análoga a la transformada discreta de Fourier, con distinto signo en el exponente y un factor 1/N:
    $x_{n}={\frac {1}{N}}\sum _{k=0}^{N-1}X_{k}e^{{\frac {2\pi i}{N}}kn},$
cualquier algoritmo FFT puede ser fácilmente adaptado para el cálculo de la transformada inversa discreta de Fourier (conocida por su sigla inglesa, IDFT). Por lo general, tenemos que:
    $x_{n}={\text{IDFT}}\{X_{k}\}={\frac {1}{N}}\left({\text{DFT}}\left\{{X_{k}}^{*}\right\}\right)^{*}$
donde el símbolo de asterisco (*) denota la conjugada compleja de la expresión que le antecede.

## Algoritmos

El algoritmo de la transformada de Fourier Rápida (FFT), fue popularizado por los matemáticos estadounidenses James William Cooley y John Wilder Tukey en 1965. Se puede ilustrar mediante el siguiente ejemplo, calculando la FFT de un conjunto de cuatro muestras de datos. Se define el conjunto de muestras de una señal como la señal $X_{0}[n]$ en tiempo discreto de forma que los datos de entrada para el algoritmo sean $\{X_{0}[0],X_{0}[1],X_{0},X_{0}[3]\}$. La DTF de dicha señal es, aplicando la definición:
    $X[k]=\sum _{n=0}^{N-1}X_{0}[n]\,e^{-{\frac {2\pi i}{N}}kn}$
Se recomienda usar la notación:
    $W=e^{-{\frac {2\pi i}{N}}}$
Para este caso de 4 puntos de datos, recordando el álgebra lineal, es posible escribir la FFT en forma de matriz como:
puesto que los datos de entrada están representados por un vector-columna de 4 componentes. Efectuar la multiplicación usual de matrices directa requeriría $N^{2}$multiplicaciones complejas y $N(N-1)$adiciones complejas. Por lo tanto, puede escribirse de la siguiente manera:
Debido a que $W^{n}=W^{n+mN}$, donde $m$ es un entero, es posible factorizar la matriz en el producto de dos matrices:
Los elementos $X[1]$ y $X[2]$ han cambiado de lugar en el vector que se encuentra del lado izquierdo. Cuando se multipliquen las matrices, los renglones 1 y 2, también se intercambiarán. Después, se calcula el número de multiplicaciones y adiciones que se requieren. Primero, se identifica el resultado de multiplicar la segunda matriz cuadrada por el conjunto de datos de entrada como:
Recordando como se multiplican las matrices, el primer elemento del vector de la izquierda es:
$X[0]=X_{0}[0]+W^{0}X_{0}[2]$
De manera similar, el cálculo de $X[1]$ y $X[2]$requieren de una multiplicación y una adición.Aunque $W^{0}$es uno, se hará que $W^{0}=-W^{2}$ y el producto ya se ha obtenido en el cálculo del primer elemento y puede, en consecuencia, solo almacenarse hasta que se necesite y luego restarse en vez de sumarse. De manera similar, $X[3]$solo requiere una adición más. Hasta ahora se tienen dos multiplicaciones y cuatro sumas. Apelando a condiciones de simetrías similares en la segunda multiplicación de matrices, se encuentra que se requieren dos multiplicaciones y cuatro sumas más. Así, en total, se necesitan cuatro multiplicaciones y ocho adiciones. Puesto que, computacionalmente, las multiplicaciones requieren por lo general mucho más tiempo de cómputo que las adiciones, el algoritmo de FFT para cuatro puntos es alrededor de cuatro veces más rápido que la FDT directa. El siguiente diagrama muestra, en forma de gráfica de flujo de señales, como se realizan las operaciones necesarias.

## Algoritmo de diezmado en el tiempo

Es el algoritmo más famoso para el cálculo de una FFT, diseñado por Cooley y Tukey en 1965. Tomando como entrada una señal discreta x[n] con N muestras, se basa en dividir la señal de entrada en otras dos señales de N/2 muestras (por un lado los coeficientes pares y por otro los impares), y se envían cada una de estas subseñales a una FFT de tamaño N/2 puntos. Cada uno de los coeficientes de salida de la FFT de las muestras impares se multiplica por $W_{N}^{K}=e^{-i{\frac {2\pi }{N}}k}$, donde k es la posición del vector salida, y se suma a las muestras pares. A su vez, las FFT de N/2 puntos se pueden resolver de esta misma manera, realizando esta operación de manera recursiva hasta obtener una FFT de una señal de tamaño 2, cuyo resultado es:
    $X[0]=x[0]+x[1]$
    $X[1]=x[0]-x[1]$

## Aplicaciones

* Tratamiento de imagen (JPEG) y audio (MP3)
* Reducción de ruido en señales, como el ruido blanco
* Análisis en frecuencia de cualquier señal discreta
* Análisis de vibraciones
* Análisis de materiales y estadística
* Síntesis, mediante la transformada inversa IFFT