当前位置:   article > 正文

基于C语言的滑动平均滤波算法_滑动窗口滤波算法c

滑动窗口滤波算法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);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/1013002
推荐阅读
相关标签
  

闽ICP备14008679号