赞
踩
#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); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。