第四種:遞推平均濾波(滑動平均濾波)
所謂的遞推平均濾波就是取N組數據進行算數平均濾波然后數組左移一位扔掉第一個數把新采樣到的數據放到數組的最后一位,依次進行。這種算法的好處就是濾波后的波形平滑度很高適用于高頻震蕩系統,缺點是靈敏度很低對脈沖干擾抑制性差,而且出現一次大幅度干擾后不易快速消除干擾,浪費ARM.(浪費ARM的問題可以進行改進一下改進的方法就是不去掉數組第一個數據而是去掉數組的平均值)
//C程序
#define N 20
int value_buf[N];
int moveAverageFilter(int curValue, int *sum, int *curNum)
{
int i;
if(*curNum < N)
{
value_buf[*curNum] = curValue;
(*curNum)++;
sum += curValue;
retrun (*sum)/(*curNum);
}
else
{
//每次把后面的值往前移動一位
//****************************************
sum -= value_buf[0];
sum += curValue;
for(i = 1; i < N; i++)
{
value_buf[i-1] = value_buf[i];
}
value_buf[N-1] = curValue;
return (*sum)/N;
// **************************************/
//把新的值放在curNum%N的位置
sum -= value_buf[*curNum%N];
sum += curValue;
value_buf[*curNum%N] = curValue;
(*curNum)++;
if(*curNum == 2N)
{
(*curNum) = N;
}
}
}
//減去的值是上次的平均值
int moveAverageFilter(int *sum, int curValue, int num, int *curNum)
{
if(num <= 0)
{
return 0;
}
else
{
if(*curNum < num)
{
++(*curNum);
*sum = *sum + curValue;
return (*sum)/(*curNum);
}
else
{
*sum = *sum - (*sum)/num;
*sum = (*sum + curValue);
return *sum/num;
}
}
}