levinson
Рекурсия Левинсона — Дурбина.
| Библиотека |
|
Аргументы
Входные аргументы
#
r —
автокорреляционная последовательность
вектор | матрица
Details
Автокорреляционная последовательность, заданная как вектор или матрица. Если r — матрица, то функция находит коэффициенты для каждого столбца r и возвращает их в строках a.
| Типы данных |
|
| Поддержка комплексных чисел |
Да |
#
n —
порядок модели
length(r)−1 (по умолчанию) | положительный целочисленный скаляр
Details
Порядок модели, заданный как целочисленный положительный скаляр.
| Типы данных |
|
Примеры
Коэффициенты процесса авторегрессии
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="")

Ошибки прогнозирования для нескольких реализаций
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 использует \ для низких порядков, чтобы обеспечить максимально быстрое выполнение.