2015-11-10 3 views
1

Я хочу использовать C для вычисления среднего значения последних 1000 шагов моделирования внутри программного обеспечения, которое я использую. Размер шага решателя равен 1 мс, и один из сигналов колеблется, поэтому я хочу, чтобы этот сигнал был более гладким. Наше программное обеспечение позволяет нам использовать c-код в качестве интерфейса, это означает, что я управляю сигналом (тем, который колеблется) в C-код как переменная [0], и то, что я получаю от c-кода, является y [0], который представляет собой отфильтрованный сигнал. Информация между c-кодом и программным обеспечением обменивается каждый раз.Среднее значение последнего 1000 алгоритмов шагов моделирования в C-коде

Теперь я хочу знать, как должен выглядеть этот код. Идея для кода состоит в том, чтобы вычислить каждое среднее по времени шаговое значение последних n шагов, где n значение определяет, сколько периодов времени истории я хочу рассмотреть. Я начинал с n = 1000, а затем уменьшал/увеличивал это значение в зависимости от ситуации.

+0

Если плавающими вы имеете в виду, что [0] меняется каждый шаг по времени, то ответ да. Таким образом, [0] - это значение, которое поступает из моего программного обеспечения (из некоторой таблицы поиска), и каждый раз по времени a [0] имеет другое значение. C-код должен каким-то образом хранить последние 1000 точек, а затем удалять последний раз каждый шаг времени, так что среднее значение всегда выполняется для последних 1000 точек. Это только идея, как это могло бы быть, конечно, любые другие решения более приветствуются =). –

ответ

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); 
+0

Убей меня :). Конечно, это предпочтительное решение, потому что ему не нужно запоминать какой-либо массив значений. –

+0

«Память» процесса может быть отрегулирована путем настройки ema_k. Чем ниже ema_k, тем выше память (система движется медленно). ema_k = 1 => нет памяти (без фильтрации). –

+0

Это более эффективное и эффективное решение, но не то, что было задано: среднее значение последних n значений. – maraca

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; 
} 
+0

Если вы используете числа с плавающей запятой (например, double), общее количество может медленно отклоняться от реального значения, и более безопасно пересчитать его через некоторое время. – maraca

+0

Спасибо также за ваши усилия! –

Смежные вопросы