均值滤波器就是取多个连续的数据,进行算术平均运算,得出输出数据;
为了简化运算,本文演示代码使用2的整数次幂进行算术平均运算,因为这种情况可以通过移位的方式来代替除法。
以下是滤波器定义的头文件:
- #ifndef __FILTER_H
- #define __FILTER_H
-
- struct filter
- {
- int buff[32]; //最大支持32级均值,可根据需要改为更大的值。
- int order;
- int shift;
- int sum;
- int index;
- };
-
- typedef struct filter filter_t;
-
- //初始化滤波器,order指定滤波常数,必须是2的N次方(1,2,4,8,16...)
- void filter_init(filter_t *flt, int order);
-
- //滤波函数,value输入待滤波的数据,返回滤波后的数据
- int filter_input(filter_t *flt, int value);
-
- //复位滤波器
- void filter_reset(filter_t *flt);
-
- #endif
- /*
- * 均值滤波器
- * 蒋晓岗<kerndev@foxmail.com>
- */
- #include <string.h>
- #include "filter.h"
-
- //均值滤波器
- int filter_input(filter_t *flt, int value)
- {
- flt->sum += value;
- flt->sum -= flt->buff[flt->index];
- flt->buff[flt->index] = value;
- flt->index = (flt->index + 1) & (flt->order - 1);
- return (flt->sum >> flt->shift);
- }
-
- //均值滤波器
- void filter_init(filter_t *flt, int order)
- {
- flt->index = 0;
- flt->sum = 0;
- flt->order = order;
- flt->shift = 0;
- while(order > 1)
- {
- flt->shift++;
- order >>= 1;
- }
- }
-
- //复位
- void filter_reset(filter_t *flt)
- {
- flt->index = 0;
- flt->sum = 0;
- memset(flt->buff, 0, sizeof(flt->buff));
- }
|