这篇博文以最简单的一阶低通滤波器为例,来叙述一个滤波器从设计到嵌入式实现的过程:
对于一个一阶低通滤波器,其控制模型就是一个简单的惯性环节,写成传递函数的形式:H(s)=Ts+11,T为时间常数,令T1=wc,wc为截止频率,单位为rad/s,令2πfc=wc,截止频率fc的单位为hz。
我们令这个低通滤波器的截止频率为25hz,画出其bode图如下:

可以看到,幅值下降−3dB处,对应截止频率25hz;我们现在得到了一个简单的一阶低通滤波器的传递函数表达,接下来需要对上述滤波器进行离散化处理(z变换),以便在嵌入式平台实现,通过上一节我们知道z变换有很多种方法,但是对低通滤波器来说,一般使用一阶向后差分,其表达形式如下:
s=Ts1−z−1
带回可得:
H(z)=Sin(z)Sout(z)=2πfc1−z−1+TsTs
令RC=2πfc1,整理可得:
Sout(z)=RC+TsRCSout(z)z−1+RC+TsTsSin(z)
即:
Sout(n)=RC+TsRCSout(n−1)+RC+TsTsSin(n)
令RC+TsTs=a则有:
Sout(n)=aSin(n)+(1−a)Sout(n−1)
下面是PX4中的一阶低通滤波器实现源码:
float BlockLowPass::update(float input)
{
if(!PX4_ISFINITE(getState())) {
setState(input);
}
float b = 2 * float(M_PI) * getFCut() * getDt();
float a = b / (1 + b);
setState(a* input + (1 - a)*getState());
return getState();
}
滤波效果测试:
令输入信号为y=y1+y2+y3,且
y1=2sin(2πfc1t)
y2=3.5sin(2πfc2t)
y3=5sin(2πfc3t)
fc1=5hz,fc2=35hz,fc3=45hz采样频率取100hz,则对该信号滤波前后的效果图如下所示:

频谱图如下所示:

可以看到,频率大于截止频率的信号幅值得到了衰减,这表明惯性滤波器可以较好的滤除掉信号中的高频部分,但是它的缺点也很明显:高频段幅值下降的不够快,并且有较大的相位滞后