当前位置:   article > 正文

巴特沃斯(Butterworth)滤波器(二)_二阶巴特沃斯滤波器公式

二阶巴特沃斯滤波器公式

前面讲了下巴特沃斯(Butterworth)模拟滤波器的设计,这节讲下如何将模拟滤波器离散化,变成数字滤波器,然后在单片机中实现。

我们前面讲过很多离散化方法,其中最常用的一种叫做双线性变换
s = 2 T s 1 − z − 1 1 + z − 1

s=2Ts1z11+z1
s=Ts21+z11z1
把这个公式代入传递函数就可以得到一个Z域的差分方程。
但是如果我们直接使用双线性变换进行离散化后,得到的数字滤波器和模拟滤波器的幅频响应曲线并不一样。
在这里插入图片描述
可以看出数字滤波器曲线,比模拟滤波器曲线衰减的要快,如果说模拟滤波器的截止频率为10rad/s,那么数字滤波器的截止频率只有9rad/s。

这是为什么呢,因为双线性变换是近似变换,不是准确换算。那么数字滤波器的截止频率fd和模拟滤波器的截止频率fa存在着什么样的对应关系呢?
在这里插入图片描述
所以在设计数字滤波器的时候,先确定数字滤波器的截止频率,再通过上式计算对应模拟滤波器的截止频率,最后通过双线性变换法离散化,得到Z域的差分方程。
但值得一提的是,当fs>>fd时,即采样频率远大于截止频率时,可以得到:
在这里插入图片描述
模拟滤波器的截止频率等于数字滤波器的截止频率。

数字滤波器的设置步骤

  1. 根据数字滤波器的截止频率计算得到对应的模拟滤波器的截止频率;
  2. 根据得到模拟滤波器的截止频率,将滤波器传递函数去归一化;
  3. 对模拟滤波器传函进行双线性变换;
  4. 写出代码

例如:
如果我们期望的数字滤波器的截止频率为fd,对应的模拟滤波器的截止角频率为:
w a = 2 π f a = 2 f s t a n ( π f d f s )

wa=2πfa=2fstan(πfdfs)
wa=2πfa=2fstan(fsπfd)
去归一化只需要模拟滤波器传递函数中的s进行如下替换即可:
s → s w a
sswa
swas

最后使用双线性变换离散化,把公式代入
s = 2 f s 1 − z − 1 1 + z − 1
s=2fs1z11+z1
s=2fs1+z11z1

所以最终的变换方式就是
s → s w a = 2 f s 1 − z − 1 1 + z − 1 s f s t a n ( π f d f s ) = 1 − z − 1 1 + z − 1 t a n ( π f d f s )
sswa=2fs1z11+z1sfstan(πfdfs)=1z11+z1tan(πfdfs)
swas=sfstan(fsπfd)2fs1+z11z1=tan(fsπfd)1+z11z1

举个列子:
我们以归一化的二阶巴特沃斯滤波器公式为例
H ( s ) = 1 s 2 + 1.414 s + 1
H(s)=1s2+1.414s+1
H(s)=s2+1.414s+11

代入完整的变换可得:

我们令
t a n ( π f d f s ) = Ω

tan(πfdfs)=Ω
tan(fsπfd)=Ω
![在这里插入图片描述](https://img-blog.csdnimg.cn/e0254113e85b4d408c944f6374a02afc.png
我们把上面差分方程写成代码:

const float fr = sample_freq/_cutoff_freq;
const float ohm = tanf(PI/fr);
const float c = 1.0f + 1.414f*ohm + ohm*ohm;

_b0 = ohm*ohm/c;
_b1 = 2.0f*_b0;
_b2 = _b0;

_a1 = 2.0f*(ohm*ohm - 1.0f)/c;
_a2 = (1.0f - 1.414f*ohm + ohm*ohm)/c;

for i = 1:10
	xn0 = sample(i);%采样数据
	yn0 = b0*xn0 + b1*xn1 + b2*xn2 - a1*yn1 - a2*yn2;
	yn2 = yn1;
	yn1 = yn0;
	xn2 = xn1;
    xn1 = xn0;
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这种形式有个名称叫做直接I型,我们可以将它化成框图形式
在这里插入图片描述

从框图中可以直观的看见使用了4个延时模块,从代码里也可以看见,我们需要保存4个过去的值;
一个二阶滤波器需要4个延时模块我们能不能化简一下呢?
我们可以把直接I型看成B(z)和A(z)两个模块串联而成的,从系统函数出发,调换其中B(z)和A(z)的顺序不影响系统输出。即:
在这里插入图片描述
仔细观察其实我们可以共用延时模块
在这里插入图片描述
这样我们只需要使用两个延时模块就行,这个叫做直接II型结构图,写成代码如下:

for i = 1:10
    d0 = sample(i) - d1*a1 -d2*a2;
    output = d0*b0 + d1*b1 + d2*b2;
    d2 = d1;
    d1 = d0;
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这样一个巴特沃斯二阶低通数字滤波器就设置完成。

参考模型:https://download.csdn.net/download/wanrenqi/85367463
文章转载:https://zhuanlan.zhihu.com/p/357619650

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/579811
推荐阅读
相关标签
  

闽ICP备14008679号