1. 级联惯性滤波器概述
在信号处理领域,级联惯性滤波器是一种常见的数字滤波器结构。它通过将多个一阶惯性环节串联起来,实现对输入信号的平滑处理和噪声抑制。这种滤波器结构简单、计算量小,在嵌入式系统、工业控制和实时信号处理中有着广泛应用。
我第一次接触级联惯性滤波器是在一个电机控制项目中。当时需要处理编码器反馈信号中的高频噪声,但受限于MCU的计算能力,无法使用复杂的IIR或FIR滤波器。级联惯性滤波器以其简洁的结构和良好的滤波效果,完美解决了这个问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 滤波器原理分析
2.1 一阶惯性环节
级联惯性滤波器的基础是一阶惯性环节,其传递函数为:
H(s) = 1 / (τs + 1)
其中τ为时间常数,决定了滤波器的截止频率。在离散域中,常用后向差分法将其转换为差分方程:
y[n] = αx[n] + (1-α)y[n-1]
这里α=Δt/(τ+Δt),Δt为采样周期。这个简单的递归公式就是实现滤波器的核心。
2.2 级联结构特性
将N个一阶惯性环节串联起来,就构成了N阶级联惯性滤波器。其传递函数为各环节传递函数的乘积:
H(s) = Π(1/(τ_is + 1))
级联结构具有以下特点:
- 幅频特性更陡峭,阻带衰减更快
- 相位延迟随阶数增加而增大
- 实现简单,只需重复一阶环节的计算
- 参数调整灵活,各环节时间常数可不同
3. C语言实现方案
3.1 基本实现框架
下面是一个通用的N阶级联惯性滤波器实现框架:
c复制typedef struct {
float alpha; // 滤波系数
float prev_out; // 上一时刻输出
} InertialFilter;
void initFilter(InertialFilter* f, float alpha) {
f->alpha = alpha;
f->prev_out = 0.0f;
}
float updateFilter(InertialFilter* f, float input) {
f->prev_out = f->alpha * input + (1 - f->alpha) * f->prev_out;
return f->prev_out;
}
float cascadeFilter(InertialFilter filters[], int n, float input) {
float output = input;
for (int i = 0; i < n; i++) {
output = updateFilter(&filters[i], output);
}
return output;
}
3.2 参数计算与初始化
滤波器性能主要取决于两个参数:
- 截止频率fc:决定滤波器的频响特性
- 阶数N:影响过渡带陡峭程度
参数计算公式:
α = 2πfcΔt / (2πfcΔt + 1)
实际使用中,建议:
- 采样频率应至少是截止频率的10倍
- 阶数通常选择2-4阶,过高会导致相位延迟过大
初始化示例:
c复制#define NUM_STAGES 3
#define SAMPLE_TIME 0.001f // 1ms采样周期
#define CUTOFF_FREQ 10.0f // 10Hz截止频率
InertialFilter filters[NUM_ST
