这篇博文以最简单的一阶低通滤波器为例,来叙述一个滤波器从设计到嵌入式实现的过程:

对于一个一阶低通滤波器,其控制模型就是一个简单的惯性环节,写成传递函数的形式:H(s)=1Ts+1H(s)= \frac {1} {Ts+1}TT为时间常数,令1T=wc\frac {1}{T}=w_cwcw_c为截止频率,单位为rad/srad/s,令2πfc=wc2\pi f_c=w_c,截止频率fcf_c的单位为hzhz

我们令这个低通滤波器的截止频率为25hz,画出其bode图如下:

滤波器的设计(二)

可以看到,幅值下降3dB-3dB处,对应截止频率25hz25hz;我们现在得到了一个简单的一阶低通滤波器的传递函数表达,接下来需要对上述滤波器进行离散化处理(z变换),以便在嵌入式平台实现,通过上一节我们知道z变换有很多种方法,但是对低通滤波器来说,一般使用一阶向后差分,其表达形式如下:

s=1z1Tss=\frac{1-z^{-1}}{T_s}

带回可得:

H(z)=Sout(z)Sin(z)=Ts1z12πfc+TsH(z)=\frac{ S_{out}(z)}{S_{in}(z)}=\frac{T_s}{\frac{1-z^{-1}}{2\pi f_c}+T_s}

RC=12πfcRC=\frac{1}{2\pi f_c},整理可得:

Sout(z)=RCRC+TsSout(z)z1+TsRC+TsSin(z)S_{out}(z)=\frac{ RC}{ RC+T_s } S_{out}(z)z^{-1}+\frac{T_s}{RC+T_s} S_{in}(z)

即:

Sout(n)=RCRC+TsSout(n1)+TsRC+TsSin(n) S_{out}(n)=\frac{ RC}{ RC+T_s } S_{out}(n-1)+\frac{T_s}{RC+T_s} S_{in}(n)

TsRC+Ts=a\frac{T_s}{RC+T_s}=a则有:

Sout(n)=aSin(n)+(1a)Sout(n1) S_{out}(n)= aS_{in}(n)+ (1-a)S_{out}(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+y3y=y_1+y_2+y_3,且
y1=2sin(2πfc1t)y_1=2sin(2\pi f_{c1}t)
y2=3.5sin(2πfc2t)y_2=3.5sin(2\pi f_{c2}t)
y3=5sin(2πfc3t)y_3=5sin(2\pi f_{c3}t)
fc1=5hz,fc2=35hz,fc3=45hzf_{c1}=5hz,f_{c2}=35hz,f_{c3}=45hz采样频率取100hz,则对该信号滤波前后的效果图如下所示:

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

相关文章: