我想做移动平均线或类似的东西,因为我从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发送显示值。
答案 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的效果特别好。只需关注移位结果的字大小。