计算长期移动平均线

标签 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 中的另一个函数来平滑温度读数吗?请注意,这些值是无符号整数而不是 float 。

最佳答案

您可以在不进行算术平均的情况下进行平滑。例如,您可以在每次迭代中删除平均值本身,而不是转储从移动窗口中删除的特定样本。

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

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

关于计算长期移动平均线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13997106/

相关文章:

c - 功能原型(prototype)设计的重点是什么?

R:geom_smooth 的对数变换线性拟合

r - r错误: Complex matrix?

c - 我正在用C语言制作linux命令程序。我想知道代码出了什么问题?

c - 使用字符串查找数字平均值

C - 将字符串转换为变量名

c - 在C中直接输入整数

powershell - 如何使用 Test-Connection 在 Powershell 中计算平均 ping 响应时间?

sql - 获取另一个唯一 ID 中每个唯一 ID 的平均条目数

r - 平滑连续二维点