前言
github源码:https://github.com/simplefoc/Arduino-FOC/tree/master/src/common
低通滤波器(Low-Pass Filter)是一种信号处理工具,它的作用是:让变化缓慢的信号通过,过滤掉变化剧烈(噪声)的信号 。
在电机控制中,传感器读到的速度、电流值经常带有噪声抖动,低通滤波器就是用来平滑这些数值的。

一、lowpass_filter.h
cpp
class LowPassFilter {
public:
LowPassFilter(float Tf); // 构造函数,传入时间常数
float operator() (float x); // 重载()运算符,让对象像函数一样调用
float Tf; // 时间常数(越大=越平滑,响应越慢)
protected:
unsigned long timestamp_prev; // 上次调用的时间戳(微秒)
float y_prev; // 上次的滤波输出值
};
关键概念 --- Tf 时间常数:
Tf单位是秒Tf越大 → 滤波越强,信号越平滑,但响应越迟钝Tf越小 → 几乎不滤波,跟随输入但噪声多- 典型值:
0.01f(10ms)用于电流,0.1f(100ms)用于速度
二、lowpass_filter.cpp
2.1、构造函数
cpp
LowPassFilter::LowPassFilter(float time_constant)
: Tf(time_constant) // 记录时间常数
, y_prev(0.0f) // 初始输出为0
{
timestamp_prev = _micros(); // 记录当前时间(微秒)
}
2.2、核心滤波函数operator()
cpp
float LowPassFilter::operator() (float x)
{
unsigned long timestamp = _micros();
// 距离上次调用过了多少秒。
float dt = (timestamp - timestamp_prev)*1e-6f; // 换算成秒
if (dt < 0.0f ) dt = 1e-3f; // 时间溢出保护 → 用1ms代替
else if(dt > 0.3f) { // 超过0.3秒没调用
y_prev = x; // 直接输出当前值(认为系统停了)
timestamp_prev = timestamp;
return x;
}
float alpha = Tf/(Tf + dt); // 核心公式!
float y = alpha*y_prev + (1.0f - alpha)*x; // 加权混合
y_prev = y;
timestamp_prev = timestamp;
return y;
}
三、理解核心公式
这是整个代码最重要的两行:
cpp
float alpha = Tf/(Tf + dt); // 核心公式!
float y = alpha*y_prev + (1.0f - alpha)*x; // 加权混合

直觉理解:
alpha接近 1(如 0.99) → 90%相信旧值,10%相信新输入 → 非常平滑,很迟钝alpha接近 0(如 0.1) → 10%旧值,90%新输入 → 几乎不滤波,跟随快但噪声多
四、如何使用这个类
cpp
// 创建一个时间常数为0.01秒的滤波器
LowPassFilter lpf(0.01f);
// 在循环中调用(像函数一样用)
float raw_speed = sensor.read(); // 读到带噪声的速度
float smooth_speed = lpf(raw_speed); // 滤波后的平滑速度
operator() 的重载让对象可以直接当函数调用,写法非常简洁。
五、总结

六、Tf的数值怎样选取? 比如电流环20KHz,速度环1KHz。
6.1、先算出dt

6.2、理解alpha和Tf的关系
alpha = Tf / (Tf + dt)
alpha 决定了每次保留多少旧值 。实际工程中,alpha 的合理范围是 0.8 ~ 0.98:
- 低于 0.8 → 几乎不滤波,噪声太多
- 高于 0.98 → 延迟太大,控制器反应迟钝
由此可以反推 Tf :
Tf = alpha × dt / (1 - alpha)

实际项目参数设置:

6.3、关键约束:电流环Tf 必须远小于速度环周期
电流环的 Tf 引入延迟,这个延迟会传递到速度环。速度环周期是 1ms,所以电流环滤波器的延迟必须远小于 1ms:
电流环 Tf = 0.0005f(0.5ms)< 速度环 dt(1ms)✅ 合理
电流环 Tf = 0.005f (5ms) >> 速度环 dt(1ms)❌ 危险,会破坏速度环稳定性