贝塞尔低通滤波器系数公式

信息处理 低通滤波器 Python 无限脉冲响应
2022-01-29 12:12:39

当我在 python 中过滤信号时,它有一个内置函数可以在给定截止比和滤波器阶数(极数)的情况下生成贝塞尔滤波器系数。我正在尝试将其转换为 C 代码,但我似乎找不到用于计算系数的公式。

有人可以指出给定截止比和阶数的公式来计算 IIR 滤波器系数吗?

我正在尝试阅读 github 上的 scipy 源代码,但我很难理解它......

2个回答

你好,这是我写的。它可能比它需要的更复杂/低效。:D

实用的贝塞尔滤波器设计涉及多项式求根以生成二阶部分;我不相信有任何简单的公式。SciPy 存储滤波器系数的方式是极点和零点位置,因此代码以数字方式查找这些位置。

我最初使用的步骤是:

  1. 生成反向贝塞尔多项式的系数
  2. 使用Aberth-Ehrlich 方法找到多项式的根(= Bessel 滤波器的极点)
  3. 向内或向外缩放极点以标准化 -3 dB 频率、相位或群延迟。

第 2 步从Campos-Calderón 2011生成近似根作为寻根的起点,但我不知道这是否真的有必要。大多数寻根算法只是在螺旋上使用不对称的起点等,仍然可以很好地找到答案。我以为这样会更快。

Aberth-Ehrlich 非常适合同时快速找到多个单根,通过将它们建模为相互排斥的点电荷,因此多个测试点不会落入同一个孔中。

最终我最终完全消除了第 1 步。对于 Aberth-Ehrlich 的牛顿法部分,它实际上计算的是 ,这是一个完全不同的(编译的)函数,具有相同的根,并且具有一个相对简单的导数。这可能很疯狂,效率也比它可能低,但它确实有效。实际上来自 AMOS Fortran 库。)Kn+12(1x)kvezbesk

θ5(x)K5.5(1x)

5 阶反贝塞尔多项式的复图,振幅为亮度,相位为颜色 1/x 的 5.5 阶修正贝塞尔函数的复图,幅度为亮度,相位为颜色

然后在第 3 步中,我什至不使用贝塞尔多项式对函数进行归一化,因为我消除了除最后一个系数之外的所有系数的需要,并且只生成该系数会更快。

还有我后来发现的这个算法,它可能会变得更有效:Orchard 1965 - The Roots of the Maximally Flat-Delay Polynomials (Bessel filters)虽然它在高 N 时有一些数值误差,并且没有给出寻找算法旧的新近似根(只是“在方格纸上观察它”)。

但是现在您可以生成具有 3 种不同归一化的 500 阶贝塞尔滤波器,而不仅仅是从表中读取系数(不是您需要...):

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 要获得离散时间的近似等价物,您需要进行连续到离散的转换。请注意,这不一定会保留连续时间贝塞尔滤波器的良好相位特性。

θ(s)=k=0naksk
ak=(2nk)!2nlk!(nk)! for n=0,1,,n.