Линейное предсказание и авторегрессивное моделирование

Этот пример показывает, как сравнить отношение между авторегрессивным моделированием и линейным предсказанием. Линейное предсказание и авторегрессивное моделирование являются двумя различными проблемами, которые могут привести к тем же числовым результатам. В обоих случаях конечная цель должна определить параметры линейного фильтра. Однако фильтр, используемый в каждой проблеме, отличается.

Введение

В случае линейного предсказания намерение состоит в том, чтобы определить КИХ-фильтр, который может оптимально предсказать будущие выборки авторегрессивного процесса на основе линейной комбинации прошлых выборок. Различие между фактическим авторегрессивным сигналом и предсказанным сигналом называется ошибкой прогноза. Идеально, эта ошибка является белым шумом.

Для случая авторегрессивного моделирования намерение состоит в том, чтобы определить БИХ-фильтр все-полюса, который, когда взволновано с белым шумом производит сигнал с той же статистикой как авторегрессивный процесс, что мы пытаемся смоделировать.

Сгенерируйте Сигнал AR использование Фильтра все-полюса с Белым шумом как Вход

Здесь мы используем функцию LPC и КИХ-фильтр просто, чтобы придумать параметры, которые мы будем использовать, чтобы создать авторегрессивный сигнал, с которым мы будем работать. Использование FIR1 и LPC не очень важно здесь. Например, мы могли заменить d на что-то как простой как [1 1/2 1/3 1/4 1/5 1/6 1/7 1/8] и p0 с чем-то как 1e-6. Но форма этого фильтра более хороша, таким образом, мы используем его вместо этого.

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

Чтобы сгенерировать авторегрессивный сигнал, мы взволнуем фильтр все-полюса с белым гауссовым шумом отклонения p0. Заметьте, что, чтобы получить отклонение p0, мы должны использовать SQRT (p0) в качестве термина 'усиления' в шумовом генераторе.

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

Мы теперь используем белый гауссов шумовой сигнал и фильтр все-полюса, чтобы сгенерировать сигнал AR.

x = filter(1,d,u);

Найдите Модель AR от Сигнала с помощью Метода Уокера Рождества

Решая уравнения Уокера Рождества, мы можем определить параметры для фильтра все-полюса, который, когда взволновано с белым шумом произведет сигнал AR, статистические данные которого совпадают с теми из данного сигнала, x. Еще раз это называется авторегрессивным моделированием. В порядке решить уравнения Уокера Рождества, необходимо оценить автокорреляционную функцию x. Алгоритм Левинсона используется затем, чтобы решить уравнения Уокера Рождества эффективным способом. Функциональный ARYULE делает все это для нас.

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

Сравните модель AR с сигналом AR

Мы теперь хотели бы вычислить частотную характеристику фильтра все-полюса, мы только что раньше моделировали сигнал x AR. Это известно, который степень спектральная плотность вывода этого фильтра, когда фильтр взволнован с белым гауссовым шумом, дана в квадрате значением из его частотной характеристики, умноженной на отклонение бело-шумового входа. Один способ вычислить эту выходную мощность спектральная плотность при помощи FREQZ можно следующим образом:

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

В порядке понять то, как хорошо мы смоделировали авторегрессивный сигнал x, мы накладываем степень спектральная плотность вывода модели, вычислил использование, FREQZ, со степенью спектральная оценка плотности x, вычислил ПЕРИОДОГРАММУ использования. Заметьте, что периодограмма масштабируется 2*pi и односторонняя. Мы должны настроить для этого в порядке выдержать сравнение.

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')

Используйте LPC, чтобы выполнить линейное предсказание

Мы теперь обращаемся к проблеме линейного предсказания. Здесь мы пытаемся определить КИХ-фильтр прогноза. Мы используем LPC для этого, но результат LPC требует небольшой интерпретации. LPC возвращает коэффициенты целого фильтра отбеливания (z), этот фильтр берет в качестве входа авторегрессивный сигнал x и возвращает, как выведено ошибку прогноза. Однако (z) имеет фильтр прогноза, встроенный в него, в форму B (z) = 1-(z), где B (z) является фильтром прогноза. Обратите внимание на то, что коэффициенты и ошибочное отклонение, вычисленное с LPC, являются по существу тем же самым как вычисленными с ARYULE, но их интерпретация отличается.

[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

Мы теперь извлекаем B (z) от (z), как описано выше, чтобы использовать КИХ линейный фильтр предиктора, чтобы получить оценку будущих значений авторегрессивного сигнала на основе линейных комбинаций прошлых значений.

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

Сравните фактические и предсказанные сигналы

Чтобы получить чувство для того, что мы сделали с КИХ-фильтром прогноза с 7 касаниями, мы строим (200 выборок) исходного авторегрессивного сигнала наряду с оценкой сигнала, следующей из линейного предиктора, имеющего в виду задержку с одной выборкой фильтра прогноза.

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])

Сравните ошибки прогноза

Ошибочная степень прогноза (отклонение) возвращена как второй вывод в LPC. Его значение является (теоретически) тем же самым, когда отклонение белого шума, управляющего все-полюсом, просачивается проблема моделирования AR (p1). Другой способ оценить это отклонение от самой ошибки прогноза:

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

Все следующие значения являются теоретически тем же самым. Различия происходят из-за различных ошибок вычисления и приближения здесь.

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

    0.5127    0.5305    0.5305    0.5068