Экспоненциальное сглаживание. Ищу алгоритм

Тема в разделе "Arduino & Shields", создана пользователем ArcticBear, 10 мар 2016.

  1. ArcticBear

    ArcticBear Нерд

  2. Limoney

    Limoney Гик

  3. Onkel

    Onkel Гуру

    пару дней назад отвечал тут как раз по теме. Проще простого, пусть у вас средняя Xav, постоянная сглаживания n, получаете значение Xi , тогда
    Xav= Xav+2(Xi-Xav)/(1+n)
    т.е. при каждом новом измерении вы добавляете к среднему 2(Xi-Xav) /(1+n), (Xi-Xav) - просто разница между полученным значением и средним, хранящимся в памяти. Нулевое значение (в начале работы программы) можно просто выставить равным полученному значению. И при каждой итерации (при получении нового значения Xi) считаете новое экспоненциальное скользящее среднее Xav. Самом собой, чтобы средняя была точно экспоненциально сглаженная, периоды пересчета Xav должны быть постоянными.
     
    ArcticBear нравится это.
  4. ArcticBear

    ArcticBear Нерд

    Я правильно понимаю, в зависимости от n ... меняется на сколько агрессивно реагирует средняя на отклонения в ряде чисел?
    а она какой вид может иметь? от 1 и выше?
     
  5. Onkel

    Onkel Гуру

    ну термин "агрессивно" наверное вряд ли подходит, но в общем вы поняли правильно. Например, при n=0 у вас всегда будет Xav=Xi, т.е. всегда будет усредненная (если так можно назвать) =полученному значению. n выбирается если уж совсем грубо - насколько вы хотите уменьшить шум, с ростом n шум усредняется и становится меньше примерно как корень из n
     
    ArcticBear нравится это.
  6. ArcticBear

    ArcticBear Нерд

    Все работает ...
    Правда добавил знак *
    Xav = Xav + 2 * (Xi — Xav) / (1 + n); вот так поехало хорошо.

    Спасибо огромное! Низкий поклон
     
  7. Onkel

    Onkel Гуру

    Да, конечно *, а то ведь в алгебре когда сомножители пишут - подразумевают знак умножения, вот по привычке....
    Ну и конечно поехало, куда оно денется!