0

请注意,我不是要代码,而是要洞察力,可能来自已经遇到类似问题的人。

我正在维护在嵌入式系统中实时运行的代码。出于安全原因,必须执行新的检查。

该检查基于某个变量的积分值。积分必须跨越最后的“T_s”秒,即在每个新循环中,我必须删除变量在 T_s 秒前的值并添加当前值。

天真的方法是将最后的 T_s*frequency 浮点值存储在一个数组中。

以 62.5Hz 运行,这会迅速浪费大量宝贵且有限的内存。

有没有已知的方法,以明显的准确性为代价,显着减少这种检查的内存占用?

该值是来自真实系统的测量值,它不是由函数生成的。

我考虑过存储 N 个平均值,每个 M 个点,然后对 N 个平均值进行积分,这会将内存需求减少到 N+M 个数字,可以显着小于 T_s*frequency,但我想知道:

  • 如果已经对此进行了研究并找到了“最佳”点(例如,作为 M 的函数)。我搜索了,但显然我的 google-fu 坏了,因为搜索包括“数值积分”在内的任何内容都不会导致我寻找的内容。

  • 如果有更好的方法

我用 C 标记了这篇文章,因为这是该项目的官方语言,不幸的是,任何不适用于 ANSI-C 的解决方案对我来说都不可行。

4

1 回答 1

0

我似乎找不到仅描述了三个(?)变量的统计计算的互联网页面。当您的 google-fu 恢复时,您可能会这样做。

唉,如果您不需要 100% 的准确度但可以接受平均值,您可以执行以下操作:

avg = (avg * 0.95) + ((newValue - avg) * 0.05);

这将为您提供较旧值的近似平均值,其中最新值 ( newValue) 的影响不超过 1/20;结果乘以 20 基本上就是你的平均积分。当然,您可以将这两个常数分别调整为1-(1/N)和的任意值,以考虑1/N任意数量N的样本。

编辑:

用于估计统计中位数、众数、偏度、峰度的“在线”(迭代器)算法?

https://math.stackexchange.com/questions/106700/incremental-averageing

也可能有一些有用的答案。

于 2014-10-10T14:13:01.750 回答