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