Bayley Wang
/
foc-ed_in_the_bot_compact
robot
Filter/Filter.h@147:c1b2379b8874, 2017-05-03 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |