请注意,我不会要求提供代码,但要提供见解,可能来自已经遇到类似问题的人。
我在mantaining在嵌入式系统中实时运行的代码。出于安全原因,必须执行新的检查。
此检查基于特定变量的积分值。积分必须跨越最后一个" T_s"秒,即在每个新周期我必须删除变量具有T_s秒前的值并添加当前值。
天真的方法是将最后一个T_s *频率浮点值存储在数组中。
以62.5Hz的频率运行,这会迅速浪费大量珍贵而有限的记忆。
是否有明显降低准确性的已知方法会显着减少此类检查的内存占用量?
该值是来自真实系统的测量值,它不是由函数生成的。
我考虑过存储N个平均值,每个M点然后积分N个平均值,这会将内存需求减少到N + M个数,这可以比T_s *频率明显小,但我想知道:
如果这已经过研究并且是最佳的"已找到点(例如,作为M的函数)。我打破了,但显然我的google-fu已经坏了,因为搜索包括"数字整合"不会导致我寻找的东西。
如果有更好的方法
我用C标记了这篇文章,因为这是该项目的官方语言,不幸的是,任何在ANSI-C中不起作用的解决方案对我来说都不可行。
答案 0 :(得分:0)
我似乎无法找到只描述三个(?)变量的统计计算的网页。也许你在google-fu恢复的时候会这样做。
唉,如果你不需要100%的准确度,但可以使用平均值,你可以这样做:
avg = (avg * 0.95) + ((newValue - avg) * 0.05);
这将为您提供旧值的近似平均值,其中最近的值(newValue
)的影响力不超过1/20;结果乘以20基本上是你的平均积分。当然,您可以将两个常数分别调整为1-(1/N)
和1/N
的任意值,以便考虑任何数量N
的样本。
编辑:
"On-line" (iterator) algorithms for estimating statistical median, mode, skewness, kurtosis?
和
https://math.stackexchange.com/questions/106700/incremental-averageing
也可能有一些有用的答案。