#define uint16_t unsigned short
#define N 10
float getValue()
{
float rand_value;
// srand((unsigned)time(NULL));
rand_value = rand() % 20 + 25;
// printf("%d ", rand_value);
}
// 递推平均滤波法(又称滑动平均滤波法)
// 方法:把连续取N个采样值看成一个队列,队列的长度固定为N
// 每次采样到一个新数据放入队尾, 并减去原来队首的一次数据(先进先出原则)
// 把队列中的N个数据进行算术平均运算, 就可获得新的滤波结果
/*
举例:十个数据:11 12 15 10 9 11 14 13 16 12,然后有最新的1个采样数据为15
将上述10个数据累加后先减去平均值,再将最新采样数据15加上,最后取得算数平均
*/
// 优点:对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡的系统
// 缺点:灵敏度低;对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干扰较严重的场合
// 改进方法:减去的不是队首的值,而是上一次得到的平均值
float moveAverageFilter(void)
{
float value_buf[N]; // 能存10个数据
float sum = 0;
uint16_t curNum = 0;
while (curNum < N) // 0 < 10
{
value_buf[curNum] = getValue();
printf("--value_buf[%d]=%.0f", curNum, value_buf[curNum]);
sum += value_buf[curNum]; // 累加值
curNum++;
}
printf("\nold_sum = %.0f ", sum);
printf("\nold_sum / curNum = %f ", sum / curNum);
sum -= sum / N; // 减去初始化窗口的平均值,
printf("\nsub_sum = %f ", sum);
float last_value = getValue();
printf("\nlast_value = %.0f ", last_value);
sum += last_value; // 加上采样的最新的1个值
printf("\nfinal_sum = %f ", sum);
return sum / N; // 再进行新的一次算术平均
}
int main(void)
{
float final_aver_value = moveAverageFilter();
printf("final_aver_value = %f", final_aver_value);
}
07-14