В этом примере показано, как сравнивать взаимосвязь между авторегрессивным моделированием и линейным предсказанием. Линейное прогнозирование и авторегрессивное моделирование - это две разные задачи, которые могут дать одни и те же численные результаты. В обоих случаях конечной целью является определение параметров линейного фильтра. Однако фильтр, используемый в каждой проблеме, различен.
В случае линейного прогнозирования предполагается определить фильтр КИХ, который может оптимально предсказывать будущие выборки авторегрессионного процесса на основе линейной комбинации прошлых выборок. Разность между фактическим авторегрессионным сигналом и прогнозируемым сигналом называется ошибкой прогнозирования. В идеале эта ошибка представляет собой белый шум.
Для случая авторегрессивного моделирования целью является определение всеполюсного БИХ-фильтра, который при возбуждении белым шумом выдает сигнал с той же статистикой, что и авторегрессионный процесс, который мы пытаемся моделировать.
Здесь мы используем функцию LPC и фильтр FIR просто, чтобы придумать параметры, которые мы будем использовать для создания авторегрессионного сигнала, с которым мы будем работать. Использование 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-сигнал, статистика которого совпадает со статистикой данного сигнала, х. Ещё раз это называется авторегрессивным моделированием. Для решения уравнений Юле - Уокера необходимо оценить автокорреляционную функцию x. Алгоритм Левинсона используется тогда для решения уравнений Юле - Уокера эффективным образом. Функция ARYULE делает все это для нас.
[d1,p1] = aryule(x,7);
Теперь мы хотели бы вычислить частотную характеристику всеполюсного фильтра, который мы только что использовали для моделирования AR сигнала x. Хорошо известно, что спектральная плотность мощности выходного сигнала этого фильтра, при возбуждении фильтра белым гауссовым шумом задают величину-квадрат его частотной характеристики, умноженную на дисперсию входного сигнала белого шума. Одним из способов вычисления спектральной плотности выходной мощности является использование FREQZ следующим образом:
[H1,w1] = freqz(sqrt(p1),d1);
Чтобы получить представление о том, насколько хорошо мы смоделировали авторегрессионный сигнал x, мы перекрываем спектральную плотность мощности выходного сигнала модели, вычисленную с использованием FREQZ, с оценкой спектральной плотности мощности x, вычисленной с использованием PERIODOGRAM. Обратите внимание, что периодограмма масштабируется на 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')

Теперь обратимся к проблеме линейного прогнозирования. Здесь мы пытаемся определить фильтр предсказания FIR. Мы используем LPC для этого, но результат LPC требует небольшой интерпретации. LPC возвращает коэффициенты всего отбеливающего фильтра A (z), этот фильтр принимает как входной авторегрессионный сигнал x и возвращает как выходной ошибку предсказания. Однако A (z) имеет встроенный в него фильтр предсказания в виде B (z) = 1- A (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) из A (z), как описано выше, чтобы использовать фильтр линейного предсказания FIR для получения оценки будущих значений авторегрессионного сигнала на основе линейных комбинаций прошлых значений.
xh = filter(-d2(2:end),1,x);
Чтобы получить представление о том, что мы сделали с 7-отводным фильтром предсказания FIR, мы строим график (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