均值滤波器就是取多个连续的数据,进行算术平均运算,得出输出数据;
为了简化运算,本文演示代码使用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));
}
|