Median aus einem Array berechnen

Hallo,

ich habe ein Array mit unterschiedlichen Sensorwerten. Jetzt wollte ich den Median der letzten 11 Werte berechnen. Kennt jemand da eine gute Lib oder Lösung? Habe bis jetzt nur Lib'S gefunden die das Array selber bestücken. Habe 6 Sensoren und will nicht für jedes ein eigenen Vektor aufmachen wo der RunningMedian berechnet wird.

Danke schon mal.

Aus meiner Wühlkiste:

template<typename DatenType> 
class GleitenderMittelwert   // eher Tiefpassfilter
{
 private:
 const double factor;
 double mittelwert;
 
 public:
 GleitenderMittelwert(const double factor):factor(factor),mittelwert(0){}
 
 void setInitial(double value)
 {
    mittelwert = value;
 }
 
 DatenType doValue(DatenType value) // neuen Wert verarbeiten
 {
    mittelwert *= 1.0 - factor;
    mittelwert += factor * value;
    return  mittelwert;
 }
 
 DatenType operator= (DatenType value)
 {
   return doValue(value); 
 }
 
 DatenType operator() (DatenType value)
 {
   return doValue(value); 
 }
 
 DatenType operator() () const
 {
   return mittelwert; 
 }
 
   operator DatenType() const
  {
    return mittelwert;
 } 
 };
 



// 1.0/11.0 entspricht in etwa einem Array mit 11 Zellen für die Berechnung des Mittelwertes
GleitenderMittelwert<uint16_t> gmw(1.0/11.0); 


void setup()
{
  Serial.begin(9600);
  gmw.setInitial(analogRead(A0));
}

void loop()
{
  uint16_t value = analogRead(A0);
  Serial.print(value);
  Serial.print("  ");
  Serial.println(gmw(value));
  delay(200);
}

Danke.

Ja mit dem GleitendenMittelwert ist das ok. Bei meinen Sensoren bietet sich aber eher ein Median Filter an. (Lichtsensor und NTC's)

Aktuell fülle ich ein 2D Array gleitend mit aktuellen Messwerten auf und will in jetzt jeweils das Array Spalte für Spalte sortieren und mit den mittleren Wert ausgeben lassen. 11 Zeilen und 6 Sensoren.

So Marke Eigenbau. Fluppt aber. Verbesserungen/Verbesserungsvorschläge sind gerne gesehen. :slight_smile:

#define Medianmax 11
#define Sensoren 5

int Sensordaten[Medianmax][Sensoren];
int SortierteSensordaten[Medianmax][Sensoren];

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:

  for (int y = 0; y < Medianmax - 1; y++)
    for (int k = 0; k < Sensoren; k++)
      Sensordaten[y][k] = Sensordaten[y + 1][k];

  Serial.println("");
  Serial.println("");
  Serial.print("---------Aktuelle Sensordaten----------------------");
  Serial.println("");
  Serial.println("");

  for (int i = 0; i < Sensoren; i++)
  {
    Sensordaten[Medianmax - 1][i] = random(10, 20);
    Serial.println(Sensordaten[Medianmax - 1][i]);
  }

  Serial.println("");
  Serial.println("++++++++Eingelesene Sensordaten++++++++++++++++");

  for (int y = 0; y < Medianmax; y++)
  {
    Serial.println("");
    for (int k = 0; k < Sensoren; k++)
    {
      Serial.print(" ");
      Serial.print(Sensordaten[y][k]);
    }
  }
  ordnungs_Funktion();

  Serial.println("");
  Serial.println("");
  Serial.print("Median: ");
  for (int i = 0; i < Sensoren; i++)
  {
    Serial.print(SortierteSensordaten[Medianmax / 2][i]);
    Serial.print(" ");
  }
  //Serial.println("");
  delay(5000);

}

void ordnungs_Funktion()
{
  Serial.println("");
  Serial.println("");
  Serial.println("+++++++Sortiertes Array+++++++++++++++++");

  memcpy(SortierteSensordaten, Sensordaten, sizeof(Sensordaten));
  //Serial.println(sizeof(Sensordaten));
  for (int k = 0; k < Sensoren; k++)
  {
    for (int y = 1; y < Medianmax; y++)
    {
      for (int i = 0; i < Medianmax - y; i++)
      {
        if (SortierteSensordaten[i][k] > SortierteSensordaten[i + 1][k])
        {
          int temp = SortierteSensordaten[i][k];
          SortierteSensordaten[i][k] = SortierteSensordaten[i + 1][k];
          SortierteSensordaten[i + 1][k] = temp;
        }
      }
    }
  }

  for (int y = 0; y < Medianmax; y++)
  {
    Serial.println("");
    for (int k = 0; k < Sensoren; k++)
    {
      Serial.print(" ");
      Serial.print(SortierteSensordaten[y][k]);
    }
  }
}

RunningMedian leistet mir schon seit Jahren beste Dienste.