so, habe meine ardumath lib fertig, anscheinend zumindest ohne erkennbare Bugs!
Man kann einfach bubblesort für einen beliebigen Array nutzen,
dann medianofX mit Angabe von Var.-Nr und der Array-Tiefe (median of 3 oder median of 5 z.B.)
und schließlich auch medianNewOfX unter zusätzlicher Übergabe eines neuen Messwertes, der sodann erst in den FiFo Puffer eingespeist wird.
Edit:
Als Zugabe noch ein Shellsort und ein Lowpass-Filter mit beliebigem Variablentyp.
vlt kanns ja jemand brauchen - Bug Reports willkommen! 
Code:
// ardumath.h
#ifndef _ARDUMATH_H
#define _ARDUMATH_H
//---------------------------------------------------------
// Bubble Sort
//---------------------------------------------------------
template<typename VTYPE>
void bubblesort(VTYPE *array, int length) {
VTYPE tmp;
for (int i=0; i<length-1; i++) {
for (int j=0; j<length-i-1; j++) {
if (array[j] > array[j+1]) {
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
}
//---------------------------------------------------------
// Shell Sort
//---------------------------------------------------------
template<typename VTYPE>
void shellsort(VTYPE *array, int length) {
int i, j, increment;
VTYPE temp;
increment = length / 2;
while (increment > 0) {
for (i = increment; i < length; i++) {
j = i;
temp = array[i];
while ((j >= increment) && (array[j-increment] > temp)) {
array[j] = array[j - increment];
j = j - increment;
}
array[j] = temp;
}
if (increment == 2)
increment = 1;
else
increment = (unsigned int) (increment / 2.2);
}
}
//---------------------------------------------------------
// Median Filter
//---------------------------------------------------------
#define MEDMAX 5 // Median depth: 5 each (MEDMAX default)
// private FiFo Buffers: 8 variants, Median depth: 5 each (MEDMAX default)
static int16_t fifoi[8][MEDMAX];
static int32_t fifon[8][MEDMAX];
static double fifod[8][MEDMAX];
void fifopush(int16_t _new, int varnr) {
for (int i=MEDMAX-1; i>=1; i--) {
fifoi[varnr][i] = fifoi[varnr][i-1];
}
fifoi[varnr][0] = _new;
}
void fifopush(int32_t _new, int varnr) {
for (int i=MEDMAX-1; i>=1; i--) {
fifon[varnr][i] = fifon[varnr][i-1];
}
fifon[varnr][0] = _new;
}
void fifopush(double _new, int varnr) {
for (int i=MEDMAX-1; i>=1; i--) {
fifod[varnr][i] = fifod[varnr][i-1];
}
fifod[varnr][0] = _new;
}
//---------------------------------------------------------
int16_t medianOfi(int varnr, int depth) {
int16_t temp[depth];
for (int i=0; i<depth; i++) temp[i] = fifoi[varnr][i];
bubblesort( temp, depth );
return temp[depth/2];
}
int32_t medianOfn(int varnr, int depth) {
int32_t temp[depth];
for (int i=0; i<depth; i++) temp[i] = fifon[varnr][i];
bubblesort( temp, depth );
return temp[depth/2];
}
double medianOfd(int varnr, int depth) {
double temp[depth];
for (int i=0; i<depth; i++) temp[i] = fifod[varnr][i];
bubblesort( temp, depth );
return temp[depth/2];
}
//---------------------------------------------------------
int16_t medianNewOfi(int16_t _new, int varnr, int depth) {
fifopush(_new, varnr);
return medianOfi(varnr, depth);
}
int32_t medianNewOfn(int32_t _new, int varnr, int depth) {
fifopush(_new, varnr);
return medianOfn(varnr, depth);
}
double medianNewOfd(double _new, int varnr, int depth) {
fifopush(_new, varnr);
return medianOfd(varnr, depth);
}
//---------------------------------------------------------
// Tiefpass = lowpassFilter
//---------------------------------------------------------
template<typename VTYPE>
double lowpassFilt(VTYPE NewVal, VTYPE Avrg, double FF) {
return (double)(NewVal*FF + Avrg*(1.0-FF)) ;
}
//---------------------------------------------------------
#endif
//---------------------------------------------------------
//---------------------------------------------------------
Lesezeichen