1. 一阶RC低通滤波器的连续域数学模型

1.1 数学模型的推导

在这里插入图片描述

上图是RC低通滤波器的电路模型,根据基尔霍夫定律可知
在这里插入图片描述

即:
在这里插入图片描述

根据电容的特性可知:
在这里插入图片描述

零状态条件下的时域响应可表示为:
在这里插入图片描述

定义时间常数τ=RC,对上述微分方程进行拉氏变换,可得:
在这里插入图片描述

在这里插入图片描述

由此可得传递函数:
在这里插入图片描述

即频域数学模型为:

在这里插入图片描述

1.2 频率特性

相频特性:
在这里插入图片描述

幅频特性:
在这里插入图片描述

R=100Ω,C=100nF为例,该低通滤波器的频率特性如下:

1.3 物理作用

输入一个阶跃信号,经过时间τ之后,输出大约为阶跃量的63%,滞后作用。
在这里插入图片描述

2. 一阶RC低通滤波器的算法推导

2.1 离散化

采用一阶后向差分法将传递函数G(s)从S域转化到Z域,其中一阶后向差分中S域与Z域的变化关系是:

其中T是采样周期,带入传递函数G(s)中得:

Z反变换求差分方程后可得:

可得

2.2 滤波系数

关于滤波系数A,根据幅频特性

代入

可以得到滤波系数A与截止频率f的关系:

3. 一阶RC低通滤波器的C语言实现

#define a 0.01               // 滤波系数a(0-1) 
	
static float oldOutData = 0; //上一次滤波值
	
char filter(void)
{
	nowData  = get_Data();  //本次滤波值
	nowOutData = a * nowData  + (1.0f - a) * oldOutData;
	oldOutData = nowOutData;
	return nowOutData;  
}

4. 缺点及改善方法

4.1 缺点

  • 仍然存在灵敏度与平稳度之间的矛盾;
  • 小数舍弃带来的误差(单片机很少采用浮点数,小数位要么舍弃,要么四舍五入)。

4.2 改善方法——动态调整滤波系数

4.2.1 实现功能

  • 当数据快速变化时,滤波结果能及时跟进,并且数据的变化越快,灵敏度应该越高(灵敏度优先原则);
  • 当数据趋于稳定,并在一个范围内振荡时,滤波结果能趋于平稳(平稳度优先原则);
  • 当数据稳定后,滤波结果能逼近并最终等于采样数据(消除因计算中小数带来的误差)。

4.2.2 调整前判断

  • 数据变化方向是否为同一个方向(如当连续两次的采样值都比其上次滤波结果大时,视为变化方向一致,否则视为不一致);
  • 数据变化是否较快(主要是判断采样值和上一次滤波结果之间的差值)。

4.2.3 调整原则

  • 当两次数据变化不一致时,说明有抖动,将滤波系数清零,忽略本次新采样值;
  • 当数据持续向一个方向变化时,逐渐提高滤波系数,提供本次采样值得权;
  • 当数据变化较快(差值>消抖计数加速反应阈值)时,要加速提高滤波系数。