WhatsApp

  

Transformada Discreta de Fourier (DFT): Conceptos, Implementación y Ejemplos en Python

Aprende en detalle la Transformada Discreta de Fourier, su teoría, aplicaciones y cómo implementarla en Python con ejemplos prácticos, comparaciones con FFT y mejores prácticas de rendimiento.

Transformada Discreta de Fourier (DFT): teoría, ejemplos en Python y mejores prácticas

1. Introducción

La Transformada Discreta de Fourier (DFT) es la piedra angular del análisis de señales discretas. Permite convertir una secuencia finita de valores en el dominio del tiempo a una representación en el dominio de la frecuencia, revelando componentes sinusoidales ocultas.

En la práctica, la DFT se utiliza en procesamiento de audio, imágenes, comunicaciones, análisis de vibraciones, y cada vez más en algoritmos de Inteligencia Artificial que requieren extracción de características espectrales.

2. Definición matemática

Para una secuencia x[n] de longitud N, la DFT se define como:

 X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j 2\pi kn / N}, \quad k = 0,\ldots,N-1 

donde j es la unidad imaginaria. La Transformada Inversa (IDFT) recupera la señal original:

 x[n] = \frac{1}{N}\sum_{k=0}^{N-1} X[k] \cdot e^{j 2\pi kn / N}

Estas ecuaciones son la base para todas las implementaciones numéricas.

3. Implementación directa vs. FFT

Implementación directa (O(N²))

  • Calcula cada X[k] con la suma completa.
  • Fácil de entender y depurar.
  • Se vuelve prohibitiva para N > 10⁴.

Fast Fourier Transform (FFT) – O(N log N)

  • Algoritmo divide‑y‑vencer (Cooley‑Tukey) que reutiliza cálculos.
  • Estándar de facto en bibliotecas como numpy.fft y scipy.fft.
  • Optimizado para vectores de longitud potencia de 2, aunque existen variantes para tamaños arbitrarios.

4. Ejemplos prácticos en Python

4.1. DFT manual con NumPy

import numpy as np
def dft(x):
    N = x.shape[0]
    n = np.arange(N)
    k = n.reshape((N, 1))
    # Matriz de factores de twiddle
    M = np.exp(-2j * np.pi * k * n / N)
    return np.dot(M, x)
# Señal de ejemplo
fs = 8000                     # frecuencia de muestreo [Hz]
t = np.arange(0, 1, 1/fs)    # 1 segundo
x = np.sin(2*np.pi*440*t) + 0.5*np.sin(2*np.pi*880*t)
X = dft(x)
print('Magnitud:', np.abs(X)[:10])

Este código muestra la construcción explícita de la matriz de twiddle y la multiplicación matricial. Es útil para propósitos educativos y para validar implementaciones de FFT.

4.2. FFT con numpy.fft

import numpy as np
import matplotlib.pyplot as plt
fs = 8000
t = np.arange(0, 1, 1/fs)
signal = np.sin(2*np.pi*440*t) + 0.5*np.sin(2*np.pi*880*t)
# FFT
X_fft = np.fft.fft(signal)
freqs = np.fft.fftfreq(len(signal), d=1/fs)
# Visualización del espectro (solo componente positiva)
mask = freqs >= 0
plt.figure(figsize=(10,4))
plt.plot(freqs[mask], np.abs(X_fft)[mask])
plt.title('Espectro de frecuencia (FFT)')
plt.xlabel('Frecuencia (Hz)')
plt.ylabel('Magnitud')
plt.grid(True)
plt.show()

La FFT de NumPy es extremadamente rápida y está escrita en C bajo el capó, lo que la hace adecuada para producción.

4.3. Comparación de tiempos

import timeit
N = 2**14  # 16384 puntos
x = np.random.rand(N)
# DFT manual (pequeño N para evitar bloqueos)
print('Tiempo DFT (N=1024):', timeit.timeit('dft(x[:1024])', globals=globals(), number=10))
# FFT
print('Tiempo FFT (N=16384):', timeit.timeit('np.fft.fft(x)', globals=globals(), number=100))

En máquinas modernas, la FFT supera a la DFT en órdenes de magnitud, especialmente para N > 2¹⁰.

5. Buenas prácticas y optimización

  • Usar siempre la FFT salvo que necesites una implementación didáctica.
  • Preferir scipy.fft cuando se requiera soporte multi‑dimensional o tipos de datos complejos avanzados.
  • Si la longitud de la señal no es potencia de 2, zeropadding a la siguiente potencia mejora la velocidad (aunque introduce interpolación espectral).
  • Para procesamiento en tiempo real, pre‑calcula la ventana de Hann/Hamming y reutilízala en cada bloque.
  • En entornos con GPU, considerar cupy.fft o torch.fft para acelerar órdenes de magnitud.
  • Controlar el desbordamiento de tipo float64 en señales muy largas; usar float32 con numpy.fft.rfft cuando la precisión adicional no sea crítica.

6. Solución de problemas comunes

ProblemaCausa típicaSolución recomendada
Aliasing en el espectroFrecuencia de muestreo insuficiente (violación del teorema de Nyquist)Incrementar fs o aplicar filtrado anti‑alias antes de la DFT
Ventanas espectrales con fugas (leakage)Señal no periódica dentro del intervalo analizadoAplicar una ventana (Hann, Blackman) antes de la FFT
Desbordamiento de memoriaTransformada de señales muy largas sin segmentaciónUtilizar la FFT en bloques (STFT) o la librería pyfftw con planificación de memoria
Resultado complejo inesperadoOlvido de la simetría conjugada en señales realesUsar np.fft.rfft para señales reales y np.fft.irfft para la inversa

7. Compatibilidad, rendimiento y escalabilidad

Las implementaciones de FFT en numpy y scipy son compatibles con Windows, Linux y macOS, y funcionan tanto en CPU de 32‑bit como de 64‑bit. Para cargas de trabajo de gran escala (p.ej., procesamiento de cientos de GB de datos), se recomienda:

  • Dividir los datos en bloques y procesarlos en paralelo usando multiprocessing o Dask.
  • Aprovechar bibliotecas de FFT basadas en FFTW (pyfftw) que permiten planificación avanzada y uso de hilos SIMD.
  • En clústers, emplear Spark con spark-fft para transformadas distribuidas.

8. Tendencias emergentes

Con el auge de la IA y el procesamiento de señales en tiempo real, la DFT está evolucionando:

  • FFT en GPU: Bibliotecas como cuFFT (CUDA) y ROCm FFT permiten procesar millones de puntos en milisegundos.
  • Transformada Wavelet‑FFT híbrida para análisis multiresolución sin perder la velocidad de la FFT.
  • FFT diferenciable integrada en frameworks de aprendizaje profundo (PyTorch, TensorFlow) para entrenar redes que operen directamente en el dominio de frecuencia.

© 2025 BlogTech - Todos los derechos reservados.



Transformada Discreta de Fourier (DFT): Conceptos, Implementación y Ejemplos en Python
ASIMOV Ingeniería S. de R.L. de C.V., Emiliano Nava 15 noviembre, 2025
Compartir
Iniciar sesión dejar un comentario

  
Algoritmo Pi de Liu Hui: teoría, implementación en Python y comparativas modernas
Descubre el algoritmo de Liu Hui para calcular π, su fundamento matemático, ejemplos completos en Python y cómo se compara con otros métodos actuales como Machin, Monte Carlo y BBP.