Class for automatic handling of moving averages.
MovingAverage.cpp
- Committer:
- fbcosentino
- Date:
- 2019-03-29
- Revision:
- 0:332104904b69
File content as of revision 0:332104904b69:
#include "MovingAverage.h" MovingAverage::MovingAverage(int number_of_samples) { _started = 0; _average = 0.0; _num_samples = number_of_samples; } float MovingAverage::filter(float value) { // If this filter has already started, means we have other samples if (_started) { float dropping_value; if (_samples.get(&dropping_value) == 0) { // if no errors // if value == dropping_value, average is kept the same _average = _average + ((value - dropping_value) / _num_samples); _samples.put(value); } } // If we are starting now, this sample is all we have else { // fills the buffer with the initial value for (int i=0; i < _num_samples; i++) _samples.put(value); _started = 1; _average = value; // Average is the initial value. } return _average; } // FIFO HELPER CLASS _ma_fifo::_ma_fifo() { head = 0; tail = 0; } int _ma_fifo::available() { return (_MA_FIFO_SIZE + this->head - this->tail) % _MA_FIFO_SIZE; } int _ma_fifo::free() { return (_MA_FIFO_SIZE - 1 - available()); } int _ma_fifo::put(float data) { int next; // check if FIFO has room next = (head + 1) % _MA_FIFO_SIZE; if (next == tail) return 1; // fifo full buffer[head] = data; head = next; return 0; } int _ma_fifo::get(float * data) { int next; // check if FIFO has data if (head == tail) return 1; // FIFO empty next = (tail + 1) % _MA_FIFO_SIZE; *data = buffer[tail]; tail = next; return 0; }