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
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
Funciones a implementar
Archivo:
core/dsp/coherence.pyParámetros —
compute_psdsignalnp.ndarrayfsfloatn_segmentsintRetorno —
compute_psdfrequenciesnp.ndarray(real)Gxxnp.ndarray(real)Parámetros —
compute_cpsdxnp.ndarrayynp.ndarrayfsfloatn_segmentsintlen(x)debe ser igual alen(y).Retorno —
compute_cpsdfrequenciesnp.ndarray(real)Gxynp.ndarray(complejo)Criterios de aceptación
test_psd_real_positivetest_psd_frequency_rangetest_psd_lengths_matchlen(frequencies) == len(Gxx)test_cpsd_lengths_matchlen(frequencies) == len(Gxy)test_cpsd_same_signaltest_psd_white_noise_flatNotas de implementación
scipy.signal.welchpara PSD yscipy.signal.csdpara CPSD — son las implementaciones de referencia del método de Welchnperseg = len(signal) // n_segmentspara dividir en segmentosscipy.signal.csddevuelve frecuencias y la densidad cruzada compleja directamenteArchivos involucrados
core/dsp/coherence.pycore/dsp/tests/test_coherence.py