The iPod controller that I submitted for the mbed challenge

Dependencies:   mbed Motordriver PID

Committer:
networker
Date:
Wed May 04 15:41:13 2011 +0000
Revision:
0:371773dd3dd1
first publication

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 0:371773dd3dd1 1 #include <float.h>
networker 0:371773dd3dd1 2 #include "filter.h"
networker 0:371773dd3dd1 3
networker 0:371773dd3dd1 4 medianFilter::medianFilter(int window): N(window) {
networker 0:371773dd3dd1 5 big = new bool[N];
networker 0:371773dd3dd1 6 val = new float[N];
networker 0:371773dd3dd1 7 big = new bool[N];
networker 0:371773dd3dd1 8 i = 0;
networker 0:371773dd3dd1 9 for (int j = 0; j < N; j++) {
networker 0:371773dd3dd1 10 val[j] = 0;
networker 0:371773dd3dd1 11 big[j] = j > N/2;
networker 0:371773dd3dd1 12 }
networker 0:371773dd3dd1 13 med = 0;
networker 0:371773dd3dd1 14 median=0;
networker 0:371773dd3dd1 15 }
networker 0:371773dd3dd1 16
networker 0:371773dd3dd1 17 int medianFilter::findmax() {
networker 0:371773dd3dd1 18 float m = -FLT_MAX;
networker 0:371773dd3dd1 19 int n = -1;
networker 0:371773dd3dd1 20 for (int j = 0; j < N; j++) {
networker 0:371773dd3dd1 21 if (j == med) continue;
networker 0:371773dd3dd1 22 if (!big[j]) { //find max
networker 0:371773dd3dd1 23 if (val[j] > m) {
networker 0:371773dd3dd1 24 m = val[j];
networker 0:371773dd3dd1 25 n = j;
networker 0:371773dd3dd1 26 }
networker 0:371773dd3dd1 27 }
networker 0:371773dd3dd1 28 }
networker 0:371773dd3dd1 29 return n;
networker 0:371773dd3dd1 30 }
networker 0:371773dd3dd1 31
networker 0:371773dd3dd1 32 int medianFilter::findmin() {
networker 0:371773dd3dd1 33 float m = FLT_MAX;
networker 0:371773dd3dd1 34 int n = -1;
networker 0:371773dd3dd1 35 for (int j = 0; j < N; j++) {
networker 0:371773dd3dd1 36 if (big[j]) { //find min
networker 0:371773dd3dd1 37 if (val[j] < m) {
networker 0:371773dd3dd1 38 m = val[j];
networker 0:371773dd3dd1 39 n = j;
networker 0:371773dd3dd1 40 }
networker 0:371773dd3dd1 41 }
networker 0:371773dd3dd1 42 }
networker 0:371773dd3dd1 43 return n;
networker 0:371773dd3dd1 44 }
networker 0:371773dd3dd1 45
networker 0:371773dd3dd1 46 float medianFilter::process(float in) {
networker 0:371773dd3dd1 47 //the value at position 'i' is to be replaced by 'in' and the new median is computed
networker 0:371773dd3dd1 48 //var 'median' refers to the old median
networker 0:371773dd3dd1 49 // val[j] <= median <= val[k]
networker 0:371773dd3dd1 50 //by convention the mediam is considered small
networker 0:371773dd3dd1 51 val[i] = in;
networker 0:371773dd3dd1 52 if (i == med) { //the median itself is removed (not the value but the actual sample)
networker 0:371773dd3dd1 53 if (in <= median) { //the new value is smaller than or equal to the old median and may be the new median
networker 0:371773dd3dd1 54 med = -1; //hack to include the median cell in the comparison
networker 0:371773dd3dd1 55 med = findmax(); //the largest small value is the new median
networker 0:371773dd3dd1 56 } else { //the new value is larger than the old median and may be the new median
networker 0:371773dd3dd1 57 big[i] = true; //add the new val to the big set, which is now 1 too large
networker 0:371773dd3dd1 58 med = findmin();
networker 0:371773dd3dd1 59 big[med] = false;
networker 0:371773dd3dd1 60 }
networker 0:371773dd3dd1 61 } else if (!big[i]) {//old value is removed from small values
networker 0:371773dd3dd1 62 if (in <= median) {
networker 0:371773dd3dd1 63 //replace small with small, median not affected
networker 0:371773dd3dd1 64 } else { //the new value is large
networker 0:371773dd3dd1 65 big[i] = true;
networker 0:371773dd3dd1 66 med = findmin();
networker 0:371773dd3dd1 67 big[med] = false;
networker 0:371773dd3dd1 68 }
networker 0:371773dd3dd1 69 } else { //old value is large
networker 0:371773dd3dd1 70 if (in <= median) { //but the new value is small
networker 0:371773dd3dd1 71 big[i] = false;
networker 0:371773dd3dd1 72 big[med] = true;
networker 0:371773dd3dd1 73 med = findmax();
networker 0:371773dd3dd1 74 } else {//new value is also large
networker 0:371773dd3dd1 75 //replace large with large, median not affected
networker 0:371773dd3dd1 76 }
networker 0:371773dd3dd1 77 }
networker 0:371773dd3dd1 78 if (++i >= N) i = 0;
networker 0:371773dd3dd1 79 median = val[med];
networker 0:371773dd3dd1 80 return median;
networker 0:371773dd3dd1 81 }