浮动平均值,读取ADC值

时间:2017-04-26 08:09:30

标签: c average adc ansi-c

我想做移动平均线或类似的东西,因为我从ADC得到噪声值,这是我的第一次尝试,只是为了计算移动平均线,但值每次都变为0,你能帮助我吗?

这是代码的一部分,这使得这个魔术:

Customer    Jan                    Feb  
10          BaseVolume 11         BaseVolume 12
            IncrementalVolume 1   IncrementalVolume 2 
            TradeSpend 110        TradeSpend 120

20         BaseVolume 21          BaseVolume 22
           IncrementalVolume 7    IncrementalVolume 8 
           TradeSpend 210         TradeSpend 220     

此结果我通过usart发送显示值。

2 个答案:

答案 0 :(得分:1)

你的等式不正确。

然后让s_n = (sum_{i=0}^{n} x[i])/n

s_(n-1) = sum_{i=0}^{n-1} x[i])/(n-1)

sum_{i=0}^{n-1} x[i] = (n-1)*s_(n-1)
sum_{i=0}^{n} x[i] = n*s_n


sum_{i=0}^{n} x[i] = sum_{i=0}^{n-1} x[i] + x[n]

n*s_n = (n-1)*s_(n-1) + x[n] =  n*s_(n-1) + (x[n]-s_(n-1))
s_n = s_(n-1) + (x[n]-s_(n-1))/n

您必须使用

ADCaverage += (adc_result0-ADCaverage)/samples; 

答案 1 :(得分:0)

您可以使用指数移动平均线,只需要1个存储单元 y[0] = (x[0] + y[-1] * (a-1) )/a
其中 a 是过滤因子。

如果 a 是2的倍数,您可以使用班次并显着优化速度:
y[0] = ( x[0] + ( ( y[-1] << a ) - y[-1] ) ) >> a

这与左对齐ADC的效果特别好。只需关注移位结果的字大小。