嗨,我正在做一个项目,我要计算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伏特或5伏特。信号的最小电压电平经常变化,因为一个恒定的值对我的应用没有帮助,因为它决定了下限和上限。
请帮帮忙
谢谢
发布于 2015-10-28 13:33:41
现在描述一下正在发生的事情,我认为您需要三个运行平均值:
upper_limit当您确定局部最大值时,将它们推入这个平均值。lower_limit当您确定局部最小值时,将它们推到这个平均值中。您的增量将是(upper_limit-lower_limit)/8 (或4,或其他什么)。你的迟滞点是upper_limit - delta和lower_limit + delta。
每次转换到“1”时,将当前的局部最小值推入lower_limit移动平均线,然后开始搜索新的局部最大值。当您转换到“0”时,将局部最大值推入upper_limit移动平均线,并开始搜索新的局部最小值。
如果你的信号强度变化很大,就会有一个问题(你的信号会突然下降到磁滞带,再也不会有任何转变了)。你可以用几种方法解决这个问题:
或
upper_limit和lower_limit稍微靠近一点。最终,它们会崩溃到你再次开始检测过渡的程度。吃点盐吧。如果你这样做是为了一个学校的项目,它几乎肯定不会匹配任何学术方法,您的教授正在寻找。
https://stackoverflow.com/questions/33353160
复制相似问题