Я сглаживаю некоторые данные, используя основные Exponential Moving Average
фильтр:
int main ()
{
double a0 = 0.1;
double input = 8.0;
double z = 0.0;
for(int i=0; i < 200; i++) {
z += a0 * (input - z);
std::cout << i << "° : "<< z << std::endl;
}
}
По некоторым причинам я хотел бы делать это каждые X (= 8) шагов.
Дело в том, что на данный момент, я не знаю, как рассчитать его каждые 8 °. Я все еще обрабатываю на каждом входе и «храню» только 8 °.
Как бы вы «сохранили процессор», чтобы не рассчитывать его на каждом шаге? Есть ли серия, в которой я могу просто рассчитать значение 8 ° вперед?
Это актуальный код У меня есть (что гладко на каждом шаге):
int main ()
{
double a0 = 0.1;
double input = 8.0;
double z = 0.0;
int step = 8;for(int i=0; i < 200; i+=8) {
z += a0 * (input - z);
std::cout << i << "° : "<< z << std::endl;
int j = 1;
while (j++ < step) {
z += a0 * (input - z);
}
}
}
Я хотел бы избежать «7 шагов времени» в уникальной операции. Является ли это возможным?
Это называется экспоненциальный функция скользящего среднего по причине: разница (input - z0)
экспоненциально убывающая функция числа шагов. Фактически, после N шагов уменьшение pow(1-a0,N)
,
Теперь соответствующая математика pow(x,N) == pow(pow(x,8), N/8)
,
Других решений пока нет …