robot

Dependencies:   FastPWM3 mbed

Committer:
bwang
Date:
Wed May 03 13:27:12 2017 +0000
Revision:
147:c1b2379b8874
Parent:
146:296bcc30e65d
Child:
150:08c13bfc7417
05/03/2017 09:26 - added use_median option to circular buffers (since average filters may not want to recalculate the median every sample)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bwang 144:a9e7fa1c98d7 1 #include "mbed.h"
bwang 144:a9e7fa1c98d7 2 #include "math.h"
bwang 144:a9e7fa1c98d7 3
bwang 144:a9e7fa1c98d7 4 class CircularBuffer {
bwang 144:a9e7fa1c98d7 5 public:
bwang 147:c1b2379b8874 6 CircularBuffer(int length, bool use_median);
bwang 144:a9e7fa1c98d7 7 float oldest() {if (oldest_index >= 0) return buf[oldest_index]; return 0.0f;}
bwang 144:a9e7fa1c98d7 8 float newest() {if (newest_index >= 0) return buf[newest_index]; return 0.0f;}
bwang 144:a9e7fa1c98d7 9 int length() {return _length;}
bwang 144:a9e7fa1c98d7 10 void add(float x); /*recomputes mean, median - O(length) time*/
bwang 144:a9e7fa1c98d7 11 float &at(int index);
bwang 144:a9e7fa1c98d7 12 public:
bwang 144:a9e7fa1c98d7 13 float &operator[](int index) {return at(index);}
bwang 144:a9e7fa1c98d7 14 public:
bwang 144:a9e7fa1c98d7 15 /*O(1) time*/
bwang 144:a9e7fa1c98d7 16 float mean();
bwang 144:a9e7fa1c98d7 17 float median();
bwang 144:a9e7fa1c98d7 18 private:
bwang 144:a9e7fa1c98d7 19 int _length;
bwang 147:c1b2379b8874 20 bool _use_median;
bwang 144:a9e7fa1c98d7 21 int oldest_index, newest_index, num;
bwang 144:a9e7fa1c98d7 22 float sum;
bwang 144:a9e7fa1c98d7 23 private:
bwang 144:a9e7fa1c98d7 24 float *buf;
bwang 144:a9e7fa1c98d7 25 float *sorted;
bwang 146:296bcc30e65d 26 };
bwang 146:296bcc30e65d 27
bwang 146:296bcc30e65d 28 class Filter {
bwang 146:296bcc30e65d 29 public:
bwang 146:296bcc30e65d 30 virtual float update(float x) = 0;
bwang 146:296bcc30e65d 31 };
bwang 146:296bcc30e65d 32
bwang 146:296bcc30e65d 33 class MedianFilter : public Filter {
bwang 146:296bcc30e65d 34 public:
bwang 146:296bcc30e65d 35 MedianFilter(int length);
bwang 146:296bcc30e65d 36 virtual float update(float x);
bwang 146:296bcc30e65d 37 private:
bwang 146:296bcc30e65d 38 CircularBuffer *buf;
bwang 146:296bcc30e65d 39 };
bwang 146:296bcc30e65d 40
bwang 146:296bcc30e65d 41 class MovingAverageFilter : public Filter {
bwang 146:296bcc30e65d 42 public:
bwang 146:296bcc30e65d 43 MovingAverageFilter(int length);
bwang 146:296bcc30e65d 44 virtual float update(float x);
bwang 146:296bcc30e65d 45 private:
bwang 146:296bcc30e65d 46 CircularBuffer *buf;
bwang 146:296bcc30e65d 47 };