长期计算移动平均线

时间:2012-12-21 20:58:20

标签: c average smoothing

我目前使用以下函数计算每个200ms发生的温度读数的移动平均值。

uint16_t ntc_average(uint16_t adcdata)
{ 

    static uint8_t      first = 1;
    static uint16_t t1,t2,t3,t4,t5;

    if(first == 1)
    {
        first = 0;
        t1 = t2 = t3 = t4 = t5 = adcdata;
    }

    t5 = t4;
    t4 = t3;
    t3 = t2;
    t2 = t1;
    t1 = adcdata;
    adcdata = (t1+t2+t3+t4+t5)/5;

    return(adcdata);
}

然而,5分是不够的,我可能需要更长的缓冲来平滑更多。例如,每10-20个读数一次或两次,该值可能会向上或向下降一点,我需要平滑这一点。增加tn变量似乎很难看......我想我可能需要t1-t50。

任何人都可以在C中建议我可以用来平滑温度读数的其他功能吗?请注意,值是无符号整数而不是浮点数。

2 个答案:

答案 0 :(得分:4)

无需算术平均值即可平滑。例如,您可以在每次迭代时删除平均值,而不是转储从移动窗口中删除的特定样本。

newAverage = (oldAverage * (windowSize - 1) + newSample) / windowSize;

对于您的系统来说,它可能或者可能不够好,但值得一试。

答案 1 :(得分:1)

通常使用简单的过滤器:

ave = ave * (1-a) + samp * a;

其中a是介于0.0和1.0之间的小常数


在s0.15中的固定点:

int32 bigAverage; 
int16 ave;
int16 sample;
int16 alpha = 32768L*(0.1) //your constant here
int16 oneLessAlpha = 32768L-alpha;

//... in loop ...
bigAverage = (bigAverage>>15)*oneLessAlpha;
bigAverage += sample*alpha;
ave = bigAverage>>15;

你需要长时间积累以保持更好的精确度。