Forum: Digitale Signalverarbeitung / DSP / Machine Learning Efffektivwert ohne Offset


von Daniel S. (daniel_s)


Lesenswert?

Hallo,

ich möchte auf einem Prozessor den Effektivwert einer Spannung 
berechnen. Die Spannung ist mit einem Offset überlagert welcher als 
konstant während des Samplings angenommen wird und nicht in den 
Effektivwerte eingehen soll (AC-Effektiv)

Ich sample und speichere N Werte und mache die Berechnung danach.

Folgendes funktioniert
1. Schleife über alle Messwerte: Addiere alle Messwerte
2. Teile Summe durch Anzahl Messwerte (=Mittelwert)
3. Schleife über alle Messwerte: (ADC-Mittelwert)^2 aufaddieren
4. Summe durch Anzahl messwerte.
5. Wurzel aus letzem Ergebnis = Umess_effektiv

Nun dachte ich dass ich durch Umstellung auch folgendes in einer 
Schleife berechnen kann.

Somit müsste ich in der Schleife nur die ADC werte einmal quadrieren und 
aufsummieren und einmal normal aufsummieren und könnte danach mit dieser 
Formel die Effektivspannung ausrechnen. Leider ist da wohl ein 
Denkfehler drin. Aber ich komm nicht drauf.

Hat jemand einen Tipp?

von Achim H. (anymouse)


Lesenswert?

Möglicherweise fehlt Dir bei dem einen oder anderen Summanden ein Faktor 
"N" oder "1/N". Die Klammer vom 1/N vor der Summe fehlt nach dem 
Auflösen.

von Daniel S. (daniel_s)


Lesenswert?

Hi,

ja war ein Tippfehler


von Daniel S. (daniel_s)


Lesenswert?

Da mean ja unabhängig von n ist sollte man das doch einfach aus dem 
Integral rausziehen können oder? (mean wird nach durchlauf der Schleife 
aber vor obiger Formel berechnet)

von Simon L. (dfgh)


Lesenswert?

Die Summe läuft auch über den Mittelwert (am Ende der Zeile), es heißt 
nicht nur mean², sondern Summe über mean²


Warum machst du das überhaupt? Die umgeformte Formel ist für den 
Prozessor viel mehr Arbeit!

von Daniel S. (daniel_s)


Lesenswert?

Hi,

mean^2 ist doch auch unabhängig von n. Also kann ich das doch aus der 
Summe rausziehen. Oder nicht?

Ich mache dass damit ich so nur noch eine Schleife habe und in der 
Schleife nur eine Summe über die Quadrate und eine Summe über die 
Messwerte an sich habe. Anders habe ich die beiden Sachen und die 
Differenz zwischen beiden noch zu berechnen. Die oben genannte Formel 
muss ich nur ein mal nach der Schleife berechnen. Das wäre etwas weniger 
als 1. Variante.

Vielleicht spare ich nicht viel aber ich schätze 10% macht das schon.

von Chris (Gast)


Lesenswert?

Der Mittelwert ist prinzipiell als Integral geteilt durch die Breite 
definiert.
Das entspricht bei einem sinus dem Offset, wenn das integral über den 
sinus wegmittelt.
Du müsstest also dafür sorgen, nur über ganze Perioden aufzuaddieren, 
oder so viel Perioden zu haben dass das Teilstück der Periode nicht viel 
ausmacht.

von Helmut S. (helmuts)


Lesenswert?

Nimm diese Formel:

Wurzel( (1/N) * Summe(ADC(i)-Mean)^2) )

Vielleicht gibt es ja mit deiner Formel einen Überlauf.

von Daniel S. (daniel_s)


Lesenswert?

Hallo,

danke für die Antorten.

@Chris:
das Problem hat nichts mit einer falschen Mittelwertbildung zu tun. Es 
ist ja rein theoretischer Natur. Meine umgestellte Formel ist wohl 
falsch. Aber ich finde den Fehler nicht.

@Helmut:
Abgesehen von einem Klammerfehler bei deiner Formel ist das genau die 
Variante 1 von mir.

Vielleicht ist ja jemand mit etwas Mathekenntnissen dabei welcher mir 
meinen Fehler aufzeigen kann?

von Chris (Gast)


Lesenswert?

Neben deiner inkonsistenzer Schreibweise verstehe ich nicht was du 
willst. Den Mittelwert musst du ja vorher berechnen. Danach kannst du 
den Effektivwert berechnen. Wie du den Effektivwert anhand deiner Formel 
berechnen möchtest, ohne den Mittelwert zu kennen, verstehe ich nicht.
Ansonsten sind beide Wege identisch, wenn du beachtest:
Dir fehlt ein "n" in deiner Formel.
Sieht man auch an den "Einheiten"

von Yalu X. (yalu) (Moderator)


Lesenswert?

Daniel S. schrieb:
> mean^2 ist doch auch unabhängig von n. Also kann ich das doch aus der
> Summe rausziehen. Oder nicht?

Das stimmt schon, die verbleibende Summe ist dann aber die Summe aus n
Einsen und ergibt n. Du musst also mean² noch mit n multiplizieren. Dann
sollte die Formel stimmen.

Du sparst damit – wenn ich mich nicht verzählt habe – gegenüber der
Originalformel n-3 Additionen ein, brauchst dafür aber zusätzlich 3
Multiplikationen und 1 Division. Für große n fallen die paar
Multiplikationen und die Division gegenüber den gesparten n-3 Additionen
kaum noch ins Gewicht, so dass sich tatsächlich ein Rechenzeitvorteil
ergibt.

Dadurch, dass du an zwei Stellen durch n dividierst, ensteht bei
Verwendung von Integer-Arithmetik ein größerer Rundungsfehler als bei
der Originalformel. Aber vielleicht verwendest du wegen der Wurzel
ohnehin Floating-Point, dann ist der Unterschied vernachlässigbar.

Wenn man den Mittelwert nicht noch anderweitig benötigt, kann man dessen
Formel in die Gesamtformel einsetzen und das Ganze etwas vereinfachen:


Gegenüber deiner Lösung spart dies 2 Additionen, 1 Multiplikation und
1 Division ein und vermeidet den oben o.g. zusätzlichen Rundungsfehler.

Der Hauptvorteil deiner und meiner Formel liegt aber nicht so sehr in
der eingesparten Rechenzeit, sondern darin, dass man die n Messwerte
nicht in einem Array zwischenspeichern muss, wie es bei der
Originalformel der Fall ist, denn diese Zwischenspeicherung lässt bei
größerem n einen kleineren Controller RAM-mäßig schnell an seine Grenzen
stoßen.

Helmut S. schrieb:
> Vielleicht gibt es ja mit deiner Formel einen Überlauf.

Ja, das ist ein wichtiger Punkt. Ich habe das mal überschlägig
durchgerechnet:

Bei Daniels Formel liegt das größtmögliche Zwischenergebnis in der
Größenordnung von n·Umax², bei der Original- bzw. der von dir geposteten
Formel ebenso. Umax ist dabei die höchste vom ADC messbare Spannung.

Bei meiner Formel ist dein Argument allerdings nicht von der Hand zu
weisen, denn da ist das größtmögliche Zwischenergebnis n²·Umax² und
damit um den Faktor n größer. Wenn das ein Problem ist, kann man den
Faktor 1/n als 1/n² in die Wurzel hineinziehen, worunter aber die
Genauigkeit wieder etwas leidet.

Falls in Floating-Point gerechnet wird, sind weder Überläufe noch
Genauigkeit ein Problem, höchstens die Rechenzeit.

von Daniel S. (daniel_s)


Lesenswert?

Hi,

ja jetzt wird es klar wenn ich mean^2 rausziehe bleibt 1 stehen welches 
dann als Summe n gibt. Ich werd das mal testen.

@Chris: Den Mittelwerte kann ich in der gleichen Schleife berechnen wie 
die Quadratesumme. Somit habe ich nur eine Schleife und zusätzlich muss 
ich in der Schleife nicht die Differenz zwischen Messwert und Mittelwert 
bilden sonder kann das nach abarbeiten des Puffers einmalig machen.

@Yalu: Danke für die ausführliche Antwort.
Ich habe genug RAM um die Werte zu puffern. Diese werden per DMA 
eingelesen während der Controller im Standby ist. Es geht hauptsächlich 
darum Energie zu sparen. Deshalb auch die Optimierung.
Am wichtigsten ist es die Schleife zu optimieren da es sich um 1500 
Messwerte handelt. Die nachfolgenden Berechnungen werden nur alle paar 
Sekunden ausgeführt und sind deshalb weniger kritisch. Bis jetzt sind 
diese in FP werden aber vielleicht auch noch optimiert werden müssen.

von Chris (Gast)


Lesenswert?

Naja, also Zeitsparen macht man nicht, indem man die Anzahl der 
Schleifen reduziert. Zeitsparen schafft man hauptsächlich durch cleveres 
multiplizieren, oder durch sparen von Multiplikationen, und vor allem 
Divisionen (nimm zB für N vielfache von 2, dann kannst du einfach 
Bitshiften)
Schau nach wieviel cycles dein Controller für Multiplikationen brauch, 
und zähle wieviel cycles du für die verschiedenen Formeln brauchst.
Ich tippe übrigens auf Yalus Formel, da man so nur addieren muss 
(Mittelwert) und "Multiply and accumulate" (dauert je nach controller 
auch nur einen Takt) muss.

von Michael W. (Gast)


Lesenswert?

Sowas macht man, wenn man den Wert ständig aktuell ausgeben will. Dann 
schleppt man die Summme und die Summme im Quadrat mit und berechnet 
daraus ständig den aktuellen Effektivwert in einem Schritt, ohne die 
Summen anzutasten.

von J. S. (engineer) Benutzerseite


Lesenswert?

Man muss aber die Summen auf einen bestimmten Zeitbereich begrenzen und 
darf das nicht über unbegrenzte Zeit mitschleppen und damit entsteht das 
klassische Problem des nicht definierten Nulllevels bei Audio. Für diese 
Mimik braucht es dann aber doch ein RAM mit den Werten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.