#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. Об увеличении задержки. Почему вы так думаете? Вы это измерили? Всегда измеряйте.