4、二阶低通滤波:巴特沃斯与切比雪夫滤波器设计,代码实现与性能对比
聊到二阶低通滤波,很多同学第一反应就是「不就是个二阶RC嘛」。嗯,没那么简单。实际工程中,我们面对的是噪声频谱复杂、实时性要求高的运动控制系统。这时候,巴特沃斯和切比雪夫这两个名字就会频繁出现。
我个人习惯把这两种滤波器比作「温和派」和「激进派」。巴特沃斯追求通带平坦,切比雪夫追求陡峭截止。你想想看,在电机速度环里,如果滤波器相位滞后太大,系统就容易震荡。所以选谁、怎么调,是个真功夫。
4.1 为什么是二阶?
一阶滤波器太软,衰减斜率只有-20dB/dec。三阶以上呢?计算量大,相位滞后严重,在嵌入式MCU上跑起来吃力。二阶是个黄金平衡点——衰减斜率-40dB/dec,相位裕度可控,代码量也适中。
我在做伺服驱动器项目时,就吃过一阶滤波的亏。电机在低速运行时,振动噪声滤不干净,速度反馈抖动得厉害。换成二阶巴特沃斯后,问题立马解决。嗯,这里要注意:阶数不是越高越好,够用就行。
4.2 巴特沃斯滤波器设计
巴特沃斯的核心思想:通带内幅频特性最平坦。没有纹波,相位响应相对线性。适合对信号保真度要求高的场景,比如位置环的前馈补偿。
二阶巴特沃斯的传递函数标准形式:
H(s) = ωₙ² / (s² + 1.414·ωₙ·s + ωₙ²)
其中 ωₙ = 2πfₙ,fₙ 是截止频率。系数1.414就是传说中的阻尼比ζ=0.707,对应临界阻尼状态。
双线性变换法离散化(我常用的方法):
// 巴特沃斯二阶低通滤波器系数计算
// 输入:采样周期Ts,截止频率fc
float Ts = 0.001f; // 1kHz采样
float fc = 20.0f; // 20Hz截止频率
float wc = 2.0f * M_PI * fc;
float k = wc / tanf(wc * Ts / 2.0f); // 预畸变
float a0 = k*k + 1.414f*wc*k + wc*wc;
float a1 = 2.0f*(wc*wc - k*k);
float a2 = k*k - 1.414f*wc*k + wc*wc;
float b0 = wc*wc / a0;
float b1 = 2.0f*wc*wc / a0;
float b2 = wc*wc / a0;
// 差分方程实现
float butterworth_filter(float x) {
static float x1=0, x2=0, y1=0, y2=0;
float y = b0*x + b1*x1 + b2*x2 - a1*y1 - a2*y2;
x2 = x1; x1 = x;
y2 = y1; y1 = y;
return y;
}
4.3 切比雪夫滤波器设计
切比雪夫分两种:I型(通带纹波)和II型(阻带纹波)。运动控制中常用切比雪夫I型,因为它过渡带更陡。代价是通带内有纹波,说白了就是幅频特性有起伏。
二阶切比雪夫I型的传递函数:
H(s) = ωₙ² / (s² + α·ωₙ·s + ωₙ²)
α 由纹波系数 ε 决定:α = √(2) / √(1 + √(1+ε²))。当纹波为0.5dB时,α≈1.361。你看,比巴特沃斯的1.414小,说明阻尼更小,过渡带更陡。
// 切比雪夫二阶低通滤波器系数计算
// 输入:采样周期Ts,截止频率fc,通带纹波Rp(dB)
float Ts = 0.001f;
float fc = 20.0f;
float Rp = 0.5f; // 0.5dB纹波
float eps = sqrtf(powf(10.0f, Rp/10.0f) - 1.0f);
float alpha = sqrtf(2.0f) / sqrtf(1.0f + sqrtf(1.0f + eps*eps));
float wc = 2.0f * M_PI * fc;
float k = wc / tanf(wc * Ts / 2.0f);
float a0 = k*k + alpha*wc*k + wc*wc;
float a1 = 2.0f*(wc*wc - k*k);
float a2 = k*k - alpha*wc*k + wc*wc;
float b0 = wc*wc / a0;
float b1 = 2.0f*wc*wc / a0;
float b2 = wc*wc / a0;
// 差分方程与巴特沃斯相同,只是系数不同
float chebyshev_filter(float x) {
static float x1=0, x2=0, y1=0, y2=0;
float y = b0*x + b1*x1 + b2*x2 - a1*y1 - a2*y2;
x2 = x1; x1 = x;
y2 = y1; y1 = y;
return y;
}
4.4 性能对比:一张表说清楚
| 指标 | 巴特沃斯 | 切比雪夫I型 |
|---|---|---|
| 通带平坦度 | 极好(无纹波) | 有纹波(可设计) |
| 过渡带陡峭度 | 一般 | 较陡(纹波越大越陡) |
| 相位滞后 | 较小 | 较大 |
| 阶跃响应超调 | 约4.3% | 约10-20%(视纹波而定) |
| 适用场景 | 位置环、速度环反馈 | 前馈、信号预处理 |
| 计算量 | 低 | 低(与巴特沃斯相同) |
从表中可以看出,两者计算量几乎一样,差别在于幅频特性和相频特性的取舍。我个人的选择原则是:
- 反馈回路用巴特沃斯,保证稳定性
- 前馈路径或离线数据处理用切比雪夫,追求陡峭截止
- 如果对相位不敏感,切比雪夫0.1dB纹波版本是个好折中
4.5 核心逻辑流程图
下面这张图展示了两种滤波器的设计流程和决策路径,帮你快速定位该用哪一种:
4.6 实际项目中的选择建议
说了这么多理论,落地才是关键。我总结了几条实战经验:
- 电机速度环滤波:首选巴特沃斯。相位滞后小,系统不容易震荡。截止频率一般设为速度环带宽的3-5倍。
- 加速度信号预处理:如果加速度信号噪声大,又想保留高频细节,试试切比雪夫0.1dB纹波。过渡带比巴特沃斯陡20%左右。
- 多级滤波:不要试图用一个二阶滤波器搞定所有噪声。我习惯用两级:一级巴特沃斯滤除高频噪声,一级切比雪夫做陡峭截止。
- 定点数实现:在低端MCU上,把系数放大到Q15格式,用移位代替浮点运算。速度能快3-5倍。
核心总结:巴特沃斯是「稳妥之选」,切比雪夫是「激进之选」。没有绝对的好坏,只有合不合适的场景。我见过太多工程师盲目追求陡峭截止,结果系统稳定性一塌糊涂。记住:滤波器的终极目标是让系统稳定运行,而不是让频谱图好看。
公众号:蓝海资料掘金营,微信deep3321