这篇博文以最简单的一阶低通滤波器为例,来叙述一个滤波器从设计到嵌入式实现的过程:
对于一个一阶低通滤波器,其控制模型就是一个简单的惯性环节,写成传递函数的形式: H ( s ) = 1 T s + 1 H(s)= \frac {1} {Ts+1} H(s)=Ts+11, T T T为时间常数,令 1 T = w c \frac {1}{T}=w_c T1=wc, w c w_c wc为截止频率,单位为 r a d / s rad/s rad/s,令 2 π f c = w c 2\pi f_c=w_c 2πfc=wc,截止频率 f c f_c fc的单位为 h z hz hz。
我们令这个低通滤波器的截止频率为25hz,画出其bode图如下:
可以看到,幅值下降 − 3 d B -3dB −3dB处,对应截止频率 25 h z 25hz 25hz;我们现在得到了一个简单的一阶低通滤波器的传递函数表达,接下来需要对上述滤波器进行离散化处理(z变换),以便在嵌入式平台实现,通过上一节我们知道z变换有很多种方法,但是对低通滤波器来说,一般使用一阶向后差分,其表达形式如下:
s = 1 − z − 1 T s s=\frac{1-z^{-1}}{T_s} s=Ts1−z−1
带回可得:
H ( z ) = S o u t ( z ) S i n ( z ) = T s 1 − z − 1 2 π f c + T s H(z)=\frac{ S_{out}(z)}{S_{in}(z)}=\frac{T_s}{\frac{1-z^{-1}}{2\pi f_c}+T_s} H(z)=Sin(z)Sout(z)=2πfc1−z−1+TsTs
令 R C = 1 2 π f c RC=\frac{1}{2\pi f_c} RC=2πfc1,整理可得:
S o u t ( z ) = R C R C + T s S o u t ( z ) z − 1 + T s R C + T s S i n ( z ) S_{out}(z)=\frac{ RC}{ RC+T_s } S_{out}(z)z^{-1}+\frac{T_s}{RC+T_s} S_{in}(z) Sout(z)=RC+TsRCSout(z)z−1+RC+TsTsSin(z)
即:
S o u t ( n ) = R C R C + T s S o u t ( n − 1 ) + T s R C + T s S i n ( n ) S_{out}(n)=\frac{ RC}{ RC+T_s } S_{out}(n-1)+\frac{T_s}{RC+T_s} S_{in}(n) Sout(n)=RC+TsRCSout(n−1)+RC+TsTsSin(n)
令 T s R C + T s = a \frac{T_s}{RC+T_s}=a RC+TsTs=a则有:
S o u t ( n ) = a S i n ( n ) + ( 1 − a ) S o u t ( n − 1 ) S_{out}(n)= aS_{in}(n)+ (1-a)S_{out}(n-1) 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
=
y
1
+
y
2
+
y
3
y=y_1+y_2+y_3
y=y1+y2+y3,且
y
1
=
2
s
i
n
(
2
π
f
c
1
t
)
y_1=2sin(2\pi f_{c1}t)
y1=2sin(2πfc1t)
y
2
=
3.5
s
i
n
(
2
π
f
c
2
t
)
y_2=3.5sin(2\pi f_{c2}t)
y2=3.5sin(2πfc2t)
y
3
=
5
s
i
n
(
2
π
f
c
3
t
)
y_3=5sin(2\pi f_{c3}t)
y3=5sin(2πfc3t)
f
c
1
=
5
h
z
,
f
c
2
=
35
h
z
,
f
c
3
=
45
h
z
f_{c1}=5hz,f_{c2}=35hz,f_{c3}=45hz
fc1=5hz,fc2=35hz,fc3=45hz采样频率取100hz,则对该信号滤波前后的效果图如下所示:
频谱图如下所示:
可以看到,频率大于截止频率的信号幅值得到了衰减,这表明惯性滤波器可以较好的滤除掉信号中的高频部分,但是它的缺点也很明显:高频段幅值下降的不够快,并且有较大的相位滞后