参考模电RC滤波计算公式来计算截止频率
#define M_PI_FLOAT 3.14159265358979323846f
typedef struct LpfFilter
{
float RC;//模电RC滤波的电阻和电容值的积
float dT;//数据更新时间隔(秒)
float k;//滤波系数
float state;//滤波结果
}LpfFilter_t;
/**设置滤波的截止频率
* *filter:
* f_cut:截止频率
* dt: 数据更新时间隔(秒)
*/
void filterInit(LpfFilter_t *filter, float f_cut, float dt)
{
filter->RC = 1.0f / ( 2.0f * M_PI_FLOAT * f_cut);//参考模电RC截止频率公式
filter->dT = dT;//数据更新时间隔(秒)
filter->k = filter->dT / (filter->RC + filter->dT);//滤波系数
}
/**应用低通滤波
* *filter:
* input:新输入数据
*/
float LpfFilterApply(pt1Filter_t *filter, float input)
{
//dt固定时,截止频率越低,k越小,数据最终输出的变化越慢(高频去掉了)
//截止频率固定时,dT越大,k越小,数据最终输出的变化越慢(高频去掉了)
filter->state = filter->state + filter->k * (input - filter->state);
return filter->state;
}
参考:
https://github.com/betaflight/betaflight/blob/master/src/main/common/filter.c