基于C语言的滑动平均滤波算法

#define uint16_t unsigned short
#define N 10
float getValue()
{
    float rand_value;
    // srand((unsigned)time(NULL));
    rand_value = rand() % 20 + 25;
    // printf("%d  ", rand_value);
}
// 递推平均滤波法(又称滑动平均滤波法)
// 方法:把连续取N个采样值看成一个队列,队列的长度固定为N
// 每次采样到一个新数据放入队尾, 并减去原来队首的一次数据(先进先出原则)
// 把队列中的N个数据进行算术平均运算, 就可获得新的滤波结果
/* 
举例:十个数据:11 12 15 10 9 11 14 13 16 12,然后有最新的1个采样数据为15
将上述10个数据累加后先减去平均值,再将最新采样数据15加上,最后取得算数平均
*/
// 优点:对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡的系统
// 缺点:灵敏度低;对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干扰较严重的场合
// 改进方法:减去的不是队首的值,而是上一次得到的平均值
float moveAverageFilter(void)
{
    float value_buf[N]; // 能存10个数据
    float sum = 0;
    uint16_t curNum = 0;
    while (curNum < N) // 0 < 10
    {
        value_buf[curNum] = getValue();
        printf("--value_buf[%d]=%.0f", curNum, value_buf[curNum]);
        sum += value_buf[curNum]; // 累加值
        curNum++;
    }
    printf("\nold_sum = %.0f ", sum);
    printf("\nold_sum / curNum = %f ", sum / curNum);
    sum -= sum / N; // 减去初始化窗口的平均值,
    printf("\nsub_sum = %f ", sum);
    float last_value = getValue();
    printf("\nlast_value = %.0f ", last_value);
    sum += last_value; // 加上采样的最新的1个值
    printf("\nfinal_sum = %f ", sum);
    return sum / N; // 再进行新的一次算术平均
}
int main(void)
{
    float final_aver_value = moveAverageFilter();
    printf("final_aver_value = %f", final_aver_value);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值