我想用C来计算我正在使用的软件中最后1000个模拟步骤的平均值。 求解器的步长为1 ms,其中一个信号正在振荡,因此我希望将该信号滤波为更平滑。我们的软件使我们能够使用c代码作为接口,这意味着我将信号(振荡的信号)作为[0]变量驱动到C代码中,而我从c代码接收的信号是y [0],它代表过滤后的信号。每个步骤都会交换c代码和软件之间的信息。
现在我想知道这段代码应该是什么样的。代码的想法是计算最后n个步骤的每个时间步长平均值,其中n值确定我想要考虑的历史时间步数。我会从n = 1000开始,然后根据情况减少/增加这个值。
答案 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;
}