Документация Engee

levinson

Рекурсия Левинсона — Дурбина.

Библиотека

EngeeDSP

Синтаксис

Вызов функции

  • a,e,k = levinson(r,n) — возвращает коэффициенты линейного процесса авторегрессии порядка n, автокорреляционная последовательность которого r. Также возвращает ошибку прогнозирования e и коэффициенты отражения k.

Аргументы

Входные аргументы

# r — автокорреляционная последовательность
вектор | матрица

Details

Автокорреляционная последовательность, заданная как вектор или матрица. Если r — матрица, то функция находит коэффициенты для каждого столбца r и возвращает их в строках a.

Типы данных

Float32 | Float64

Поддержка комплексных чисел

Да

# n — порядок модели
length(r)−1 (по умолчанию) | положительный целочисленный скаляр

Details

Порядок модели, заданный как целочисленный положительный скаляр.

Типы данных

Float32 | Float64

Выходные аргументы

# a — коэффициенты линейного процесса авторегрессии
вектор-строка | матрица

Details

Коэффициенты линейного процесса авторегрессии, возвращаемые в виде вектора-строки или матрицы. Коэффициенты фильтра упорядочиваются по убыванию степеней :

Если r — матрица, то каждой строке a соответствует столбец r.

# e — ошибка прогнозирования
скаляр | вектор-столбец

Details

Ошибка прогнозирования, возвращаемая в виде скаляра или вектора-столбца. Если r — матрица, то каждому элементу e соответствует столбец r.

# k — коэффициенты отражения
вектор-столбец | матрица

Details

Коэффициенты отражения, возвращаемые в виде вектора-столбца длины n. Если r — матрица, то каждому столбцу k соответствует столбец r.

Аргумент k вычисляется внутри матрицы при вычислении a коэффициентов, поэтому одновременный возврат k более эффективен, чем преобразование a в k с помощью функции tf2latc.

Примеры

Коэффициенты процесса авторегрессии

Details

Сгенерируем коэффициенты авторегрессионного процесса, заданного выражением

import EngeeDSP.Functions: randn,filter,xcorr,levinson

a = [1 0.1 -0.8 -0.27]

Сгенерируем реализацию процесса, отфильтровав белый шум с дисперсией 0.4.

v = 0.4
w = sqrt(v)*randn(15000,1)
x = filter(1,a,w)

Оценим корреляционную функцию. Отбросим значения корреляции при отрицательных интервалах запаздывания. Используем рекурсию Левинсона — Дурбина для оценки коэффициентов модели. Убедимся, что ошибка прогнозирования соответствует дисперсии входных данных.

r, lg = xcorr(x,"biased")
r = r[lg[:] .>= 0]
ar,e,k = levinson(r,numel(a)-1)
println("ar: ", ar)
println("e: ", e)
ar: [1.0 0.09735638301626465 -0.7977574280493284 -0.2697747348725144]
e: 0.39925318400516796

Оценим коэффициенты отражения для модели 16-го порядка. Убедимся, что единственные коэффициенты отражения, которые лежат за пределами 95% доверительных границ, соответствуют правильному порядку модели.

ar,e,k = levinson(r,16)

stem(1:length(k[:]), k[:],
     marker=:circle,
     markercolor=:blue,
     linecolor=:blue)

conf = sqrt(2) * erfinv(0.95) / sqrt(15000)
x_limits = xlims()

X = [x_limits[1], x_limits[2]]
Y1 = [conf, conf]
Y2 = [-conf, -conf]

plot!(X, Y1, linestyle=:dash, color=:red, label="")
plot!(X, Y2, linestyle=:dash, color=:red, label="")

levinson 1

Ошибки прогнозирования для нескольких реализаций

Details

Сгенерируем коэффициенты авторегрессионного процесса, заданного выражением

import EngeeDSP.Functions: randn,filter,xcorr,levinson

a = [1 0.1 -0.8 -0.27]

Сгенерируем пять реализаций процесса, отфильтровав белый шум с различными дисперсиями.

nr = 5
v = rand(1,nr)
1×5 Matrix{Float64}:
 0.264731  0.244259  0.401966  0.184345  0.070915
w = sqrt.(v[:])' .* randn(15000, nr)
x = filter(1,a,w)

Оценим корреляционную функцию. Отбросим кросс-корреляционные члены и значения корреляции при отрицательных интервалах запаздывания. Используем рекурсию Левинсона — Дурбина для оценки ошибок прогнозирования для правильного порядка модели и убедимся, что ошибки прогнозирования соответствуют дисперсиям входных шумовых сигналов.

r, lg = xcorr(x,"biased")

ar,e,k = levinson(r[lg[:] .>= 0,1:nr+1:end],numel(a)-1)

println("e: ", e)
e: [0.26082618781928835; 0.24091448115262645; 0.40999877779431343; 0.18019545485810384; 0.07090107526341564;;]

Алгоритмы

Рекурсия Левинсона — Дурбина — это алгоритм нахождения всеполюсного БИХ-фильтра с заданной детерминированной автокорреляционной последовательностью. Он находит применение в проектировании фильтров, кодировании и спектральном анализе. Фильтр, который использует levinson, является фильтром с минимальной фазой.

Функция levinson решает симметричную систему линейных уравнений Тёплица:

где r — входной вектор автокорреляции, а обозначает комплексное сопряжение . Входной вектор r обычно представляет собой вектор автокорреляционных коэффициентов, где интервал запаздывания 0 является первым элементом .

Если r не является правильной автокорреляционной последовательностью, то функция levinson может вернуть значения NaN, даже если решение существует.

Алгоритм требует операций и поэтому гораздо эффективнее, чем оператор \ для больших значений n. Однако функция levinson использует \ для низких порядков, чтобы обеспечить максимально быстрое выполнение.

Литература

  1. Ljung, Lennart. System Identification: Theory for the User. 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 1999.