因弗里克兹
基于频率响应数据确定离散滤波器参数。
库::`工程师`
语法
函数调用
* [参数:ba]=invfreqz(___,"跟踪") -显示迭代进度的文本报告。
争论
例子:
稳定的近似传递函数
Details
我们将一个简单的传递函数转换为频率响应数据,然后返回到原始滤波器系数。
import EngeeDSP.Functions: freqz, invfreqz
a = [1 2 3 2 1 4]
b = [1 2 3 2 3]
h, w = freqz(b, a, 64)
bb, aa = invfreqz(h, w, 4, 5)
println("bb = ", bb, "\naa = ", aa)
bb = [1.000000000000525 1.9999999999978302 2.9999999999980442 1.999999999998664 2.9999999999957274]
aa = [1.0 1.9999999999999936 2.999999999994893 1.9999999999994074 1.0000000000005878 3.9999999999943077]
让我们绘制函数的零点和极点,并为清楚起见添加一个单位圆。
import Pkg
Pkg.add("ControlSystems")
using ControlSystems
H = tf(vec(bb), vec(aa))
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,
label="Unit Circle", aspect_ratio=:equal,
xlabel="Real Part", ylabel="Imaginary Part")
display(plot!())
变量 bb,bb 和 机管局 等同于 b 和 a 相应地。 然而,该系统是不稳定的,因为它在单位圆之外具有极点。 我们使用函数的迭代算法 *invfreqz* 以找到系统的稳定近似值。
bbb, aaa = invfreqz(h, w, 4, 5, [], 30)
println("bbb = ", bbb, "\naaa = ", aaa)
bbb = [0.24268035528110668 0.27880314196742667 0.006865008205357481 0.09712543692553093 0.19804400564173713]
aaa = [1.0 -0.8943888916069611 0.6953713986167904 0.9997072238456083 -0.8932896310322123 0.6949656991019518]
让我们确保极点在单位圆内。
H = tf(vec(bbb), vec(aaa))
z, p = tzeros(H), poles(H)
pzmap(H)
θ = range(0, 2π, length=200)
plot!(cos.(θ), sin.(θ),
ls=:dash, color=:black,
label="Unit Circle", aspect_ratio=:equal,
xlabel="Real Part", ylabel="Imaginary Part")
display(plot!())