我们之前谈过一阶滤波器,思路是通过离散的方式将连续滤波器转换为差分方程。
我的同事拿着我的文章,比较了代码中的二阶滤波器,说他根本看不懂。我说不可能。二阶只是一阶升级版,思路应该一样。他说他不相信你。
我一看,WTF,这个系数是怎么来的?经验公式?
这种迭代怎么会这样?没见过!
行吧,说明之前咱理解的不到位,那就从头开始讲起吧。
我们从书中发现的滤波器公式,百度,通常用传输函数来表达,这是s域下的表达形式,是连续的,我们称之为模拟滤波器。
以巴特沃斯低通滤波器为例:
相应的归一化参数表如下(如果期望直流()增益为1,则d0=a0)
这意味着,如果您根据表中的参数将其带入滤波器公式,您可以获得阶数归一化滤波器,即截止频率为1弧(hz)的滤波器。
例如,我想得到一个截止频率hz巴特沃斯二阶滤波器n=2系数带入方程,可得
有了这个归一化滤波器,我们可以很容易地得到任何截止频率的滤波器,只需要另一个截止频率wa弧度滤波器。
上述模拟滤波器传输函数的例子是为连续模拟信号设计滤波电路,组件是电阻、电容和电感。
数字滤波器的实现方法是将滤波器要完成的操作编成程序并让计算机执行,即以代码的形式执行。它面临着离散时间的数字信号,通过一定的操作将输入序列转换为输出序列。
有没有办法把连续的模拟滤波器变成离散的数字滤波器?
显然有很多种,其中最常用的一种叫做
将此公式带入传输函数,以获得z域的差分方程。
但是如果我们直接使用双线性变换进行离散化之后,会发现转换前的模拟滤波器和转换后的数字滤波器的幅频响应曲线并不一样。
可见数字滤波器曲线DF,远比模拟滤波器好AF衰减要快,也就是说,如果模拟截止频率是10hz,数字滤波器衰减更快,截止频率只有9hz。
为什么?这是因为数字截止角截止角频率 Wa模拟截止角频率关系是非线性的。
因此,在变换时,我们需要找到s域与z域变换时频率变化的对应关系。
对于s域,模拟截止频率为 Fa时有:
对z域而言,数字截止频率为fd的情况下,其中,则有:
截止频率为 Fd可获得带入双线性变换公式:
所以
模拟截止频率与数字截止频率的关系
(根据欧拉公式补充证明过程)
有了离散模式和频率对应关系,我们可以设计我们需要的数字滤波器。
数字滤波器的设计分几步?
- 根据我们想要的数字滤波频率获得我们想要的模拟滤波器频率
- 滤波器根据预期的模拟截止频率进行集成。
- 双线性变换
- 写成代码
如果我期望数字滤波器的截止频率是fd,模拟滤波器相应的截止角频率为:
去归一化只需要将模拟滤波器传递函数中的s进行如下替换即可
最后,将公式带入双线性变换离散化
因此,最终的变换方式是
ok,看起来有点复杂,没关系,举个例子
还是我们的二级巴特沃斯低通滤波器公式
可以得到一个完整的转换
为了避免太复杂,我们把常数 重新命名为
在这里,我们所有的简化都结束了。什么还是那么复杂?那我再给他们起个名字。
再改写一下
有没稍微熟悉一点?这不就是书上的公式吗?
根据我们之前的推导,这个差分方程的系数只跟数字截止频率 Fd,和采样频率 Fs 有关。
看看APM和PX4怎么用程序怎么计算这些些系数呢?(跟我们的推导一模一样)
系数有了那这样的差分方程怎么写成代码呢?转换成差分方程后,下标n就代表当前值,下标n-1代表这个数是上个周期的值,n-2代表这个数延时了两周期。
所以方程写在代码里就是:
这种形式有个名称叫做直接I型,我们可以将它化成框图形式
从框图中可以直观的看见使用了4个z^-1(延时模块),从代码里也可以看见,我们需要保存4个过去的值(x(n-2),x(n-1),y(n-2),y(n-1)),
一个二阶滤波器需要4个延时模块我们能不能化简一下呢?
我们观察上图的直接I型滤波器,可以看成是两个较小系统串联而成的系统,那么,我们将其调整一下位置,得到就像下图一样的一个新的系统。
仔细观察其实我们可以共用延时模块
这样我们只需要使用两个延时模块就行,写成代码如下
这样我们在代码里只需要保存两个数据就行了,在看看源码,是不是一模一样?
到这里我们才算完成了一个滤波器设计,完整的称呼应该叫做 二阶巴特沃斯低通滤波器使用双线性变换法的IIR数字滤波器实现。
IIR 是一种实现滤波器的方法,对数字滤波器,从实现方法上有IIR和FIR滤波器之分,他们分别对应的是不同的滤波器结构
IIR实现的最终效果就是我们刚才设计的过程对应的通用转移函数结构如下
如果使用FIR的方式实现,对应的转移函数形式如下
FIR滤波器可以对给定的率特性直接进行设计,而IIR滤波器目前最通用的方法是利用已经很成熟的模拟滤波器的设计方法来进行设计。
所以IIR可以利用不同的模拟滤波器来设计,
而模拟滤波器又有Butterworth滤波器、Chebyshev(I型、Il型)滤波器、椭圆滤波器等不同的设计方法,
对应不同的幅度平方函数,以巴特沃斯滤波器为例:
使用这种函数需要进行一些零极点配置,才能得到我们想要的传递函数,好在模拟滤波器设计非常成熟,有各种表格,我们查表就能直接得到对应的滤波器传递函数。
而双线性变换是离散化的一种方法,通过这种方式离散可以直接得到IIR的结构。
谁能想到一个二阶滤波器而已,不过十几行代码,里面有这么多数字信号处理的知识呢?OK,今天就讲这么多,我是zing,我们下期再见。