Clasificación
- • Tiempo discreto vs continuo
- • Estado discreto vs continuo
- • Estacionario vs no estacionario
- • Markov vs no Markov
Capítulo 9
Secuencias de variables aleatorias indexadas en el tiempo: estacionariedad, autocorrelación, densidad espectral de potencia y filtrado óptimo.
Un proceso aleatorio X(t)
Un proceso aleatorio es una colección de variables aleatorias indexadas por tiempo: .
Para cada t fijo, es una variable aleatoria. Para cada resultado ω fijo, es unatrayectoria (realización) del proceso.
Estadísticos de primer y segundo orden
Valor esperado del proceso en cada instante t.
Mide la relación lineal del proceso consigo mismo en dos instantes.
Propiedades que no cambian con el tiempo
Un proceso es WSS si cumple:
Un proceso ergódico permite estimar propiedades del conjunto (ensemble) a partir de una sola trayectoria suficientemente larga: los promedios temporales igualan los promedios estadísticos.
La autocorrelación en frecuencia
La PSD es la transformada de Fourier de la autocorrelación (Teorema de Wiener-Khinchin):
La PSD muestra cómo se distribuye la potencia del proceso en las frecuencias. El área bajo es la potencia total:
Filtrado de procesos aleatorios
Si un proceso WSS pasa por un sistema LTI con respuesta al impulso h(t):
Donde es la respuesta en frecuencia del sistema.
El filtro óptimo para recuperar una señal
El filtro de Wiener busca recuperar una señal a partir de observaciones ruidosas , minimizando el error cuadrático medio.
La respuesta del filtro óptimo satisface esta ecuación integral.
Cuando S y N son incorrelados. El filtro atenúa las frecuencias donde domina el ruido.
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# Simular una señal + ruido
np.random.seed(42)
n = 1000
t = np.arange(n)
S = np.sin(0.02 * t) # señal limpia
N = 0.5 * np.random.randn(n) # ruido
X = S + N # observación ruidosa
# Estimar PSD con periodograma
f, psd_X = signal.periodogram(X)
f, psd_S = signal.periodogram(S)
# Filtro de Wiener (aproximación)
SNR = psd_S / psd_X
H = np.clip(SNR, 0, 1)
# Aplicar filtro (multiplicar en frecuencia)
fft_X = np.fft.fft(X)
fft_filtrado = fft_X * np.fft.fft(H, n)
filtrado = np.fft.ifft(fft_filtrado).real
print(f"SNR mejora: {10*np.log10(np.var(S)/np.var(X - S)):.1f} dB")
print(f"SNR entrada: {10*np.log10(np.var(S)/np.var(N)):.1f} dB")
print(f"SNR salida: {10*np.log10(np.var(S)/np.var(filtrado - S)):.1f} dB")