#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);
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐