C 有界数值积分

C 有界数值积分,c,memory-optimization,C,Memory Optimization,请注意,我并没有要求提供代码,而是要求提供见解,可能来自已经遇到类似问题的人 我正在编写在嵌入式系统中实时运行的代码。出于安全原因,必须执行新的检查 该检查基于某个变量的积分值。积分必须跨越最后的T_s秒,即在每个新循环中,我必须删除变量在T_s秒之前的值,并添加当前值 最简单的方法是将最后的T_*频率浮点值存储在数组中 以62.5Hz的频率运行,这会迅速浪费大量宝贵且有限的内存 是否有已知的方法可以显著降低这种检查的内存占用,但明显牺牲了准确性 该值是来自实际系统的测量值,不是由函数生成的 我

请注意,我并没有要求提供代码,而是要求提供见解,可能来自已经遇到类似问题的人

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

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

最简单的方法是将最后的T_*频率浮点值存储在数组中

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

是否有已知的方法可以显著降低这种检查的内存占用,但明显牺牲了准确性

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

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

例如,如果对此进行了研究,并找到了一个最佳点作为M的函数。我搜索过,但显然我的谷歌fu坏了,因为搜索任何东西,包括数值积分,都不会得到我想要的东西

如果有更好的方法


我给这篇文章贴上了C标签,因为这是该项目的官方语言。不幸的是,任何不能在ANSI-C中工作的解决方案对我来说都是不可行的。

我似乎找不到只描述了三个变量的统计计算的网页。当你的谷歌浏览器恢复时,也许你会这么做

唉,如果你不需要100%的准确度,但可以接受平均值,你可以做如下事情:

avg = (avg * 0.95) + ((newValue - avg) * 0.05);
这将为您提供旧值的近似平均值,其中最近一个新值的影响不超过1/20;结果乘以20,基本上就是你的平均积分。当然,你可以将这两个常数分别调整为1-1/N和1/N的任意值,对于任意数量的n个样本进行考虑。 编辑:


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

计算积分值的区间是重叠的,还是一个接一个的?@Evert只有一个区间。检查从t-t_s到t的积分,t为当前时间戳。我将其实现为最后T_s*sampletime值的数组和包含这些值之和的单独变量。在每一步中,我减去最旧的一个,加上新收到的一个,然后在数组中移动一个,在数组的顶部加上新的值。@Evert N平均值将是一个接一个的,它们之间没有重叠。@Federico您需要对每个样本进行检查,还是可以进行批处理?当我在嵌入式处理器上处理音频时,我们只会在有128个样本的情况下处理数据。你能做些类似的事情吗?@Degustaf检查必须在每个周期进行。这些链接的问题以及你的部分想法是,它们不会忘记几秒钟前发生的事情,但它们会保留这些信息。尽管如此,旧的价值观将变得越来越不重要。我会尽快测试它。顺便说一句,存储N个平均值,每个M点,然后整合N个平均值听起来很有希望。如果您需要丢弃大约60个样本的整秒,那么将每秒钟的60个样本添加/平均为每秒一个值似乎是合乎逻辑的,然后只需为所覆盖的间隔的每秒钟存储一个值。顺便说一句,2,并在数组中移动一个。您可能希望使用FIFO缓冲区、又称环形缓冲区、又称循环缓冲区的实现,以避免反复移动整个数组的内容。是的,我考虑过运行时优化版本的循环方法,谢谢您的提及。