Сглаживание данных быстро и бесконечно

#c #smoothing

#c #сглаживание

Вопрос:

Я должен считывать измеренные значения (значения с плавающей запятой) и отображать их в виде трассировки в режиме реального времени. Данные зашумлены, и мне нужно сгладить трассировку. Мое текущее решение использует кольцевой буфер. В бесконечном цикле я записываю новое значение в буфер и отображаю среднее значение буфера. Я могу сделать это эффективно, сохранив сумму буфера.

 class cRingAveragerF {
public:
    cRingAveragerF(uint size, float initval) {
        m_Sum = 0;
        m_Pointer = 0;
        m_Size = size;
        m_pBuffer = new float[size];
        for (uint i = 0; i < m_Size; i  ) m_pBuffer[i] = initval;
        m_Sum = m_Size*initval;
    }

    ~cRingAveragerF() { delete[]m_pBuffer;}

    float getAv() { return m_Sum / (float)m_Size; }

    void push(float val) {
        m_Sum -= m_pBuffer[m_Pointer];
        m_Sum  = val;
        m_pBuffer[m_Pointer] = val;
        m_Pointer  ;
        if (m_Size == m_Pointer)m_Pointer = 0;
    }

private:
    uint m_Size;
    float* m_pBuffer;
    uint m_Pointer;
    float m_Sum;
};
 

Мои вопросы:

  • могу ли я повысить эффективность, например, с помощью каких-либо встроенных функций (я использую Windows VS2015 и OpenCV)?
  • Существуют ли лучшие решения для сглаживания, чем усреднение с примерно равной эффективностью?

Комментарии:

1. Самый большой вопрос: если это работает, зачем его менять? Микрооптимизация редко того стоит, и если нет проблем с производительностью, это пустая трата времени.

2. Во-вторых, несвязанный и оффтопический: почему вы используете VS 2015? Ему 5 лет, и за ним последовали уже две новые версии…

3. @JHBonarius: Во-первых, мое решение может работать, но создает задержку, тем больше буфер, во-вторых, в профессиональной среде вы не можете менять настройки каждый день. Кроме того, стандарт c не меняется за ночь.

4. ?!?!?!?!? «в профессиональной среде вы не можете менять настройки каждый день» Согласен (хотя в моей компании мы все поддерживаем VS в актуальном состоянии), но мы говорим не о днях, а о 5 годах . Говоря о стандарте C : я не уверен в поддержке C 14 в VS2015, но в то же время у нас уже есть C 17 и C 20, так что да: стандарт C изменился. Опять же: не за ночь, а через 5 лет.

5. Об увеличении задержки. Почему вы так думаете? Вы это измерили? Всегда измеряйте.