大家好我正在研究一个项目,我必须计算ADC读数的移动平均值。来自ADC的数据代表正弦波。
这是我用来获取给定信号的移动平均值的代码。
longNew = (8 bit data from ADC);
longNew = longNew << 8;
//Division
longNew = longNew >> 8; //255 Samples
longTemp = avgALong >> 8;
avgALong -= longTemp;// Old data
avgALong += longNew;// New Data
avgA = avgALong >> 8;//256 Point Average
参考图像
请参考此图像查看相对于参考(或avgA)的上限和下限
目前我正在使用常数值来获取我的应用的电压上限和下限 我正在计算如下
upper_limit = avgA + Delta(x); lower_limit = avgA - Delta(x);
就我而言,我正在服用Delta(x)= 15。
我想根据信号强度计算这个常量表达式或Delta(x)。 信号的最大电压电平为255或5V。 信号的最小电压电平经常变化,因为恒定值对于确定下限和上限的我的应用是无用的。
请帮忙
谢谢
答案 0 :(得分:1)
现在有关于发生了什么的描述,我想你想要三个平均值:
upper_limit
当您确定本地最大值时,请将它们推入此平均值。lower_limit
当您确定本地最小值时,请将它们推入此平均值。您的delta将是(upper_limit-lower_limit)/8
(或4,或其他)。您的滞后点为upper_limit - delta
和lower_limit + delta
。
每次转换到&#39; 1&#39;时,将当前的本地最小值推入lower_limit
移动平均线,然后开始搜索新的局部最大值。当您转换为&#39; 0&#39;时,将本地最大值推入upper_limit
移动平均线并开始搜索新的本地最小值。
如果您的信号强度发生巨大变化,则会出现问题(您可能会遇到信号突然下降到滞后带并且您再也无法获得更多转换的点)。您可以通过以下几种方式解决这个问题:
或者
upper_limit
和lower_limit
稍微靠近在一起。最终它们会崩溃到你再次开始检测转换的程度。带上一粒盐。如果你为一个学校项目做这件事,它几乎肯定不会与你教授正在寻找的任何学术方法相匹配。