Skip to content

Instantly share code, notes, and snippets.

@ofZach
Created March 4, 2013 12:48
Show Gist options
  • Save ofZach/5082043 to your computer and use it in GitHub Desktop.
Save ofZach/5082043 to your computer and use it in GitHub Desktop.
median filter for arduino, uses bubble sort
// medianFilter filter;
// filter.addValue(5);
// filter.addValue(3);
// filter.addValue(2);
// filter.addValue(100);
// filter.addValue(9);
// Serial.println(filter.getMedian());
//
// filter.addValue(100);
// Serial.println(filter.getMedian());
// prints 5, 9
#define NUM_VALS_MEDIAN 5
class medianFilter {
public:
float vals[NUM_VALS_MEDIAN];
float valsSorted[NUM_VALS_MEDIAN];
boolean firstVal;
medianFilter(){
firstVal = true;
}
void addValue(float val){
if (firstVal == true){
for (int i = 0; i < NUM_VALS_MEDIAN; i++) valsSorted[i] = val;
for (int i = 0; i < NUM_VALS_MEDIAN; i++) vals[i] = val;
}
else {
for (int i = 1; i < NUM_VALS_MEDIAN; i++) vals[i-1] = vals[i];
vals[NUM_VALS_MEDIAN-1] = val;
for (int i = 0; i < NUM_VALS_MEDIAN; i++) valsSorted[i] = vals[i];
// sort array
bubbleSort();
}
firstVal = false;
}
float getMedian(){
return valsSorted[ (int)floor(NUM_VALS_MEDIAN/2) ];
}
void bubbleSort() {
int out, in;
float swapper;
for(out=0 ; out < NUM_VALS_MEDIAN; out++) { // outer loop
for(in=out; in<NUM_VALS_MEDIAN; in++) { // inner loop
if( valsSorted[in] > valsSorted[in+1] ) { // out of order?
// swap them:
swapper = valsSorted[in];
valsSorted [in] = valsSorted[in+1];
valsSorted[in+1] = swapper;
}
}
}
}
};
@Gromina
Copy link

Gromina commented Nov 7, 2015

Hey, you gonna corrupt memory by line 55 because in can be NUM_VALS_MEDIAN-1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment