巴特沃斯(Butterworth)滤波器(二)

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

我们前面讲过很多离散化方法,其中最常用的一种叫做双线性变换
s = 2 T s 1 − z − 1 1 + z − 1 \begin{aligned} s=\frac{2}{T_{s}}\frac{1-z^{-1}}{1+z^{-1}} \end{aligned} 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 ) \begin{aligned} w_{a}=2\pi f_{a}=2f_{s}tan(\frac{\pi f_{d}}{f_{s}}) \end{aligned} wa=2πfa=2fstan(fsπfd)
去归一化只需要模拟滤波器传递函数中的s进行如下替换即可:
s → s w a \begin{aligned} s\rightarrow \frac{s}{w_{a}} \end{aligned} swas
最后使用双线性变换离散化,把公式代入
s = 2 f s 1 − z − 1 1 + z − 1 \begin{aligned} s=2f_{s}\frac{1-z^{-1}}{1+z^{-1}} \end{aligned} 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 ) \begin{aligned} s\rightarrow \frac{s}{w_{a}}=\frac{2f_{s}\frac{1-z^{-1}}{1+z^{-1}}}{sf_{s}tan(\frac{\pi f_{d}}{f_{s}})}=\frac{\frac{1-z^{-1}}{1+z^{-1}}}{tan(\frac{\pi f_{d}}{f_{s}})} \end{aligned} swas=sfstan(fsπfd)2fs1+z11z1=tan(fsπfd)1+z11z1
举个列子:
我们以归一化的二阶巴特沃斯滤波器公式为例
H ( s ) = 1 s 2 + 1.414 s + 1 \begin{aligned} H_{(s)}=\frac{1}{s^{2}+1.414s+1} \end{aligned} H(s)=s2+1.414s+11

代入完整的变换可得:

我们令
t a n ( π f d f s ) = Ω \begin{aligned} tan(\frac{\pi f_{d}}{f_{s}})=\Omega \end{aligned} 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

这种形式有个名称叫做直接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

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

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

  • 13
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 巴特沃斯带通滤波器是一种常用的数字滤波器,可以在一定频率范围内通过信号,并在其他频率范围内抑制信号。实现巴特沃斯带通滤波器的主要步骤如下: 1. 确定滤波器的通带和阻带频率,以及通带和阻带的衰减量。 2. 根据通带和阻带频率计算出滤波器的截止频率。 3. 根据截止频率计算出滤波器的阶数。 4. 根据阶数设计巴特沃斯滤波器的传递函数。 5. 将传递函数转换为巴特沃斯滤波器的差分方程式。 6. 使用差分方程式实现巴特沃斯滤波器的数字滤波器。 下面是一个用C语言实现巴特沃斯带通滤波器的示例代码: ```c #include <stdio.h> #include <math.h> #define PI 3.14159265358979323846 double b[5]; // 分子系数 double a[5]; // 分母系数 void butterworth_bandpass_filter(double f1, double f2, int n, int fs) { double w1 = 2.0 * PI * f1 / fs; double w2 = 2.0 * PI * f2 / fs; double bw = w2 - w1; double q = 1.0 / tan(bw / 2.0); double q2 = q * q; double a0 = 1.0 + sqrt(2.0) * q + q2; double a1 = 2.0 * (q2 - 1.0) / a0; double a2 = (1.0 - sqrt(2.0) * q + q2) / a0; double b0 = q2 / a0; double b1 = 2.0 * q2 / a0; double b2 = q2 / a0; b[0] = b0; b[1] = b1; b[2] = b2; a[0] = 1.0; a[1] = a1; a[2] = a2; } double butterworth_bandpass_filter_apply(double x) { static double x_1 = 0.0, x_2 = 0.0, y_1 = 0.0, y_2 = 0.0; double y = b[0] * x + b[1] * x_1 + b[2] * x_2 - a[1] * y_1 - a[2] * y_2; x_2 = x_1; x_1 = x; y_2 = y_1; y_1 = y; return y; } int main() { double x[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}; double y[10]; int i, n = 10, fs = 1000; double f1 = 50.0, f2 = 150.0; butterworth_bandpass_filter(f1, f2, 2, fs); for (i = 0; i < n; i++) { y[i] = butterworth_bandpass_filter_apply(x[i]); printf("%f -> %f\n", x[i], y[i]); } return 0; } ``` 在这个示例代码中,我们使用了一个二阶巴特沃斯滤波器来实现带通滤波器。我们先计算出了滤波器的传递函数,然后通过差分方程式来实现数字滤波器。最后,我们将这个数字滤波器应用于一组输入信号,得到了滤波后的输出信号。 ### 回答2: 巴特沃斯带通滤波器是一种常用的信号处理工具,可以在给定的频率范围内通过滤除其他频率的信号。其设计基于巴特沃斯滤波器的原理,可以通过选择适当的参数实现不同的带通滤波效果。 具体实现巴特沃斯带通滤波器的步骤如下: 1. 确定滤波器的阶数:巴特沃斯滤波器的阶数越高,滤波效果越好但计算复杂度也越高。根据滤波器的要求,选择合适的阶数。 2. 确定滤波器的通带和阻带边界:根据需要的带通范围,确定滤波器的通带上下界。 3. 计算截止频率:根据通带上下界,计算得到对应的截止频率。 4. 计算极点:利用巴特沃斯滤波器的特性,计算得到滤波器的极点。 5. 设计巴特沃斯带通滤波器传递函数:将计算得到的极点代入巴特沃斯带通滤波器的传递函数表达式中,得到滤波器的传递函数。 6. 实现滤波器:根据得到的传递函数,可以使用各种信号处理工具或编程语言中提供的函数,如Matlab中的butter函数,来实现巴特沃斯带通滤波器。 总之,巴特沃斯带通滤波器可以通过确定滤波器的阶数、通带和阻带边界、计算截止频率和极点、设计传递函数等步骤来实现。通过合理的参数选择,可以得到满足要求的带通滤波效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值