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

tf2zpk

Преобразование параметров фильтра передаточной функции в форму нулей, полюсов и коэффициента усиления.

Библиотека

EngeeDSP

Синтаксис

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

  • z,p,k = tf2zpk(b,a) — находит вектор нулей z, вектор полюсов p и соответствующий коэффициент усиления k из параметров передаточной функции b и a. Функция преобразует полиномиальное представление передаточной функции

    дискретной системы с одним входом и одним выходом (Single-Input/Single-Output, SISO) в разложенную на множители форму передаточной функции

    Используйте функцию tf2zpk при работе с передаточными функциями, выраженными в степенях . Аналогичная функция tf2zp более полезна при работе со степенями , например, в непрерывных передаточных функциях.

Аргументы

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

# b — коэффициенты числителя передаточной функции
вектор

Details

Коэффициенты числителя передаточной функции, заданные как вектор. Аргумент b содержит коэффициенты в порядке возрастания степеней .

Типы данных

Float32, Float64

# a — коэффициенты знаменателя передаточной функции
вектор

Details

Коэффициенты знаменателя передаточной функции, заданные как вектор. Аргумент a содержит коэффициенты в порядке возрастания степеней .

Типы данных

Float32, Float64

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

# z — нули системы
вектор

Details

Нули системы, возвращаемые в виде вектора-столбца.

# p — полюса системы
вектор

Details

Полюса системы, возвращаемые в виде вектора-столбца.

# k — коэффициент усиления системы
скаляр

Details

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

Примеры

Полюса, нули и коэффициент усиления БИХ-фильтра

Details

Спроектируем фильтр Баттерворта 3-го порядка с нормализованной частотой среза рад/отсчет. Найдем полюса, нули и коэффициент усиления фильтра.

import EngeeDSP.Functions: butter, tf2zpk

b, a = butter(3, 0.4)
z, p, k = tf2zpk(b, a)
println("z = ", z, "\np = ", p, "\nk = ", k)
z = ComplexF64[-1.000006578089738 - 0.0im; -0.9999967109551287 + 5.6968468871119e-6im; -0.9999967109551287 - 5.6968468871119e-6im;;]
p = ComplexF64[0.20942804224088346 + 0.5581994780502226im; 0.20942804224088346 - 0.5581994780502226im; 0.1583844403245364 - 0.0im;;]
k = 0.098531160923927

Построим график полюсов и нулей, чтобы убедиться, что они находятся в ожидаемых местах. Добавим на график единичную окружность для наглядности.

import Pkg
Pkg.add("ControlSystems")
using ControlSystems

H = tf(vec(b), vec(a))
z, p = tzeros(H), poles(H)

pzmap(H)
annotate!([(real(zi)+0.1, imag(zi), text("Zero", 8)) for zi in z])
annotate!([(real(pi)+0.1, imag(pi), text("Pole", 8)) for pi in p])

θ = range(0, 2π, length=200)
plot!(cos.(θ), sin.(θ),
      ls=:dash, color=:black,
      xlabel="Real Part", ylabel="Imaginary Part",
      label="Unit Circle", aspect_ratio=:equal)

display(plot!())

tf2zpk