在一阶低通滤波器后,去除波动较大的波动值,解决了有水时触摸导致的风速突变
This commit is contained in:
parent
955999ece9
commit
117777c092
|
@ -10,14 +10,44 @@ void initLowPassFilter(SL_LowPassFilter* filter, float alpha)
|
|||
filter->alpha = alpha;
|
||||
// 初始化上一次的输出值为0
|
||||
filter->previous = 0.0f;
|
||||
|
||||
filter->x = 0;
|
||||
filter->times = 0;
|
||||
}
|
||||
|
||||
// 更新滤波器输出值
|
||||
float updateFilter(SL_LowPassFilter* filter, float new_input)
|
||||
{
|
||||
// 更新滤波后的值
|
||||
float output = (1.0f - filter->alpha) * filter->previous + filter->alpha * new_input;
|
||||
// 滤波新值
|
||||
float filtedData = (1.0f - filter->alpha) * filter->previous + filter->alpha * new_input;
|
||||
|
||||
//差值大于一定值认为有问题,暂定4
|
||||
if((filter->x) - filtedData > 4 || (filtedData) - filter->x > 4 )
|
||||
{
|
||||
// 将有问题的值存起来
|
||||
(filter->x) = filtedData;
|
||||
// 使用上一次的正确值当结果
|
||||
filtedData = filter->previous;
|
||||
// 清空计数
|
||||
filter->times = 0;
|
||||
}else
|
||||
{
|
||||
// 差值在允许范围内
|
||||
// 差值合理一定时间后认为数据没问题
|
||||
if(filter->times < 3)
|
||||
{
|
||||
filter->times++;
|
||||
// 没满足次数,使用旧值
|
||||
filtedData = filter->previous;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 将值存起来,直接使用滤波后的值
|
||||
(filter->x) = filtedData;
|
||||
}
|
||||
}
|
||||
|
||||
// 更新上一次的输出值
|
||||
filter->previous = output;
|
||||
return output;
|
||||
filter->previous = filtedData;
|
||||
return filtedData;
|
||||
}
|
|
@ -9,6 +9,8 @@
|
|||
typedef struct {
|
||||
float alpha; // 滤波器系数
|
||||
float previous; // 上一次的输出值
|
||||
float x; // 上一次的输入值
|
||||
uint8_t times; // 次数
|
||||
} SL_LowPassFilter;
|
||||
|
||||
extern SL_LowPassFilter low_pass_filter_x;
|
||||
|
|
Loading…
Reference in New Issue