C代码中最后1000个模拟步骤算法的平均值

时间:2015-11-10 22:30:54

标签: algorithm

我想用C来计算我正在使用的软件中最后1000个模拟步骤的平均值。 求解器的步长为1 ms,其中一个信号正在振荡,因此我希望将该信号滤波为更平滑。我们的软件使我们能够使用c代码作为接口,这意味着我将信号(振荡的信号)作为[0]变量驱动到C代码中,而我从c代码接收的信号是y [0],它代表过滤后的信号。每个步骤都会交换c代码和软件之间的信息。

现在我想知道这段代码应该是什么样的。代码的想法是计算最后n个步骤的每个时间步长平均值,其中n值确定我想要考虑的历史时间步数。我会从n = 1000开始,然后根据情况减少/增加这个值。

2 个答案:

答案 0 :(得分:1)

您可以使用Exponential Moving Average过滤器。

对于实际应用,您可以使用以下代码:

static double ema_val = 0.0;        // Initial value
static double ema_k   = 1.0 / 1000; // Weight of single event in sum

// Code for update the average value ema_val with the new_val
ema_val += ema_k * (new_val - ema_val);

答案 1 :(得分:0)

有几种可能性。

这里有一些伪代码,有一个启动阶段,直到我们有1000个值,然后位置总是有最旧值的索引,由新的替换:

init: max = 1000, total = 0, count = 0,  values[max], position = 0

step(value) {
   total += value;
   if (count == max)
      total -= values[position];
   else
      count++;
   values[position++] = value;
   if (position == max)
      position = 0;
   return total / count;
}