simplemovingaverage.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. class SimpleMovingAverage<Class T>
  2. {
  3. private T m_Sum = 0;
  4. private int m_Pointer = 0;
  5. private int m_Size = 0;
  6. private ref array<T> m_Samples = new array<T>();
  7. /**
  8. \brief Initialize Simple Moving Average Cyclic Buffer
  9. \param pSize \p size of the buffer
  10. \param pDefaultValue \p initial value stored in buffer
  11. */
  12. void SimpleMovingAverage(int pSize, T pDefaultValue = 0)
  13. {
  14. m_Size = pSize;
  15. for (int i = 0; i < m_Size; i++)
  16. {
  17. m_Samples.Insert(pDefaultValue);
  18. m_Sum += m_Samples[i];
  19. }
  20. }
  21. /**
  22. \brief Add new value and return average value from buffer
  23. \param newSample \p value that will be added to buffer
  24. \return average value from the buffer
  25. @code
  26. ref SimpleMovingAverage<float> m_Buffer = SimpleMovingAverage<float>(10, 0.5);
  27. float sma = m_Buffer.Add(0.2);
  28. @endcode
  29. */
  30. T Add(T newSample)
  31. {
  32. m_Sum = m_Sum - m_Samples[m_Pointer] + newSample;
  33. m_Samples[m_Pointer++] = newSample;
  34. if (m_Pointer == m_Size)
  35. {
  36. m_Pointer = 0;
  37. }
  38. return m_Sum / m_Size;
  39. }
  40. /**
  41. \brief Returns all the samples stored in the buffer
  42. */
  43. array<T> GetSamples()
  44. {
  45. return m_Samples;
  46. }
  47. }