Portada: ilustración conceptual generada por IA de una señal sintética y sus componentes de frecuencia. No representa el ordenador original ni datos experimentales.
Escuchar las componentes de una señal
Imagine que graba un acorde musical. El micrófono le proporciona una secuencia de amplitudes, mientras que su pregunta se refiere a las notas que contiene. El análisis de Fourier establece una conexión matemática entre estas descripciones. Surgen preguntas similares al estudiar vibraciones o patrones en una imagen.
La transformada discreta de Fourier, o DFT, toma una secuencia finita y la expresa mediante componentes de frecuencia discretas. Una transformada rápida de Fourier, o FFT, es una forma eficiente de calcular esa misma transformada. No es un nuevo tipo de espectro. La documentación técnica de NumPy describe la entrada como una señal en el dominio temporal y la salida como su representación en el dominio frecuencial. Documentación de la DFT
La dificultad práctica es la repetición. Un cálculo directo combina cada punto de entrada con cada frecuencia de salida. Al duplicar el número de puntos, el trabajo aritmético dominante se multiplica por cuatro. Si una pregunta científica requiere miles de puntos, una fórmula matemáticamente sencilla puede convertirse en un obstáculo computacional.
Cooley y Tukey presentaron una factorización general y una implementación conveniente para potencias de dos, incluida una forma de reutilizar el espacio de almacenamiento del vector de entrada. Su artículo informa de un programa para IBM 7094 y de tiempos de cálculo, más allá de una propuesta puramente abstracta. El manuscrito se recibió el 17 de agosto de 1964 y apareció en el número de abril de 1965 de Mathematics of Computation. Aquí no se ha establecido el día de publicación. Artículo original, copia universitaria
Un avance con una larga historia previa
La idea no surgió de la nada en 1965. Los investigadores de historia Michael Heideman, Don Johnson y Sidney Burrus examinaron textos anteriores e identificaron una descomposición equivalente en la obra de Gauss. Infirieron una fecha de redacción alrededor de 1805; el propio manuscrito no estaba fechado explícitamente y se publicó de forma póstuma en 1866. Su estudio también aborda métodos posteriores, entre ellos el trabajo de Danielson y Lanczos de 1942 y el enfoque de factores primos de Good. Las restricciones de Good difieren de las de la factorización general de Cooley–Tukey. Investigación histórica y copia de autor accesible
En sus recuerdos de 1993, Cooley y Tukey describen el papel de Richard Garwin al conectar estos trabajos y fomentar su desarrollo. También reconocen descubrimientos anteriores y explican por qué los grandes cálculos electrónicos hicieron valioso el enfoque. Es un relato retrospectivo de los participantes, con las limitaciones propias de la memoria. Relato de Cooley y Tukey
El punto de inflexión duradero fue la difusión en la práctica de un cálculo reutilizable. El relato de Princeton sobre el hito reconocido por el IEEE lo vincula con la computación científica, el procesamiento de señales, la imagen médica y la transmisión de datos. Estas aplicaciones también dependen de instrumentos, modelos físicos y otros algoritmos; la FFT aportó una potente pieza de cálculo. El reconocimiento posterior respalda su importancia histórica, sin convertir una conmemoración reciente en la fecha del descubrimiento. Princeton y el hito IEEE
Cuatro puntos: entender la reutilización antes de la fórmula general
Utilicemos la secuencia adimensional [1, 2, 3, 4]. Este ejemplo deliberadamente pequeño es nuestro cálculo didáctico, no datos del artículo de 1965. Sea i la unidad imaginaria, con i² = −1. La DFT sin factor de escala y con exponente negativo produce cuatro salidas:
| Índice de frecuencia | Salida |
|---|---|
| 0 | 10 |
| 1 | −2 + 2i |
| 2 | −2 |
| 3 | −2 − 2i |
La primera salida suma las cuatro entradas. Las demás combinan pesos positivos, negativos e imaginarios. Una salida compleja contiene dos componentes; su módulo y su fase describen conjuntamente una componente de frecuencia.
Separemos ahora las entradas de índice par [1, 3] de las de índice impar [2, 4]. Cada par solo necesita su suma y su diferencia:
- Par de índices pares: E = [4, −2].
- Par de índices impares: O = [6, −2].
Combinemos esos resultados más cortos. La primera mariposa produce 4 + 6 = 10 y 4 − 6 = −2. La segunda comienza girando el resultado impar mediante −i, lo que da (−i)(−2) = 2i. Sus dos salidas son −2 + 2i y −2 − 2i.
«Mariposa» es el nombre de esta operación emparejada de suma y diferencia. Sus líneas cruzadas representan la organización del cálculo, no una conexión física entre ondas. Ambas salidas reutilizan los mismos resultados intermedios. Para un tamaño mayor, cada transformada más corta se puede dividir de nuevo: la reutilización pasa a formar una jerarquía, en vez de un atajo aislado.
Del ejemplo al crecimiento del cálculo
Para N valores de entrada, definimos nuestra convención mediante
Xk=n=0∑N−1xne−2πink/N.
Aquí n indexa las entradas, k indexa las salidas y ambos van de cero a N − 1. Los factores son rotaciones complejas de módulo unidad. Nuestra transformada directa no tiene factor de normalización; una inversa utiliza el exponente positivo y un factor 1/N. Existen otras convenciones. El artículo original parte de una suma de Fourier con exponente positivo, por lo que los signos y la normalización deben compararse explícitamente. Convención moderna
Para N par, dividimos la suma entre los índices de entrada pares e impares. Escribimos sus transformadas de longitud N/2 como Eₖ y Oₖ, y fijamos W_N = exp(−2πi/N). Para 0 ≤ k < N/2, la reconstrucción es
Xk=Ek+WNkOk,Xk+N/2=Ek−WNkOk.
La segunda igualdad utiliza el cambio de signo de la rotación a mitad del círculo. Por tanto, calculamos dos transformadas más cortas y realizamos un número de combinaciones proporcional a N. Repetir la división para N = 2ᵐ da m = log₂N niveles.
Cada nivel implica una cantidad de trabajo proporcional a la longitud de la secuencia. En consecuencia, el total crece como N log₂N. La notación O(N log N) describe este crecimiento, no un número exacto de instrucciones del procesador o de segundos. Una construcción didáctica en base 2 se limita a potencias de dos; las factorizaciones generales de Cooley–Tukey pueden utilizar otras longitudes compuestas.
La velocidad en un ordenador real también depende de la organización de los datos, las transferencias en memoria y la implementación. Un menor número de operaciones aritméticas no demuestra por sí solo una mejora concreta del tiempo transcurrido en su dispositivo.
Lo que un cálculo más rápido no puede corregir
Si unas mediciones espaciadas uniformemente tienen un intervalo Δt en segundos, la frecuencia de muestreo es 1/Δt hercios y la separación entre las casillas de frecuencia es 1/(NΔt) hercios. Para interpretar los índices de salida superiores hay que tener en cuenta el orden elegido para las frecuencias positivas y negativas. Convenciones de frecuencia
El muestreo finito sigue limitando lo que se puede inferir. Aquí, t es el tiempo en segundos, f la frecuencia de la señal en hercios y fₛ = 1/Δt la frecuencia de muestreo en hercios. Por ejemplo, las muestras de cos(2πft) en t = n/fₛ no cambian si f se sustituye por f + fₛ: la fase añadida es 2πn. Ningún algoritmo más rápido puede distinguir esas dos señales a partir de esas muestras únicamente. El ruido y los modelos de medición inadecuados también siguen siendo problemas de medición.
La aritmética numérica introduce otro límite. Los factores de rotación complejos generalmente requieren aproximaciones numéricas, y cambiar el orden de las operaciones puede modificar el redondeo. El análisis de precisión de FFTW destaca la importancia de factores de rotación precisos y documenta diferencias entre implementaciones y entornos. La equivalencia matemática no garantiza patrones de bits idénticos en coma flotante. Análisis de precisión
Comprobar el cálculo didáctico
Nuestra comprobación utilizó CPython 3.12.10 y únicamente la biblioteca estándar. Las raíces del caso de cuatro puntos [1, −i, −1, i] se representan exactamente, por lo que la igualdad exacta es apropiada para estas pequeñas entradas enteras. Ese criterio no debe trasladarse mecánicamente a transformadas más largas en coma flotante.
Los siguientes cálculos básicos se ejecutaron en nuestra comprobación registrada:
ROOTS = (1, -1j, -1, 1j)
def direct(x, roots=ROOTS):
return [
sum(x[n] * roots[(n*k) % 4] for n in range(4))
for k in range(4)
]
def butterfly(x):
even = (x[0] + x[2], x[0] - x[2])
odd = (x[1] + x[3], x[1] - x[3])
return [
even[0] + odd[0], even[1] - 1j*odd[1],
even[0] - odd[0], even[1] + 1j*odd[1],
]
Compare ambas funciones con [1, 2, 3, 4], un impulso [1, 0, 0, 0], una constante [1, 1, 1, 1], ceros y [1+i, −2, 3−i, 2i]. Los cinco resultados coincidieron exactamente. El primero también coincidió con la tabla anterior. Invertir los signos imaginarios de las raíces cambió el espectro del caso asimétrico, y la comprobación lo rechazó por corresponder a una convención diferente.
Esto valida los casos didácticos fijados. No demuestra que toda implementación sea correcta ni replica de forma independiente el rendimiento histórico. El artículo original no proporciona el programa completo, las entradas de las pruebas de rendimiento ni todas las condiciones de cronometraje necesarias para una reproducción de ese tipo.
Artículo redactado y traducido por un sistema de IA a partir de las fuentes citadas, con comprobaciones automatizadas según el método editorial News. El cálculo didáctico se ejecutó tal como se describe; no constituye revisión por pares, validación científica humana ni reproducción del programa histórico.
