当我在 python 中过滤信号时,它有一个内置函数可以在给定截止比和滤波器阶数(极数)的情况下生成贝塞尔滤波器系数。我正在尝试将其转换为 C 代码,但我似乎找不到用于计算系数的公式。
有人可以指出给定截止比和阶数的公式来计算 IIR 滤波器系数吗?
我正在尝试阅读 github 上的 scipy 源代码,但我很难理解它......
当我在 python 中过滤信号时,它有一个内置函数可以在给定截止比和滤波器阶数(极数)的情况下生成贝塞尔滤波器系数。我正在尝试将其转换为 C 代码,但我似乎找不到用于计算系数的公式。
有人可以指出给定截止比和阶数的公式来计算 IIR 滤波器系数吗?
我正在尝试阅读 github 上的 scipy 源代码,但我很难理解它......
你好,这是我写的。它可能比它需要的更复杂/低效。:D
实用的贝塞尔滤波器设计涉及多项式求根以生成二阶部分;我不相信有任何简单的公式。SciPy 存储滤波器系数的方式是极点和零点位置,因此代码以数字方式查找这些位置。
我最初使用的步骤是:
第 2 步从Campos-Calderón 2011生成近似根作为寻根的起点,但我不知道这是否真的有必要。大多数寻根算法只是在螺旋上使用不对称的起点等,仍然可以很好地找到答案。我以为这样会更快。
Aberth-Ehrlich 非常适合同时快速找到多个单根,通过将它们建模为相互排斥的点电荷,因此多个测试点不会落入同一个孔中。
最终我最终完全消除了第 1 步。对于 Aberth-Ehrlich 的牛顿法部分,它实际上计算的是 ,这是一个完全不同的(编译的)函数,具有相同的根,并且具有一个相对简单的导数。这可能很疯狂,效率也比它可能低,但它确实有效。(实际上来自 AMOS Fortran 库。)kve
zbesk
与:
然后在第 3 步中,我什至不使用贝塞尔多项式对函数进行归一化,因为我消除了除最后一个系数之外的所有系数的需要,并且只生成该系数会更快。
还有我后来发现的这个算法,它可能会变得更有效:Orchard 1965 - The Roots of the Maximally Flat-Delay Polynomials (Bessel filters)虽然它在高 N 时有一些数值误差,并且没有给出寻找算法旧的新近似根(只是“在方格纸上观察它”)。
但是现在您可以生成具有 3 种不同归一化的 500 阶贝塞尔滤波器,而不仅仅是从表中读取系数(不是您需要...):
查看 的源代码scipy.signal.bessel
,您不走运找到公式:他们不使用公式。
他们只是对过滤器顺序的各种值有一个很大的if
\序列:elif
if N == 0:
p = []
elif N == 1:
p = [-1]
elif N == 2:
p = [-.8660254037844386467637229 + .4999999999999999999999996j,
-.8660254037844386467637229 - .4999999999999999999999996j]
elif N == 3:
p = [-.9416000265332067855971980,
-.7456403858480766441810907 - .7113666249728352680992154j,
-.7456403858480766441810907 + .7113666249728352680992154j]
elif N == 4:
维基百科页面有一些连续域中贝塞尔滤波器的公式: where 要获得离散时间的近似等价物,您需要进行连续到离散的转换。请注意,这不一定会保留连续时间贝塞尔滤波器的良好相位特性。