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;
}
我的经验:预畸变处理很重要。如果不做tan预畸变,高频段频率响应会偏移。我在一个20kHz采样率的项目中吃过这个亏,滤波器实际截止频率比设计值偏了15%。加了预畸变后,误差控制在1%以内。

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 核心逻辑流程图

下面这张图展示了两种滤波器的设计流程和决策路径,帮你快速定位该用哪一种:

确定滤波需求 是否在反馈回路? (位置环/速度环) 巴特沃斯 通带平坦,相位小 需要陡峭截止? (前馈/预处理) 切比雪夫I型 过渡带陡,有纹波 巴特沃斯 通用选择 计算系数 + 差分方程 完成滤波器设计

4.6 实际项目中的选择建议

说了这么多理论,落地才是关键。我总结了几条实战经验:

  1. 电机速度环滤波:首选巴特沃斯。相位滞后小,系统不容易震荡。截止频率一般设为速度环带宽的3-5倍。
  2. 加速度信号预处理:如果加速度信号噪声大,又想保留高频细节,试试切比雪夫0.1dB纹波。过渡带比巴特沃斯陡20%左右。
  3. 多级滤波:不要试图用一个二阶滤波器搞定所有噪声。我习惯用两级:一级巴特沃斯滤除高频噪声,一级切比雪夫做陡峭截止。
  4. 定点数实现:在低端MCU上,把系数放大到Q15格式,用移位代替浮点运算。速度能快3-5倍。

核心总结:巴特沃斯是「稳妥之选」,切比雪夫是「激进之选」。没有绝对的好坏,只有合不合适的场景。我见过太多工程师盲目追求陡峭截止,结果系统稳定性一塌糊涂。记住:滤波器的终极目标是让系统稳定运行,而不是让频谱图好看


公众号:蓝海资料掘金营,微信deep3321