Bayley Wang
/
foc-ed_in_the_bot_compact
robot
Diff: Filter/Filter.cpp
- Revision:
- 145:37ffa3ba3862
- Parent:
- 144:a9e7fa1c98d7
- Child:
- 146:296bcc30e65d
--- a/Filter/Filter.cpp Wed May 03 12:24:28 2017 +0000 +++ b/Filter/Filter.cpp Wed May 03 12:28:05 2017 +0000 @@ -1,121 +1,3 @@ #include "mbed.h" #include "math.h" -#include "Filter.h" - -using namespace std; - -CircularBuffer::CircularBuffer(int length) { - _length = length; - oldest_index = 0; - newest_index = -1; - num = 0; - sum = 0.0f; - - buf = (float*)malloc(_length * sizeof(float)); - sorted = (float*)malloc(_length * sizeof(float)); - for (int i = 0; i < _length; i++) { - buf[i] = 0.0f; - sorted[i] = 0.0f; - } -} - -float &CircularBuffer::at(int index) { - int actual = oldest_index + index; - if (actual >= _length) actual -= _length; - return buf[actual]; -} - -void CircularBuffer::add(float x) { - if (num < _length) { - newest_index++; - buf[newest_index] = x; - sum += x; - - /*insert x into sorted array*/ - int i = num; - while (i > 0 && sorted[i] > x) { - sorted[i] = sorted[i - 1]; - i--; - } - sorted[i] = x; - - num++; - } - else { - /*find sorted index of oldest element*/ - int removed; - for (removed = 0; removed < _length; removed++) { - if (sorted[removed] == buf[oldest_index]) break; - } - - /*update circular buffer*/ - sum -= buf[oldest_index]; - oldest_index++; - if (oldest_index >= _length) oldest_index -= _length; - newest_index++; - if (newest_index >= _length) newest_index -= _length; - buf[newest_index] = x; - sum += x; - - /*insert x*/ - int i; - if (removed == _length - 1) { - i = _length - 1; - while (i > 0 && sorted[i] > x) { - sorted[i] = sorted[i - 1]; - i--; - } - sorted[i] = x; - } - else if (removed == 0) { - i = 0; - while (i < _length - 1 && sorted[i] < x) { - sorted[i] = sorted[i + 1]; - i++; - } - sorted[i] = x; - } - else if (sorted[removed - 1] <= x && sorted[removed + 1] >= x) { - sorted[removed] = x; - } - else if (sorted[removed - 1] > x) { - i = removed; - while (i > 0 && sorted[i] > x) { - sorted[i] = sorted[i - 1]; - i--; - } - sorted[i] = x; - } - else { - i = removed; - while (i < _length - 1 && sorted[i] < x) { - sorted[i] = sorted[i + 1]; - i++; - } - sorted[i] = x; - } - } -} - -float CircularBuffer::mean() { - return sum / num; -} - -float CircularBuffer::median() { - if (num < _length) { - if (num % 2 == 1) { - return sorted[(num - 1) / 2]; - } - else { - return (sorted[num / 2] + sorted[num / 2 - 1]) / 2.0f; - } - } - else { - if (_length % 2 == 1) { - return sorted[(_length - 1) / 2]; - } - else { - return (sorted[_length / 2] + sorted[_length / 2 - 1]) / 2.0f; - } - } -} \ No newline at end of file +#include "Filter.h" \ No newline at end of file