Guía 2 - Ejercicio 1: DFT
Resolución Ejercicio 1 - Transformada de Fourier Discreta (DFT)
Fundamentos Matemáticos
La Transformada de Fourier Discreta (DFT) es una herramienta matemática fundamental en el análisis numérico y el procesamiento de señales. Mientras que la Serie de Fourier continua se aplica a funciones periódicas en el dominio continuo, la DFT actúa sobre un vector de valores muestreados (discretos), típicamente equiespaciados en el tiempo.
El enunciado nos plantea la siguiente expresión (atención, corrigiendo un leve error tipográfico en los índices del PDF original, donde la sumatoria iteraba sobre en lugar de ):
Donde:
- es la longitud del vector o cantidad total de muestras.
- es el valor de la señal en la muestra n-ésima (dominio temporal).
- es el coeficiente k-ésimo de la transformada (dominio frecuencial), generalmente un número complejo.
- son las funciones de base complejas. Por la fórmula de Euler (), representan armónicos senoidales y cosenoidales a distintas frecuencias.
Cada coeficiente resultante nos cuantifica "cuánto" de la frecuencia está presente en nuestra señal .
Implementación Numérica
Si bien el cálculo directo iterando con dos bucles for (uno exterior para y otro interior para ) es correcto conceptualmente, acarrea una complejidad algorítmica de . En un lenguaje interpretado como Python, esto sería extremadamente lento para vectores grandes.
Para sortear esto, la convención en Python (utilizando numpy) es vectorizar las operaciones echando mano al álgebra lineal subyacente (rutinas BLAS/LAPACK escritas en C/Fortran). Podemos construir una matriz cuadrada de dimensiones , donde cada elemento , y luego obtener el vector sencillamente multiplicando la matriz por el vector columna .
El código en Python ha sido implementado y guardado en dft.py.
import numpy as np
def calcular_dft(x: np.ndarray) -> np.ndarray:
"""
Calcula la Transformada de Fourier Discreta (DFT) de manera vectorizada.
Parámetros:
x (np.ndarray): Señal discreta en el tiempo (array 1D).
Retorna:
np.ndarray: Espectro de frecuencias (DFT) complejo (array 1D).
"""
# Nos aseguramos que x sea un array de numpy de tipo float
x = np.asarray(x, dtype=float)
N = x.shape[0]
# Generamos los vectores de índices n y k
n = np.arange(N)
k = n.reshape((N, 1)) # Lo transformamos a vector columna para hacer broadcasting
# Matriz exponencial de Fourier (NxN)
M = np.exp(-2j * np.pi * k * n / N)
# Producto matricial: X_k = M * x_n
return np.dot(M, x)
[!infobox] Ejercicio 1: Implementación de DFT Contexto: Transformada de Fourier Discreta a partir de su definición matemática. Resolución Numérica: Se implementa de forma vectorizada utilizando
numpy. En lugar de utilizar bucles anidados, se calcula el producto , donde es la matriz que contiene los valores de las exponenciales complejas . Esto acelera exponencialmente la ejecución en un entorno como Python (vectorización), aunque matemáticamente mantengamos una complejidad . Advertencia/Clave: Notar que la fórmula matemática del enunciado tiene un error de índices; el sumatorio se realiza sobre la variable temporal discreta , no sobre . En la vida real e industrial, jamás utilizamos esta DFT "nativa" cuadrática, sino el algoritmo FFT (Fast Fourier Transform) de Cooley-Tukey, cuya complejidad es radicalmente menor: .