滑动平均值滤波

2021-07-27  本文已影响0人  浙南旧事
#define MAX_COUNT 16

static float buf[MAX_COUNT];    /* 数据缓冲区 */
static float sum;               /* N个数据的算术和 */
static int cnt;                 /* 数据个数 */
static int pos;                 /* 缓冲区位置 */

/*
 * 滑动平均值滤波。
 * 每次新进来一个数据,就将最早进来的数据丢掉,然后计算包括新数据在内的N个数据的算术平均值。
 *
 * 每调用一次,就加入一个新数据,并得到当前的滤波值。
 */
float alg(float new_val)
{
    /* 用一个减法,就做了"丢弃最旧的数据,加入最新的数据"这一操作 */
    sum += (new_val - buf[pos]);

    buf[pos] = new_val;

    /* pos,cnt可能可以合在一起,但用两个变量,更清晰一些 */
    // pos &= 0xf;
    pos = (pos + 1) % MAX_COUNT;

    /* 个数不足时,cnt是实际个数,个数足够时,cnt最多也只是MAX_COUNT */
    //if (cnt < MAX_COUNT)
    //  cnt++;
    cnt += (cnt < MAX_COUNT);

    return sum / cnt;
}
上一篇 下一篇

猜你喜欢

热点阅读