滑动平均值滤波

#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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容