Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Predicción lineal y modelado autoregresivo

En este ejemplo se muestra cómo comparar la relación entre el modelado autoregresivo y la predicción lineal. La predicción lineal y el modelado autoregresivo son dos problemas diferentes que pueden producir los mismos resultados numéricos. En ambos casos, el objetivo final es determinar los parámetros de un filtro lineal. Sin embargo, el filtro utilizado en cada problema es diferente.

Introducción

En el caso de la predicción lineal, la intención es determinar un filtro FIR que pueda predecir de manera óptima muestras futuras de un proceso autoregresivo basado en una combinación lineal de muestras pasadas. La diferencia entre la señal autoregresiva real y la señal pronosticada se denomina error de predicción. Idealmente, este error es ruido blanco.

Para el caso del modelado autoregresivo, la intención es determinar un filtro IIR de todo polo, que cuando se excita con el ruido blanco produce una señal con las mismas estadísticas que el proceso autoregresivo que estamos tratando de modelar.

Generar una señal AR usando un filtro all-pole con ruido blanco como entrada

Aquí utilizamos la función LPC y un filtro FIR simplemente para llegar a parámetros que utilizaremos para crear la señal autoregresiva con la que trabajaremos. El uso de FIR1 y LPC no es crítico aquí. Por ejemplo, podríamos reemplazar d con algo tan simple como [1 1/2 1/3 1/4 1/5 1/6 1/7 1/8] y p0 con algo como 1e-6. Pero la forma de este filtro es más agradable, así que lo usamos en su lugar.

b = fir1(1024, .5); [d,p0] = lpc(b,7);

Para generar la señal autoregresiva, excitaremos un filtro de todo polo con ruido gaussiano blanco de varianza p0. Tenga en cuenta que para obtener la varianza p0, debemos utilizar SQRT(p0) como el término 'ganancia' en el generador de ruido.

rng(0,'twister'); % Allow reproduction of exact experiment u = sqrt(p0)*randn(8192,1); % White gaussian noise with variance p0

Ahora usamos la señal de ruido gaussiano blanco y el filtro de todo polo para generar una señal AR.

x = filter(1,d,u);

Encontrar el modelo AR de Signal usando el método Yule-Walker

Resolviendo las ecuaciones Yule-Walker, podemos determinar los parámetros para un filtro de todo polo que cuando se excita con el ruido blanco producirá una señal AR cuyas estadísticas coinciden con las de la señal dada, x. Una vez más, esto se denomina modelado autoregresivo. Para resolver las ecuaciones Yule-Walker, es necesario estimar la función de autocorrelación de x. El algoritmo Levinson se utiliza entonces para resolver las ecuaciones Yule-Walker de una manera eficiente. La función ARYULE hace todo esto por nosotros.

[d1,p1] = aryule(x,7);

Comparar el modelo AR con la señal AR

Ahora nos gustaría calcular la respuesta de frecuencia del filtro de todos los polos que acabamos de utilizar para modelar la señal AR x. Es bien sabido que la densidad espectral de potencia de la salida de este filtro, cuando el filtro se excita con ruido gaussiano blanco, se da por la magnitud cuadrada de su respuesta de frecuencia multiplicada por la varianza de la entrada de ruido blanco. Una forma de calcular esta densidad espectral de potencia de salida es utilizando FREQZ de la siguiente manera:

[H1,w1] = freqz(sqrt(p1),d1);

Con el fin de tener una idea de lo bien que hemos modelado la señal autoregresiva x, superponemos la densidad espectral de potencia de la salida del modelo, calculada utilizando FREQZ, con la estimación de densidad espectral de potencia de x, calculada utilizando PERIODOGRAM. Observe que el periodograma se escala en 2* pi y es unilateral. Tenemos que ajustarnos para esto para comparar.

periodogram(x) hold on hp = plot(w1/pi,20*log10(2*abs(H1)/(2*pi)),'r'); % Scale to make one-sided PSD hp.LineWidth = 2; xlabel('Normalized frequency (\times \pi rad/sample)') ylabel('One-sided PSD (dB/rad/sample)') legend('PSD estimate of x','PSD of model output')

Utilice LPC para realizar predicciones lineales

Ahora pasamos al problema de la predicción lineal. Aquí intentamos determinar un filtro de predicción FIR. Utilizamos LPC para hacerlo, pero el resultado de LPC requiere un poco de interpretación. LPC devuelve los coeficientes de todo el filtro blanqueamiento A(z), este filtro toma como entrada la señal autoregresiva x y devuelve como salida el error de predicción. Sin embargo, A(z) tiene el filtro de predicción incrustado en él, en la forma B(z) a 1- A(z), donde B(z) es el filtro de predicción. Tenga en cuenta que los coeficientes y la varianza de error calculados con LPC son esencialmente los mismos que los calculados con ARYULE, pero su interpretación es diferente.

[d2,p2] = lpc(x,7); [d1.',d2.']
ans = 8×2

    1.0000    1.0000
   -3.5245   -3.5245
    6.9470    6.9470
   -9.2899   -9.2899
    8.9224    8.9224
   -6.1349   -6.1349
    2.8299    2.8299
   -0.6997   -0.6997

Ahora extraemos B(z) de A(z) como se describió anteriormente para utilizar el filtro predictor lineal FIR para obtener una estimación de los valores futuros de la señal autoregresiva basada en combinaciones lineales de valores pasados.

xh = filter(-d2(2:end),1,x);

Comparar señales reales y predichas

Para tener una sensación de lo que hemos hecho con un filtro de predicción FIR de 7 toques, trazamos (200 muestras) de la señal autoregresiva original junto con la estimación de la señal resultante del predictor lineal teniendo en cuenta el retardo de una muestra en el filtro de predicción.

cla stem([x(2:end),xh(1:end-1)]) xlabel('Sample time') ylabel('Signal value') legend('Original autoregressive signal','Signal estimate from linear predictor') axis([0 200 -0.08 0.1])

Comparar errores de predicción

La potencia de error de predicción (varianza) se devuelve como la segunda salida de LPC. Su valor es (teóricamente) el mismo que la varianza del ruido blanco que impulsa el filtro de todos los polos en el problema de modelado de AR (p1). Otra forma de estimar esta varianza es a partir del propio error de predicción:

p3 = norm(x(2:end)-xh(1:end-1),2)^2/(length(x)-1);

Todos los valores siguientes son teóricamente los mismos. Las diferencias se deben a los diversos errores de cálculo y aproximación aquí.

[p0 p1 p2 p3]
ans = 1×4
10-5 ×

    0.5127    0.5305    0.5305    0.5068