Skip to content

[FEAT] analysis.py: Implementar compute_fft() #5

Description

@jero-scafati

Descripción

Implementar el cálculo de la Transformada de Fourier Discreta de una señal, retornando los vectores de frecuencia y magnitud listos para graficar.

Contexto del TP

La consigna pide graficar espectros de Fourier de señales y filtros. Esta función es el núcleo de toda la parte de análisis espectral.

Definición matemática

X(ω) = Σ_{n=0}^{N-1} x[n] · e^{-j·ω·n}
 
En la práctica (FFT discreta):
X[k] = FFT(x[n])
 
Magnitud:   |X[k]|  (espectro de amplitud)
Frecuencias: f[k] = k · fs / N,   para k = 0, ..., N/2

Solo se retorna la mitad positiva del espectro (señal real → espectro simétrico).

Función a implementar

Archivo: core/dsp/analysis.py

compute_fft(signal, fs)

Parámetros

Parámetro Tipo Descripción
signal np.ndarray Señal de entrada x[n], arreglo 1D
fs float Frecuencia de muestreo en Hz

Retorno

Variable Tipo Descripción
frequencies np.ndarray Vector de frecuencias en Hz, de 0 a fs/2
magnitudes np.ndarray Magnitudes

Criterios de aceptación

Test Qué verifica
test_fft_dc_signal Una señal constante tiene toda su energía en f=0
test_fft_sine_peak Un seno a 440 Hz tiene su pico en el bin más cercano a 440 Hz
test_fft_frequency_range frequencies[0] == 0 y frequencies[-1] <= fs/2
test_fft_lengths_match len(frequencies) == len(magnitudes)
test_fft_positive_magnitudes Todos los valores de magnitudes son ≥ 0
test_fft_nyquist La frecuencia máxima retornada no supera fs/2

Notas de implementación

  • Usar np.fft.fft(signal) para calcular la FFT
  • Usar np.fft.fftfreq(N, d=1/fs) para obtener las frecuencias
  • Tomar solo la primera mitad: índices [:N//2]
  • La magnitud es np.abs(X[:N//2]) — resultado siempre real y positivo
  • No normalizar por N a menos que sea explícitamente necesario para otro issue

Archivos involucrados

  • core/dsp/analysis.py
  • core/dsp/tests/test_analysis.py

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions