SimpleFOC源码阅读学习笔记:LowPassFilter低通滤波器
大约 2 分钟
原理
公式
含义
- 是时间常数
- 是时间间隔
- 是本次输入
- 是本次滤波器输出
- 是上次滤波器输出
- K为系数 K∈[0,1]
- dt越小,约接近于
- dt越大,约接近于
K的实际意义
假设时间常数为1秒,观察dt取[0,9]时K的情况
dt | ||
---|---|---|
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | ||
6 | ||
7 | ||
8 | ||
9 |
可以发现,
- 当 时 中含有
- 当 时 中含有
- 当 时 中含有
- ...
- 当 时 中含有
- 即:
并且当 采样频率 dt = 时间常数T_f 时 滤波器表现为均值滤波
图像理解低通滤波器
所以这里的 T_f 似乎可以理解为过滤的频率
最简代码实现
class LowPassFilter{
float Tf,y_prev;
LowPassFilter(float tf){
Tf = tf;
y_prev = 0.0f;
}
Filter(float x,float dt){
float alpha = Tf/(Tf + dt);
float y = alpha * y_prev + (1.0f - alpha) * x;
y_prev = y;
}
}
源代码实现
#include "lowpass_filter.h"
LowPassFilter::LowPassFilter(float time_constant)
: Tf(time_constant)
, y_prev(0.0f)
{
timestamp_prev = _micros();
}
float LowPassFilter::operator() (float x)
{
unsigned long timestamp = _micros();
float dt = (timestamp - timestamp_prev)*1e-6f;
if (dt < 0.0f ) dt = 1e-3f;
else if(dt > 0.3f) {
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;
}
#ifndef LOWPASS_FILTER_H
#define LOWPASS_FILTER_H
#include "time_utils.h"
#include "foc_utils.h"
/**
* Low pass filter class
*/
class LowPassFilter
{
public:
/**
* @param Tf - Low pass filter time constant
*/
LowPassFilter(float Tf);
~LowPassFilter() = default;
float operator() (float x);
float Tf; //!< Low pass filter time constant
protected:
unsigned long timestamp_prev; //!< Last execution timestamp
float y_prev; //!< filtered value in previous execution step
};
#endif // LOWPASS_FILTER_H