AnyMath 文档

因弗里克兹

基于频率响应数据确定离散滤波器参数。

库::`工程师`

语法

函数调用

* [参数:ba]=invfreqz(<参数:h>>,<参数:w>>,<参数:nm>>) -返回分子和分母的实系数的向量 ba 传递函数 [参数:h].

* [参数:ba]=invfreqz(<参数:h>>,<参数:w>>,<参数:nm>>,<参数:wt>>) -根据使用参数的频率对近似误差进行加权 [参数:wt].

* [参数:ba]=invfreqz(___,[参数:iter]) -提供一种算法,通过使用数值迭代方案搜索最佳近似来保证所得线性系统的稳定性。 此语法可以包括来自先前语法选项的输入参数的任何组合。

* [参数:ba]=invfreqz(___,[参数:tol]) -使用参数 [参数:tol] 来确定迭代算法的收敛性。

* [参数:ba]=invfreqz(___,"跟踪") -显示迭代进度的文本报告。

* [参数:ba]=invfreqz([参数:h],[参数:w],"复杂",[参数:nm],___) -创建一个全面的过滤器。 在这种情况下,不尊重对称性,并且频率以弧度为单位设置在从 以前 .

争论

输入参数

# *h* — 频率响应

+ 向量资料

Details

指定为矢量的频率响应。

# *w* — 角频率

+ 向量资料

Details

计算参数时的角频率 [参数:h],设置为向量。

# *n,m* — 所需订单

+ 标量,标量

Details

分子和分母中多项式的所需阶数,以正整数形式给出。

# *重量* — 权重系数

+ 向量资料

Details

指定为向量的权重系数。 权重系数的向量 重量 具有与向量相同的长度 [参数:w].

# *iter* — 搜索算法中的迭代次数

+ 标量,标量

Details

搜索算法中的迭代次数,作为正实标量给出。 论点 伊特尔 指定函数 *invfreqz* 当解决方案聚集在一起时或之后完成迭代 伊特尔 迭代,取决于首先发生的事情。

# *托尔* — 宽容

+ 0.01 (默认情况下)| 标量,标量

Details

容差设置为标量。 功能 *invfreqz* 将收敛定义为(修改的)梯度向量的范数小于自变量的值时出现的时刻 托尔.

要获得由一个单元组成的加权系数的向量,使用

invfreqz(h, w, n, m, [], iter, tol)

输出参数

# *b,a*是 传递函数的系数

+ 向量资料

Details

传递函数的系数作为向量返回。 传递函数表示为 ba 如下:

数据类型

漂浮64, 漂浮物32</无翻译> 支持复数::是

例子:

稳定的近似传递函数

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!())

invfreqz 1

变量 bb,bb机管局 等同于 ba 相应地。 然而,该系统是不稳定的,因为它在单位圆之外具有极点。 我们使用函数的迭代算法 *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!())

invfreqz 2

算法

默认函数为 *invfreqz* 使用误差方程方法根据数据确定最佳模型。 此方法发现 ba

通过创建线性方程组并使用左除法运算符求解它们 \. 这里 -多项式的傅立叶变换 ab 因此,在频率上 ,而 -频率点的数量(矢量的长度 hw). 该算法基于Levi[1]的工作。

更有效的(基于"出口误差")算法使用高斯方法。 -Newton with attenuation for iterative search[2],而第一算法的输出作为初始估计。 这解决了最小化实际和期望频率响应点之间的平方误差的加权和的直接问题。

文学作品

  1. Levi,E.C."Complex-Curve Fitting。"_IRE交易上的自动控制。_卷。 AC-4,1959,第37-44页。

  2. 丹尼斯,J.E.,Jr.和R.B.施纳贝尔。 _无约束优化和非线性方程的数学方法。_恩格尔伍悬崖,NJ:普伦蒂斯-霍尔,1983.