Go Down

Topic: Median aus einem Array berechnen (Read 114 times) previous topic - next topic

Herrx

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.

combie

#1
Jul 23, 2019, 11:39 am Last Edit: Jul 23, 2019, 11:41 am by combie
Aus meiner Wühlkiste:

Code: [Select]



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);
}

Nobody is perfect!
(und selbst der nicht zu 100%)

Herrx

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.
 

Herrx

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

Code: [Select]


#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]);
    }
  }
}

ElEspanol

RunningMedian leistet mir schon seit Jahren beste Dienste.

Go Up