Skip to content

[FEAT] coherence.py: Implementar compute_psd() y compute_cpsd() #8

Description

@jero-scafati

Descripción

Implementar el cálculo de la densidad espectral de potencia (PSD) de una señal y la densidad espectral de potencia cruzada (CPSD) entre dos señales, necesarias como pasos previos al cálculo de coherencia.

Contexto del TP

La coherencia se calcula a partir de Gxx, Gyy y Gxy. Estas densidades se obtienen como la transformada de Fourier de la autocorrelación (para PSD) y la correlación cruzada (para CPSD).

Definición matemática

Autocorrelación:       Rxx[m] = Σ x[n] · x[n-m]
PSD:                   Gxx(ω) = FFT( Rxx[m] )
 
Correlación cruzada:   Rxy[m] = Σ x[n] · y[n-m]
CPSD:                  Gxy(ω) = FFT( Rxy[m] )
 
En la práctica con promediado de segmentos (método de Welch):
dividir la señal en segmentos solapados, calcular FFT de cada uno,
promediar los espectros de potencia.

Funciones a implementar

Archivo: core/dsp/coherence.py

compute_psd(signal, fs, n_segments=8)
compute_cpsd(x, y, fs, n_segments=8)

Parámetros — compute_psd

Parámetro Tipo Descripción
signal np.ndarray Señal de entrada, arreglo 1D
fs float Frecuencia de muestreo en Hz
n_segments int Número de segmentos para promediado. Default: 8

Retorno — compute_psd

Variable Tipo Descripción
frequencies np.ndarray (real) Vector de frecuencias de 0 a fs/2
Gxx np.ndarray (real) PSD de la señal, valores reales ≥ 0

Parámetros — compute_cpsd

Parámetro Tipo Descripción
x np.ndarray Primera señal (entrada), arreglo 1D
y np.ndarray Segunda señal (salida), arreglo 1D
fs float Frecuencia de muestreo en Hz
n_segments int Número de segmentos para promediado. Default: 8

len(x) debe ser igual a len(y).

Retorno — compute_cpsd

Variable Tipo Descripción
frequencies np.ndarray (real) Vector de frecuencias de 0 a fs/2
Gxy np.ndarray (complejo) CPSD cruzada, puede ser compleja

Criterios de aceptación

Test Qué verifica
test_psd_real_positive Gxx tiene valores reales y no negativos
test_psd_frequency_range Frecuencias de 0 a ≤ fs/2
test_psd_lengths_match len(frequencies) == len(Gxx)
test_cpsd_lengths_match len(frequencies) == len(Gxy)
test_cpsd_same_signal Si x == y, entonces Gxy debe ser real y positiva (igual a PSD)
test_psd_white_noise_flat La PSD del ruido blanco debe ser aproximadamente plana (varianza baja entre bins)

Notas de implementación

  • Se puede usar scipy.signal.welch para PSD y scipy.signal.csd para CPSD — son las implementaciones de referencia del método de Welch
  • Parámetro nperseg = len(signal) // n_segments para dividir en segmentos
  • scipy.signal.csd devuelve frecuencias y la densidad cruzada compleja directamente

Archivos involucrados

  • core/dsp/coherence.py
  • core/dsp/tests/test_coherence.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