C语言简易均值滤波器

均值滤波器就是取多个连续的数据,进行算术平均运算,得出输出数据;

为了简化运算,本文演示代码使用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));
}