Durchschnittswerte von Sägezahn berechnen

Hallo,

zeitlich willkürlich eintreffende Ereignisse (weisse, vertikale Linien) erzeugen einen sägezahnmäßigen Verlauf eines Integers (graue Bereiche = „Sägezahninteger“).

In einer darauf folgenden Berechnung sollen nun Werte für einen weiteren Integer entstehen (gelbe Linie), der sich am „Sägezahninteger“ orientieren und so etwas wie Durchschnittswerte dessen abbilden soll.

Wie würdet ihr die gelb dargestellten Werte für diesen zweiten Integer auf Basis des Sägezahnintegers erzeugen?

Gruß Chris

Chris72622:
In einer darauf folgenden Berechnung sollen nun Werte für einen weiteren Integer entstehen (gelbe Linie), der sich am „Sägezahninteger“ orientieren und so etwas wie Durchschnittswerte dessen abbilden soll.

Ich habe keine Ahnung, was für ein Mittelwert das sein soll. Mittelwerte werden üblicherweise über ganze Sägezahnperioden gebildet und die Formeln dafür stehen auf Wechselstromlehre unter !Beispiel Sägezahnspannung.

Dort findest Du eine Formel für den "zeitlichen Mittelwert", und eine Formel für den "Effektivwert".

So what?

der sich am „Sägezahninteger" orientieren und so etwas wie Durchschnittswerte dessen abbilden soll.

Das was ich mir mit all meiner Phantasie darunter vorstellen kann, hat leider nichts mit der gelben Linie zu tun. Wie die mit den grauen Sägezähnen zusammenhängen könnte, kann ich mir nicht vorstellen.

Die Sägezähne haben alle eine gleiche konstante Steigung. Ist das falsch geraten?
Woher kommt der unregelmäßige Verlauf der gelben Linie?

Was soll das Ganze? Vielleicht hilft das beim Verständnis ...

Hallo,

solche interpolierten Kurvenformen oder wie das heißt, kenn ich nur aus Excel, die dann irgendwelche gleitende Werte darstellen können. Wie die das berechnen weis ich allerdings auch nicht. Vielleicht hilft eine Suche nach Gleitwertberechnung oder so.

Kreative Ausdrucksweise :slight_smile:

Ich versuche mal einen ebenso kreativen Lösungsvorschlag, da ich davon ausgehe, dass es bei dir nicht darum geht, etwas exakt zu berechnen.

Sieh die Y-Position der gelben Linie als die Höhe eines Balls über der Erde.
Auf den Ball wirkt die Erdanziehung als Beschleunigung nach unten.
Der Wert des Sägezahnintegers ist eine Beschleunigung von unten nach oben. z.B. ein Gebläse :slight_smile:

d.h.
Y-Pos = Y-Pos + Beschleunigung * ZeitUnterschied
Y-Pos = Y-Pos - Erdanziehung * ZeitUnterschied

An dem Faktor für die Beschleunigung, bzw. für die Erdanziehung kannst du dann rumspielen und einfach ausprobieren, wie sich die Kurve dann verhält.

Ich bin aber auch wirklich gespannt was du da vorhast!

EDIT:
Wenn du die Aufwärtsbeschleunigung auch noch "träge" machst, wird es so sein, dass nach der 3er-Kombi die Kurve waagrechter austritt, als nach einem einzelnen Ereignis (wie im Bild).

Und die Aufwärtsbeschleunigung könnte der Unterschied von Y-Pos zum Wert des Sägezahnintegers sein, dann geht die Linie schnell hoch, schnellt aber nicht ganz nach oben.

Am einfachsten ist hier - wie DOC schon erwähnt hat - ein gleitender Mittelwert.
Den programmiert man am einfachsten, indem man ein Array definiert, das in einer Schleife ständig überschrieben wird.
Der Zeitintervall der Abfrage und die Größe des Arrays bestimmen die trägheit des gleitenden Mittelwertes.
Clever ist es, die Größe des Arrays so zu wählen, dass es mindestens 3 der längsten Sägezähne umfasst.

Hier mal ne Skizze für einen gleitenden Mittelwert über eine Minute mit einer Auflösung von einer Sekunde:

int arrayGröße = 60;
float dataArray[arrayGröße];
float average;
int sum;

void loop {
  for(int i = 0; i < arrayGröße; i++) {
    dataArray[i] = getYourData();
    sum = 0;
    for (int j = 0; j< arrayGröße; i++) {
      sum = sum + dataArray[j];
    }
    average = sum / arrayGröße;
    serial.print("aktueller Mittelwert: ");
    serial.println(average);
  delay(1000);
  }

Die erste Minute wird da zwar nur Unsinn rauskommen aber das liegt in der Natur der Sache.

Ja, das ist gut. Vielen Dank fürs Anschubsen.

Gruß Chris

Hallo,
reine Spekulation:
Die gelbe Linie ist das Integral aus der grauen Fläche.
Wenn du den Momentanwert der grauen Fläche als Integer hast, kannst du den Wert auf den Eingang eines Integrators schalten. Der Ausgang des Integrators liefert dann die gelbe Linie.
Ich weiß nicht ob es eine Library gibt die auf dem Arduino einen Integrator bereit stellt.
Ich würde es deshalb mal mit dem PID-Regler versuchen und den P und D Anteil auf null stellen. Übrig bleibt dann der reine I-Anteil.

Gruß
Peter

Ich weiß nicht ob es eine Library gibt die auf dem Arduino einen Integrator bereit stellt.

Integrieren geht mit dem[b] + [/b]Operator. Wenn der "Integrator" unregelmässig drankommt, noch mit der Zeit seit dem letzten Rechnen multiplizieren.

In anderem Zusammenhang habe ich mit einer Spar-Variante (gelbe Linie) gearbeitet:

w = (w * m + j) / (m + 1);  //  w alter Wert; m=19 Multiplikator; j neuer Wert

Aus Interesse wollte ich dies mit dem gleitenden Mittelwert (rote Linie) aus #5 vergleichen, wobei ich ein Feld mit 20 Elementen genommen habe.


Meine Spar-Variante schneidet nicht gar so schlecht ab :slight_smile:

Anmerkungen:

SuesseKleineMaus:

for (int j = 0; j< arrayGröße; j++) {
...
average = sum / arrayGröße;

Der Wert von average wird nicht float, da sum und arrayGröße int sind. Außerdem mag meine IDE "ö" und "ß" nicht.

Hallo,

sehr schön. :slight_smile:
Die Sparvariante sieht optisch sogar besser aus und ist näher dran an dem was der TO möchte.

Doc_Arduino:
Die Sparvariante sieht optisch sogar besser aus und ist näher dran an dem was der TO möchte.

Das ist zugegebenermaßen Zufall :slight_smile:

Hallo,

egal, viele große Erfindungen waren Zufall ... :slight_smile:

Doc_Arduino:
egal, viele große Erfindungen waren Zufall ... :slight_smile:

Die Größe besteht manchmal darin, eine große Erfindung als solche zu erkennen 8)

Der Sägezahn wird mich aber nicht in eine Reihe mit Newton und Einstein stellen :wink:

Also mir hauts hier echt regelmäßig den Zeiger raus, wenn ich mir angucke was da alles an verwertbarem Input rauskommt, wenn man in diesem Superforum einen Thread startet- echt der abolute Wahnsinn!

Ich bin echt überwältigt. :stuck_out_tongue_closed_eyes:

1000 Dank insbesondere (mal wieder) Dir, agmue.

Gruß Chris