diff --git a/Drivers/Filter/LowPassFilter.c b/Drivers/Filter/LowPassFilter.c index 49c4da5..f4879c8 100644 --- a/Drivers/Filter/LowPassFilter.c +++ b/Drivers/Filter/LowPassFilter.c @@ -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; } \ No newline at end of file diff --git a/Drivers/Filter/LowPassFilter.h b/Drivers/Filter/LowPassFilter.h index 53fa63b..00d2d91 100644 --- a/Drivers/Filter/LowPassFilter.h +++ b/Drivers/Filter/LowPassFilter.h @@ -9,6 +9,8 @@ typedef struct { float alpha; // 滤波器系数 float previous; // 上一次的输出值 + float x; // 上一次的输入值 + uint8_t times; // 次数 } SL_LowPassFilter; extern SL_LowPassFilter low_pass_filter_x;