本文中的代码,是我在做仪器中使用的(调试环境为STM32, 其他C程序也可直接使用),您可以放心调用。
说明:
把连续N个采样值看成一个队列,队列长度固定为N;
每采样到一个新数据放入队尾,就扔掉队首的一个数据。把队列中的N各数据进行平均运算,即获得新的滤波结果。
优点:
对周期性干扰有良好的抑制作用,平滑度高;适用于高频振荡的系统。
缺点:
灵敏度低;
对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干扰较严重的场合。
算法:
,其中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;
}