我目前使用以下函数来计算每 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
中的另一个函数来平滑温度读数吗?请注意,这些值是无符号整数而不是 float 。
最佳答案
您可以在不进行算术平均的情况下进行平滑。例如,您可以在每次迭代中删除平均值本身,而不是转储从移动窗口中删除的特定样本。
newAverage = (oldAverage * (windowSize - 1) + newSample) / windowSize;
它对于您的系统来说可能足够好,也可能不够好,但值得一试。
关于计算长期移动平均线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13997106/