我目前使用以下函数计算每个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
中建议我可以用来平滑温度读数的其他功能吗?请注意,值是无符号整数而不是浮点数。
答案 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;
你需要长时间积累以保持更好的精确度。