滑动平均滤波/递推平均滤波算法【已验证】

本文中的代码,是我在做仪器中使用的(调试环境为STM32, 其他C程序也可直接使用),您可以放心调用。

说明
把连续N个采样值看成一个队列,队列长度固定为N;
每采样到一个新数据放入队尾,就扔掉队首的一个数据。把队列中的N各数据进行平均运算,即获得新的滤波结果。
优点:
对周期性干扰有良好的抑制作用,平滑度高;适用于高频振荡的系统。
缺点:
灵敏度低;
对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干扰较严重的场合。

算法:
gif.latex?y%28k%29%3Dy%28k-1%29%20+%20%5Cfrac%7B1%7D%7BN%7D%28x%28k%29-x%28k-N%29%29,其中N为滤波器长度。

方便复制的公式:y(k)=y(k−1)+ [x(k)−x(k−N)]/N

参考代码:

#define MAF_LENGTH 10 // 滑动平均滤波器长度
float MovingAverageFilter(float xi)
{
  static int8_t MAF_index = -1;
  static float buffer[MAF_LENGTH];
  static float yk_1 = 0;
  float yk = 0;
  uint8_t i = 0;
  if (MAF_index == -1)
  { // 初始化,数据未填满时,前面的数据不滤波
    for (i = 0; i < MAF_LENGTH; i++)
    {
      buffer[i] = xi;
    }
    yk_1 = xi;
    MAF_index = 0;
    yk = yk_1;
  }
  else
  {//滤波
    yk = yk_1 + (xi - buffer[MAF_index]) / MAF_LENGTH;
    buffer[MAF_index] = xi;
    MAF_index++;
    if (MAF_index >= MAF_LENGTH)
    {
      MAF_index = 0;
    }
	yk_1 = yk;
  }
  return yk;
}

 

 

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值