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

residuez

Разложение Z-преобразования на простые дроби.

Библиотека

EngeeDSP

Синтаксис

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

  • ro, po, ko = residuez(bi,ai) — находит вычеты, полюса и многочлен целой части разложения на простые дроби отношения полиномов с коэффициентами числителя bi и знаменателя ai.

  • bo,ao = residuez(ri, pi, ki) — преобразует разложение на простые дроби обратно в полиномы с коэффициентами bo и ao.

Аргументы

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

# bi,ai — коэффициенты полинома
векторы

Details

Коэффициенты полинома, заданные как векторы. Векторы b и a задают коэффициенты полиномов дискретных систем по возрастанию степеней :



Если корней несколько и , то

# ri — вычеты разложения на простые дроби
вектор-столбец

Details

Вычеты разложения на простые дроби, заданные как вектор.

# pi — полюса разложения на простые дроби
вектор-столбец

Details

Полюса разложения на простые дроби, заданные как вектор.

# ki — многочлен целой части разложения
вектор-строка

Details

Многочлен целой части разложения, заданный как вектор.

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

# ro — вычеты разложения на простые дроби
вектор-столбец

Details

Вычеты разложения на простые дроби, возвращаемые в виде вектора.

# po — полюса разложения на простые дроби
вектор-столбец

Details

Полюса разложения на простые дроби, возвращаемые в виде вектора.

Количество полюсов определяется как

Если является полюсом кратности , то разложение включает члены вида

# ko — многочлен целой части разложения
вектор-строка

Details

Многочлен целой части разложения, возвращаемый в виде вектора.

Вектор коэффициентов многочлена целой части пуст, если меньше ; в противном случае:

# bo,ao — коэффициенты полинома
векторы

Details

Коэффициенты полинома, возвращаемые в виде векторов.

Примеры

Разложение на простые дроби БИХ-фильтра нижних частот

Details

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

Выразим числитель и знаменатель в виде полиномиальных сверток.

import EngeeDSP.Functions: conv, residuez

b0 = 0.05634
b1 = [1, 1]
b2 = [1, -1.0166, 1]
a1 = [1, -0.683]
a2 = [1, -1.4461, 0.7957]

b = b0*conv(b1,b2)
a = conv(a1,a2)

Вычислим вычеты, полюса и многочлен целой части разложения на простые дроби.

r,p,k = residuez(b,a)

print("r: ")
show(stdout, "text/plain", r)
println()
print("p: ")
show(stdout, "text/plain", p)
println()
print("k: ")
show(stdout, "text/plain", k)
r: 3×1 Matrix{ComplexF64}:
 -0.1152524739870425 - 0.018151109860882933im
 -0.1152524739870425 + 0.018151109860882933im
 0.39051343991033616 + 0.0im
p: 3×1 Matrix{ComplexF64}:
 0.7230499999999996 + 0.522397068808775im
 0.7230499999999996 - 0.522397068808775im
 0.6829999999999996 - 0.0im
k: -0.10366849193625106

Построим график полюсов и нулей передаточной функции и наложим на него найденные полюса.

zeros = roots(vec(b))
poles = roots(vec(a))
θ = range(0, 2π, length=100)
unit_circle = exp.(1im * θ)

plot(real(unit_circle), imag(unit_circle),
     linecolor=:black,
     linestyle=:dash,
     label="Unit Circle",
     aspect_ratio=:equal,
     xlims=(-1.2, 1.2),
     ylims=(-1.2, 1.2))

scatter!(real(zeros), imag(zeros),
         marker=:circle,
         markersize=8,
         color=:blue,
         label="b")

scatter!(real(poles), imag(poles),
         marker=:circle,
         markersize=8,
         color=:red,
         label="a")

scatter!(real(p), imag(p),
         marker=:x,
         markersize=5,
         color=:green,
         label="poles")

residuez

Используем residuez снова, чтобы восстановить передаточную функцию.

bn,an = residuez(r,p,k)
print("bn: ")
show(stdout, "text/plain", bn)
println()
print("an: ")
show(stdout, "text/plain", an)
bn: 1×4 Matrix{Float64}:
 0.05634  -0.000935244  -0.000935244  0.05634
an: 1×4 Matrix{Float64}:
 1.0  -2.1291  1.78339  -0.543463

Алгоритмы

Функция residuez преобразует дискретную систему, выраженную в виде отношения двух полиномов, в разложение на простые дроби. Она также преобразует разложение на простые дроби обратно в исходные коэффициенты полинома.

С численной точки зрения разложение отношения полиномов на простые дроби является некорректно поставленной задачей. Если полином в знаменателе близок к многочлену с несколькими корнями, то небольшие изменения в данных, включая ошибки округления, могут привести к произвольно большим изменениям в результирующих полюсах и вычетах. Вместо этого следует использовать представления в пространстве состояний или представления с полюсами и нулями.

Функция residuez применяет стандартные функции Engee и методы простейших дробей для нахождения r, p и k из b и a. Она находит:

  • Многочлен целой части разложения a с помощью deconv (полиномиальное деление), когда length(b) > length(a) − 1.

  • Полюса с помощью p = roots(a).

  • Любые кратные полюса, переставляя полюса в соответствии с их кратностью.

  • Вычет для каждого простого полюса путем умножения на и вычисления результирующей рациональной функции при .

  • Вычеты для кратных полюсов путем решения

    для с помощью операции \. Здесь — импульсная характеристика редуцированного , — матрица, столбцы которой представляют собой импульсные характеристики систем первого порядка, состоящих из простых корней, а — столбец, содержащий вычеты для простых корней. Каждый столбец матрицы представляет собой импульсную характеристику. Для каждого корня кратности матрица содержит столбцов, представляющих собой импульсные характеристики каждой из следующих систем:

    Вектор и матрицы и имеют строк, где — общее число корней, а внутренний параметр , по умолчанию равный 1, определяет степень переопределенности системы уравнений.

Литература

  1. Oppenheim, Alan V., and Ronald W. Schafer, with John R. Buck. Discrete-Time Signal Processing. 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 1999.