一阶低通滤波器系数的两种计算方法

24 阅读1分钟

在单片机控制程序中,经常能看到下面这种一阶低通滤波器:

y += alpha * (x - y);

它也可以写成离散差分方程:

y[k]=(1α)y[k1]+αx[k]y[k]=(1-\alpha)y[k-1]+\alpha x[k]

其中:

  • x[k]x[k] 是当前采样值;
  • y[k]y[k] 是当前滤波输出;
  • α\alpha 是滤波系数,通常满足 0<α10<\alpha\leq1

α\alpha 越小,滤波越强,但响应越慢;α=1\alpha=1 时输出完全等于输入,相当于没有滤波。

工程中常见两种根据截止频率计算 α\alpha 的方法:

  1. 指数映射法,即精确匹配连续系统的时间常数;
  2. 后向欧拉法,即将连续微分方程做数值离散化。

两种方法都来自同一个连续一阶低通模型,只是离散化方式不同。

1. 连续一阶低通模型

模拟RC低通滤波器满足:

τdydt+y=x\tau\frac{dy}{dt}+y=x

整理为:

dydt=xyτ\frac{dy}{dt}=\frac{x-y}{\tau}

其中 τ\tau 是滤波器时间常数。时间常数与截止频率的关系为:

τ=12πfc\tau=\frac{1}{2\pi f_c}

这里 fcf_c 的单位是Hz。公式中出现 2π2\pi,是因为微分方程使用角频率:

ωc=2πfc\omega_c=2\pi f_c

采样周期和采样频率的关系为:

Ts=1fsT_s=\frac{1}{f_s}

2. 方法一:指数映射法

假设一个采样周期内输入 xx 保持不变,定义输入与输出之间的误差:

e=xye=x-y

一阶系统的误差会按照指数规律衰减:

e(t+Ts)=e(t)eTs/τe(t+T_s)=e(t)e^{-T_s/\tau}

因此,一个采样周期后的输出为:

y[k]=x[k]+(y[k1]x[k])eTs/τy[k]=x[k]+\left(y[k-1]-x[k]\right)e^{-T_s/\tau}

整理得到:

y[k]=y[k1]+(1eTs/τ)(x[k]y[k1])y[k]=y[k-1]+\left(1-e^{-T_s/\tau}\right) \left(x[k]-y[k-1]\right)

与标准代码形式对比:

y += alpha * (x - y);

可以得到:

α=1eTs/τ\boxed{\alpha=1-e^{-T_s/\tau}}

代入 Ts=1/fsT_s=1/f_sτ=1/(2πfc)\tau=1/(2\pi f_c)

α=1e2πfc/fs\boxed{\alpha=1-e^{-2\pi f_c/f_s}}

从极点角度理解

连续一阶低通的极点是:

s=2πfcs=-2\pi f_c

经过采样后,连续极点映射到离散域:

z=esTs=e2πfc/fsz=e^{sT_s}=e^{-2\pi f_c/f_s}

而差分方程的离散极点是 z=1αz=1-\alpha,所以:

1α=e2πfc/fs1-\alpha=e^{-2\pi f_c/f_s}

最终仍然得到相同结果。

这种方法精确保持了连续系统的极点和时间常数,因此也常被称为精确极点映射或零阶保持离散化。

3. 方法二:后向欧拉法

从同一个连续微分方程出发:

dydt=xyτ\frac{dy}{dt}=\frac{x-y}{\tau}

使用后向差分近似导数:

y[k]y[k1]Ts=x[k]y[k]τ\frac{y[k]-y[k-1]}{T_s}=\frac{x[k]-y[k]}{\tau}

注意右侧使用的是当前输出 y[k]y[k],这正是“后向欧拉”名称的来源。

整理方程:

y[k]=τTs+τy[k1]+TsTs+τx[k]y[k]=\frac{\tau}{T_s+\tau}y[k-1] +\frac{T_s}{T_s+\tau}x[k]

写成标准滤波形式:

y[k]=y[k1]+α(x[k]y[k1])y[k]=y[k-1]+\alpha\left(x[k]-y[k-1]\right)

得到:

α=TsTs+τ\boxed{\alpha=\frac{T_s}{T_s+\tau}}

代入采样频率和截止频率:

α=2πfcfs+2πfc\boxed{ \alpha=\frac{2\pi f_c}{f_s+2\pi f_c} }

也可以定义:

r=2πfcfsr=\frac{2\pi f_c}{f_s}

于是:

α=r1+r\alpha=\frac{r}{1+r}

后向欧拉法属于近似离散化,但它有一个重要优点:对于正的时间常数,计算得到的 α\alpha 始终处于0到1之间,数值稳定性很好。

4. 两种方法为什么很接近

令:

r=2πfcfsr=\frac{2\pi f_c}{f_s}

指数映射法为:

αexp=1er\alpha_{exp}=1-e^{-r}

后向欧拉法为:

αBE=r1+r\alpha_{BE}=\frac{r}{1+r}

当截止频率远低于采样频率,即 r1r\ll1 时,可以做级数展开:

1er=rr22+1-e^{-r}=r-\frac{r^2}{2}+\cdots
r1+r=rr2+\frac{r}{1+r}=r-r^2+\cdots

两者的一阶项完全相同:

α2πfcfs\boxed{\alpha\approx\frac{2\pi f_c}{f_s}}

所以,当 fcf_c 远低于 fsf_s 时,两种方法的实际差别很小。截止频率越接近采样频率,两种离散化方法的差别才会逐渐明显。

5. 数值计算示例

假设:

fs=20000 Hz,fc=100 Hzf_s=20000\text{ Hz},\qquad f_c=100\text{ Hz}

指数映射法

αexp=1e2π×100/200000.03093\alpha_{exp} =1-e^{-2\pi\times100/20000} \approx0.03093

后向欧拉法

αBE=2π×10020000+2π×1000.03046\alpha_{BE} =\frac{2\pi\times100}{20000+2\pi\times100} \approx0.03046

两者相差约1.5%,在大多数电机控制滤波场景中几乎没有明显区别。

6. 20kHz采样时的参数对比

截止频率指数映射法后向欧拉法相对差异
20Hz0.0062630.0062440.31%
23.5Hz0.0073560.0073290.37%
30Hz0.0093810.0093370.47%
50Hz0.0155850.0154650.77%
100Hz0.0309280.0304591.51%
200Hz0.0608990.0591172.92%
500Hz0.1453640.1357556.61%
1kHz0.2695970.23905711.33%

可以看到,在20kHz采样、几十到几百赫兹截止频率的情况下,两种方法结果非常接近。

7. C语言实现

#include <math.h>

#define PI_F 3.14159265358979323846f

/* 方法一:指数映射,精确匹配连续时间常数 */
static float lpf_alpha_exponential(float cutoff_hz, float sample_hz)
{
    return 1.0f - expf(-2.0f * PI_F * cutoff_hz / sample_hz);
}

/* 方法二:后向欧拉,计算简单且稳定 */
static float lpf_alpha_backward_euler(float cutoff_hz, float sample_hz)
{
    float r = 2.0f * PI_F * cutoff_hz / sample_hz;
    return r / (1.0f + r);
}

/* 一阶低通滤波器 */
static float lpf_update(float input, float previous_output, float alpha)
{
    return previous_output + alpha * (input - previous_output);
}

alpha 应在初始化阶段计算一次,不建议在高频中断中反复调用 expf()

如果采样频率和截止频率都是固定常量,也可以提前计算好系数:

#define CURRENT_LPF_ALPHA 0.03093f   /* fs=20kHz, fc=100Hz, 指数映射 */

8. 应该选择哪一种

优先选择指数映射法的情况

  • 希望准确保持连续系统的时间常数;
  • 希望连续极点和离散极点严格对应;
  • 参数在初始化阶段计算,计算量不是问题。

公式为:

α=1e2πfc/fs\boxed{\alpha=1-e^{-2\pi f_c/f_s}}

可以选择后向欧拉法的情况

  • 希望计算形式简单;
  • 需要始终保证 0<α<10<\alpha<1
  • 截止频率远低于采样频率;
  • 希望沿用常见的数字RC滤波写法。

公式为:

α=2πfcfs+2πfc\boxed{\alpha=\frac{2\pi f_c}{f_s+2\pi f_c}}

9. 一个容易忽略的严谨性问题

上面两种公式的 fcf_c 都来自连续RC模型。指数映射法精确保持连续系统的时间常数,后向欧拉法近似保持连续系统的动态特性。

fcfsf_c\ll f_s 时,离散滤波器实际的-3dB频率与目标值几乎一致;当截止频率已经接近采样频率时,这种近似会出现明显偏差。此时如果必须精确控制数字域的-3dB频率,应按照离散频率响应直接求系数,或者使用双线性变换设计IIR滤波器,而不应继续使用低频近似。

总结

两种系数计算方法并不矛盾:

α=1e2πfc/fs\alpha=1-e^{-2\pi f_c/f_s}

来自连续一阶系统的精确指数响应;

α=2πfcfs+2πfc\alpha=\frac{2\pi f_c}{f_s+2\pi f_c}

来自后向欧拉离散化。

当截止频率远低于采样频率时,两者都近似为:

α2πfcfs\alpha\approx\frac{2\pi f_c}{f_s}

在常见的电机控制场景中,只要明确采样频率、截止频率和使用的离散化方法,两种公式都可以可靠使用。