AnyMath 文档

[医]常见问题

基于频率响应数据确定连续滤波器参数。

库::`工程师`

语法

函数调用

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

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

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

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

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

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

争论

输入参数

# *h* — 频率响应

+ 向量资料

Details

频率响应,定义为矢量。

# *w* — 角频率

+ 向量资料

Details

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

# *n,m* — 所需订单

+ 标量,标量

Details

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

数据类型

漂浮物32, 漂浮64</无翻译>

# *重量* — 权重系数

+ 向量资料

Details

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

数据类型

漂浮物32, 漂浮64</无翻译>

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

+ 标量,标量

Details

搜索算法中的迭代次数,作为正实标量给出。 论点 伊特尔 指定函数 *invfreqs* 当算法收敛到解时完成迭代,或者在 伊特尔 迭代,取决于首先发生的事情。

# *托尔* — 宽容

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

Details

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

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

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

输出参数

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

+ 向量资料

Details

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

数据类型

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

例子:

将传递函数转换为频率响应

Details

我们将一个简单的传递函数转换为频率响应数据,然后返回到原始滤波器系数。

import EngeeDSP.Functions: invfreqs

function freqs(b, a, n::Int)
    w = exp10.(range(-1, stop=1, length=n))
    H = complex(zeros(n))
    for i in 1:n
        s = im &ast; w[i]
        H[i] = polyval(b, s) / polyval(a, s)
    end
    return H, w
end

function polyval(coeffs, x)
    val = 0.0 + 0.0im
    for i in 1:length(coeffs)
        val += coeffs[i] &ast; x^(length(coeffs)-i)
    end
    return val
end

h, w = freqs(b, a, 64)

bb, aa = invfreqs(h, w, 4, 5)
println("bb = ", bb, "\naa = ", aa)
bb = [0.9999999999990669 1.9999999990772468 2.999999999727699 2.0000000001897797 2.999999998506294]
aa = [1.0 1.9999999990749304 2.9999999998375264 1.9999999999506228 1.000000001133613 3.9999999974508746]

变量 bb,bb机管局 等同于 ba 相应地。 但是,系统不稳定,因为 机管局 它有一个积极的实部极点。 考虑两极 bb,bb机管局,为了清楚起见,我们添加了一个单位圆。

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

invfreqs 1

我们使用函数的迭代算法 *invfreqs* 以找到系统的稳定近似值。

bbb, aaa = invfreqs(h, w, 4, 5, [], 30)
println("bbb = ", bbb, "\naaa = ", aaa)
bbb = [0.785752197354587 3.361463179107808 3.3188282441237305 3.763898679714697 -0.1609352003083818]
aaa = [1.0 4.552000944361605 9.45821054631851 8.730229236531377 7.354415003366297 0.0005058837699203762]

让我们通过绘制新极点的图形来确保系统稳定。 bbb,bbbaaa级.

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

invfreqs 2

建议

当使用高频建立高阶模型时,重要的是通过将频率除以最高频率的一半来缩放频率。 [参数:w] 以获得良好的条件值 ab. 这对应于时间尺度变化。

算法

默认函数是 *invfreqs* 使用误差方程方法根据数据确定最佳模型。 此方法发现 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.