查看: 1042|回复: 20

一阶低通滤波(LPF)的原理及应用(以APM/PX4飞 …

[复制链接]

40

主题

725

帖子

1450

积分

金牌飞友

Rank: 6Rank: 6

积分
1450
飞币
723
注册时间
2017-9-7
发表于 2022-10-26 21:04:34 | 显示全部楼层 |阅读模式
引言

对实际的控制系统而言,采集到的原始信号往往是有噪声的,而噪声往往会对系统的稳定性能产生隐患;或为了提取有用的控制信号,滤除不必要的频域成分,数字滤波技术必不可少,其中最常用的便是一阶低通滤波(LPF)算法。
一阶低通滤波器(Low Pass Filter,LPF),顾名思义就是当输入信号的频率在LPF设定的频率(截止频率以内时,该信号可以通过(无衰减),而当该信号的频率高于该频率时,则会产生衰减。也就是说,LPF算法可滤除(filter-out)不需要的高频信号,从而保证系统有效的频率成分。
为使大家通过该篇能对LPF以及信号处理技术的应用有一个更为深刻的理解,我将从如下5个方面来说明。
————————————————————————

  • 一阶低通滤波器的定义;
  • 一阶低通滤波器的数字实现;
  • 仿真实例分析;
  • 应用实例分析—以APM和PX4飞控两个实例来说明;
  • 具体应用中应考虑的问题
————————————————————————
一、一阶低通滤波器的定义

A Low Pass Filter is a circuit that can be designed to modify, reshape or reject all unwanted high frequencies of an electrical signal and accept or pass only those signals wanted by the circuits designer.
对于一阶低通滤波而言,从控制模型上分析就是一个一阶惯性环节,其描述形式如式所示。
H(s) = \frac{1}{\frac{s}{w_c}+1} , w_c = 2\pi*f_c ,其中 f_c 为LPF的截止频率。 (1)
Figure 1给出了一阶低通滤波器在截止频率 f_c = 20Hz ,即 H(s) = \frac{1}{\frac{s}{2\pi*20}+1} 的Bode图。由该图可知,当信号的输入频率 f>(f_c = 20Hz) 时,其信号的幅值 Mag<0dB ,即表示信号将会出现衰减,以此达到滤波的目的。

一阶低通滤波(LPF)的原理及应用(以APM/PX4飞 …-1.jpg

Fig.1 一阶低通滤波Bode图

二、一阶低通滤波器的数字实现

学过电路的都知道,RC电路便可组成一个一阶低通滤波电路(如Figure 2所示)。

一阶低通滤波(LPF)的原理及应用(以APM/PX4飞 …-2.jpg

Figure.2 一阶低通滤波原理图

由电路原理的基本知识可知该一阶RC低通滤波电路的输入输出关系(传递函数)为:
H(jw) = \frac{V_{out}}{V_{in}} = \frac{\frac{1}{jwc}}{R+\frac{1}{jwc}} = \frac{1}{jwRC + 1}---(2)
令 s=jw ,则一阶RC低通滤波在S域的传递函数如式(3)所示。将其与式(1)对比可知,有 RC = \frac{1}{2\pi*f_c} ,即可知LPF的截止频率 f_c = \frac{1}{2\pi*RC} 。当我们知道信号的有用频率段,即截止频率f_c 已知时,可设计RC的值。
H(s) = \frac{V_{out}(s)}{V_{in}(s)} = \frac{1}{RCs+1}  , s = jw      (3)
为设计数字化滤波器,我们还需对上述连续系统进行离散化处理(z变换)。由以前的知识可知,z变换有许多不同的形式,对于LPF而言,主要采用一阶后向差分法,其数学表达式如式(4)所示:
s = \frac{1-z^{-1}}{T_s} ,  其中 T_s 表示采样周期。   (4)
结合式(3)(4),可知LPF的数字化表达式为:
H(z) = \frac{V_{out}(z)}{V_{in}(z)}= \frac{1}{RC\frac{1-z^{-1}}{T_s}+1} = \frac{T_s}{RC(1-z^{-1})+T_s}     (5)
变换后可知:
V_{in}(z) = (1+\frac{RC}{T_s})V_{out}(z) - \frac{RC}{T}V_{out}(z)z^{-1}                       (6)
继续转化差分方程,则有:
V_{in}(n) = (1+\frac{RC}{T_s})V_{out}(n) - \frac{RC}{T_s}V_{out}(n-1)                     (7)
最终我们可知其LPF的差分表达式如下所示:
V_{out}(n) = V_{out}(n-1) + \frac{T_s}{T_s + RC}(V_{in}(n) - V_{out}(n-1))     (8)
滤波系数 \alpha = \frac{T_s}{T_s + RC} ,且 \alpha\in[0,1] ,则LPF的差分表达式可改写为:
V_{out}(n) = V_{out}(n-1) + \alpha(V_{in}-V_{out}(n-1))                     (9)
对式(9)进行重写,最后可知一阶低通滤波模型为:
V_{out}(n) = (1-\alpha)V_{out}(n-1) + \alpha*V_{in}                               (10)
对此,LPF完整的数学分析已经完成。在实际应用中,已知采样周期,根据实际的系统设计合适的截止频率 f_c ,即对采集的信号 V_{in}(n) 进行滤波。
三、仿真实例分析

虽然通过前面的分析,知道了LPF数学模型的由来,但实际应用中如何滤波,怎么应用可能不够直观。为使大家有一个更为深刻的理解,特以一个实例来说明。
设一个信号的时域表达式如下所示,即有三个频率成分: f_1=2Hz , f_2=30Hz , f_3=40Hz 叠加而成,其幅值分别为 A_1 = 2, A_2 = 5 , A_3 =1 0 ,令采样周期为 T_s = 0.01s 。
y(t)=2*sin(2\pi*2*t)+5*sin(2\pi*30*t)+10*sin(2\pi*40*t)
为此,设计一截止频率 f_c=10Hz 的低通滤波器,由前面的分析可知,该低通滤波器的滤波为:
\alpha=\frac{T_s}{T_s+RC}=\frac{T_s}{T_s+1/(2*\pi*f_c)}=0.3859
令滤波后的输出为 yc(t) ,由式(10)即可求得滤波后的输出 yc(t) 。图3为滤波前后时域输出图,从该图虽然能直观看出信号有所衰减,但不够直观,而通过对比滤波前后频域输出图(Fig 4)可知,能非常直观地看出频率 f_1=2Hz 的信号幅值没有变化,而频率为 f_2=30Hz , f_3=40Hz 的信号出现了衰减,即当信号的频率大于 所设定的截止频率f_c=10Hz 时,信号便会出现衰减。

一阶低通滤波(LPF)的原理及应用(以APM/PX4飞 …-3.jpg

Fig.3 滤波前后时域输出对比

一阶低通滤波(LPF)的原理及应用(以APM/PX4飞 …-4.jpg

Fig.4 滤波前后频域输出对比

四、应用实例分析

LPF的应用场合很多,相信通过前面的分析,对于其原理与应用应该有了进一步的了解。下面给出无人机飞控中的代码实例,以便能对其他项目的应用有所参考与借鉴。通过第二部分的分析,相信不难理解其中的实现原理及过程。
4.1 APM飞控LPF实例分析

APM开源飞控代码中一阶低通数字滤波器的实现如下所示,详细代码参见LowPassFilter.cpp文件。相信根据上述的分析,不难理解该功能的具体实现。
@input:sample(当前的采样值)V_in(n)   cutoff_freq(截止频率)   dt(采样周期)  
@output:_output(V_out(n))
template <class T>
T DigitalLPF<T>::apply(const T &sample, float cutoff_freq, float dt) {
    if (cutoff_freq <= 0.0f || dt <= 0.0f) {
        _output = sample;
        return _output;
    }
    float rc = 1.0f/(M_2PI*cutoff_freq);
    alpha = constrain_float(dt/(dt+rc), 0.0f, 1.0f);
    _output += (sample - _output) * alpha;
    return _output;
}
4.2PX4飞控LPF实例分析

PX4开源飞控中LPF的具体实现文件为:.\Firmware\src\lib\controllib\BlockLowPass.cpp,给出实现代码,以便参考。
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();
}五、具体应用中应考虑的问题

(1)相位滞后问题:一阶低通滤波器虽然能有效滤掉高频成分,但它会产生一定的滞后效应。如Figure 1所示,虽然在截止频率 f_c = 20Hz 处,其幅值为0dB,但相位大致为 -9^{o} ,也就是相较于原来的系统,该频段的输入信号皆产生了延时。
(2)截止频率的选择:对实际的控制系统而言,以APM为例,将滤波器的截止频率一般等于系统的带宽。而系统的带宽怎么确定呢,最粗暴的办法就是根据实际的经验有 fc =f_s/ (4\sim10) ,其中 f_s 为信号的采样频率,这一部分可参见其飞控代码中LPF的接口调用。
六、仿真实例中的代码

Ts = 0.01;
Fs = 1/Ts;

t = [0:0.01:0.99];

f1 = 2;
f2 = 30;
f3 = 40;

y1 = 2*sin(2*pi*f1*t);
y2 = 5*sin(2*pi*f2*t);
y3 = 10*sin(2*pi*f3*t);

y = y1+y2+y3;

fc = 10;
b = 2*pi*fc*Ts;
a = b/(1+b)
a1 = Ts/(Ts+1/(2*pi*fc))

L =length(t);
yc = zeros(L);
yc(1)=y(1);
for j = 2:L
yc(j) = a*y(j)+(1-a)*y(j-1);
end

f = Fs*(0:(L/2))/L;

Y = fft(y);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);


YC = fft(yc);
P4 = abs(YC/L);
P3 = P4(1:L/2+1);
P3(2:end-1) = 2*P3(2:end-1);

figure(1)
plot(t,y,t,yc);
figure(2)
plot(f,P1,f,P3);<hr/>

314

主题

348

帖子

977

积分

高级飞友

Rank: 4

积分
977
飞币
627
注册时间
2017-7-23
发表于 2022-10-26 21:16:40 | 显示全部楼层
不错,惯性滤波也讲讲呗

310

主题

349

帖子

970

积分

高级飞友

Rank: 4

积分
970
飞币
619
注册时间
2017-7-12
发表于 2022-10-26 21:28:11 | 显示全部楼层
一阶低通滤波就是个惯性环节滤波器啊!

314

主题

354

帖子

1002

积分

金牌飞友

Rank: 6Rank: 6

积分
1002
飞币
647
注册时间
2017-7-6
发表于 2022-10-26 21:34:35 | 显示全部楼层
客户给了一个脉动压差信号要求完成一阶IIR低通滤波,还要求完成惯性滤波!难道是截止频点不一样?

292

主题

335

帖子

920

积分

高级飞友

Rank: 4

积分
920
飞币
583
注册时间
2017-7-25
发表于 2022-10-26 21:46:34 | 显示全部楼层
这个不是实际的工程项目吧?

272

主题

316

帖子

868

积分

高级飞友

Rank: 4

积分
868
飞币
543
注册时间
2017-7-10
发表于 2022-10-26 21:58:39 | 显示全部楼层
写的不错。说2点。
1.惯性环节1/(Ts+1) w = 1/T 在控制原理中应该叫做转折频率,而非截止频率wc。   详见惯性环节对数频率特性。w 应该叫做转折频率,或是-3dB带宽;
截止频率wc表示开环频率特性对0dB线的穿越,所以又叫wc穿越频率,或是剪切频率;
2.LPF我都用的双线性变换,效果应该更好些。

272

主题

316

帖子

868

积分

高级飞友

Rank: 4

积分
868
飞币
543
注册时间
2017-7-10
发表于 2022-10-26 22:13:22 | 显示全部楼层
是实际的

326

主题

367

帖子

1021

积分

金牌飞友

Rank: 6Rank: 6

积分
1021
飞币
650
注册时间
2017-7-3
发表于 2022-10-26 22:23:43 | 显示全部楼层
狗头

47

主题

784

帖子

1573

积分

金牌飞友

Rank: 6Rank: 6

积分
1573
飞币
787
注册时间
2017-8-14
发表于 2022-10-26 22:30:31 | 显示全部楼层
双线性确实好一点,当时为了与飞控代码相一致,所以以后向差分为切入点。

310

主题

349

帖子

970

积分

高级飞友

Rank: 4

积分
970
飞币
619
注册时间
2017-7-12
发表于 2022-10-26 22:38:46 | 显示全部楼层
写理论结合实践的文章太少了,你这个写得非常棒,正在学习,感谢!!!

40

主题

838

帖子

1657

积分

金牌飞友

Rank: 6Rank: 6

积分
1657
飞币
817
注册时间
2017-8-23
发表于 2022-10-26 22:50:37 | 显示全部楼层
大佬,麻烦问下“二、一阶低通滤波器的数字实现”部分6到7是如何推导的?

278

主题

316

帖子

883

积分

高级飞友

Rank: 4

积分
883
飞币
575
注册时间
2017-7-7
发表于 2022-10-26 22:59:12 | 显示全部楼层
翻一翻控制理论或者信号处理就知道了哈

44

主题

837

帖子

1670

积分

金牌飞友

Rank: 6Rank: 6

积分
1670
飞币
831
注册时间
2017-8-11
发表于 2022-10-26 23:09:50 | 显示全部楼层
在截止频率处的相位延迟应该是45°,怎么图上是wc=20kHZ的时候,相位延迟是9°呢?

320

主题

363

帖子

1000

积分

金牌飞友

Rank: 6Rank: 6

积分
1000
飞币
636
注册时间
2017-7-17
发表于 2022-10-26 23:17:00 | 显示全部楼层
是的,截止频率处的相位延迟是45度,可能作者定义的截止频率和严格理论意义上的不一样吧

39

主题

804

帖子

1605

积分

金牌飞友

Rank: 6Rank: 6

积分
1605
飞币
784
注册时间
2017-8-24
发表于 2022-10-26 23:22:19 | 显示全部楼层
图上的单位不是rad/s吗,hz是2pi*rad/s

36

主题

812

帖子

1599

积分

金牌飞友

Rank: 6Rank: 6

积分
1599
飞币
785
注册时间
2017-8-13
发表于 2022-10-26 23:34:17 | 显示全部楼层
作者要说的是20Hz, 然后波特图里标的是W=20rad/s出的增益是接近于0的,得出结论在评率大于20Hz时是有衰减的,这个对应关系完全错了。如果截止频率是20H在,那么对应20Hz的增益是-3dB,而不是从20Hz开始才有衰减。

312

主题

353

帖子

983

积分

高级飞友

Rank: 4

积分
983
飞币
623
注册时间
2017-7-15
发表于 2022-10-26 23:45:29 | 显示全部楼层
我觉得作者把单位搞错了

36

主题

812

帖子

1599

积分

金牌飞友

Rank: 6Rank: 6

积分
1599
飞币
785
注册时间
2017-8-13
发表于 2022-10-26 23:53:15 | 显示全部楼层
请问您知道Fig.4 滤波前后频域输出对比是用什么模块画的吗

312

主题

349

帖子

974

积分

高级飞友

Rank: 4

积分
974
飞币
623
注册时间
2017-7-29
发表于 2022-10-27 00:02:42 | 显示全部楼层
应该是直接MATLAB程序输出的图吧~

35

主题

813

帖子

1604

积分

金牌飞友

Rank: 6Rank: 6

积分
1604
飞币
789
注册时间
2017-8-14
发表于 2022-10-27 00:12:39 | 显示全部楼层
嗯嗯是的,谢谢啦[抱抱]
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

快速回复 返回顶部 返回列表