Forum: Mikrocontroller und Digitale Elektronik Gleitender Mittelwert unterschied


von Ingo L. (corrtexx)


Lesenswert?

Ich habe mal etwas mit gleitenden Mittelwertbildungen rumgespielt. Ich 
habe zwei Varianten:
1
    Frequency.Index++;
2
    if ( Frequency.Index >= NR_OF_MIDDLE ) Frequency.Index = 0;
3
    Frequency.BufferSum -= Frequency.Buffer[Frequency.Index];        // substract value to replace from Sum
4
    Frequency.Buffer[Frequency.Index] = 2000000000ul/ Frequency.Period;    // Put new Value to Buffer
5
    Frequency.BufferSum +=  Frequency.Buffer[Frequency.Index];        // Put new Buffer to Sum
6
    Frequency.Value = Frequency.BufferSum / NR_OF_MIDDLE;          // Middle
und
1
    Frequency.Buffer[0] =  2000000000ul/ Frequency.Period;
2
    Frequency.BufferSum -= Frequency.BufferSum / NR_OF_MIDDLE;
3
    Frequency.BufferSum += Frequency.Buffer[0];
4
    Frequency.Value = Frequency.BufferSum / NR_OF_MIDDLE;,
Beide glätten das Signal, Variante zwei jedoch stärker. Wo liegt jetzt 
der Unschied zwischen den Beiden bzw. wie lassen sich hier die 
Grenzfrequenz berechenen. Beim Ersten glaube ich so: fg = 1/(Ta ** 
NR_OF_MIDDLE ** 2 * PI). Stimmt das?

Ich glaube Variante 1 Funktioniert nicht zuverlässig, da von der Summe 
immer der älteste Wert wieder abgezogen wird und durch einen neuen 
ersetzt wird. War der älteste Wert Null wird das Ergebnis falsch, da die 
Summe nicht kleiner wird. Kann es sein das es ein Hochpass ist?

: Bearbeitet durch User
von Max M. (jens2001)


Lesenswert?

Ingo L. schrieb:
> wird das Ergebnis falsch, da die
> Summe nicht kleiner wird

Das haben Mittelwerte so an sich das sie auch mal gösser werden!

von Ingo L. (corrtexx)


Lesenswert?

Max M. schrieb:
> Das haben Mittelwerte so an sich das sie auch mal gösser werden!
Stimmt, die 0 war je bereits Teil des Mittelwertes, das hatte ich 
übersehen...

von Ingo L. (corrtexx)


Lesenswert?

Ich denke der wesentliche Unterschied ist, das Variante 1 nach n Werten 
vergessen hat, was vorher los war, da ja immer wieder der älteste Wert 
gegen den neuesten ausgetauscht wird. Variante zwei vergisst nichts, da 
immer Summe/n aus der Summe gezogen wird. Das erklärt auch, warum das 
Filter träger ist.
Allerdings habe ich immernoch keine Ahnung wie man daraus nun die 
Eckfrequenz errechnet.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Ingo L. schrieb:
> Beide glätten das Signal, Variante zwei jedoch stärker.

Du meinst wohl eher, sie reagiert deutlich träger.
Das ist kein Wunder, da vergangene Werte nur sehr langsam abgeschwächt 
werden. Sie entspricht daher nur einem einfachen RC-Tiefpaß.

Besser ist dagegen Variante 1, da sie eine echten Integrator bildet, 
d.h. veraltete Werte werden sofort vergessen. Allerdings ist der 
RAM-Verbrauch höher.

von Pandur S. (jetztnicht)


Lesenswert?

Wenn's nur ums Glaetten geht, nimm den exponenellen Mittelwert.

Als : http://www.ibrtses.com/embedded/exponential.html

Der benoetigt nur einen Speicherwert, und nur eine Addition und einmal 
schieben.

von THOR (Gast)


Lesenswert?

Also ich würde mir ja nen symmetrischen FIR in Octave erstellen lassen, 
mit Vorgabe von Grenzfrequenz und erwünschter Dämpfung.

Erst coden und dann überlegen "was macht mein Code eigentlich" ist nicht 
so irre zielführend.

von A. S. (Gast)


Lesenswert?

Variante 2 wird meist auch einfacher implementiert, wenn man mit float 
oder fixed.Zahlen arbeitet:

out = alt + (neu-alt)/x. Das ist äquivalent zu
out = (neu + alt*(x-1))/x
und äuqivalent zu der exponentiellen Mittelung die hier empfohlen wurde, 
wenn x=2^n ist

x ist das Maß, wie weit geglättet werden soll.
Peter D. schrieb:
> Sie entspricht daher nur einem einfachen RC-Tiefpaß.
Genau. Mit dessen Tau=Abtastrate*x
Grenzfrequenzen etc. sind analog zu RC-Filtern.


> Besser ist dagegen Variante 1, da sie eine echten Integrator bildet,
> d.h. veraltete Werte werden sofort vergessen.
Desshalt heissen diese Filter auch FIR-Filter (Finite Impuls Response) 
im Gegensatz zum RC oben als IIR (Infinite ...)

von Ingo L. (corrtexx)


Lesenswert?

Habe mich jetzt auch für die Variante1 (FIR) entschlossen. Wie errechnet 
sich hier die Eckfrequenz?

von THOR (Gast)


Lesenswert?

https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0ahUKEwiekraO2sPQAhUD2SwKHTB7BwIQFggvMAI&url=https%3A%2F%2Fti.tuwien.ac.at%2Fcps%2Fteaching%2Fcourses%2Fdspv%2Ffiles%2FFIRFilter.pdf&usg=AFQjCNElDO0Q_ZSJwHJ_2vwIldy475-OWA&sig2=09NofCV54JfnnEa8llFYsA&cad=rja

Kapitel 1.3

Und weil man in der Regel besseres zu tun hat als Übertragungsfunktionen 
auszurechnen, lässt man Matlab/Octave einen FIR synthetisieren.

Für nen kleinen µC am besten einen symmetrischen mit gerader Anzahl 
Taps, den kann man dann in der Mitte zusammenklappen und halbiert damit 
praktisch die Zahl der Rechenschritte.

von A. S. (Gast)


Lesenswert?

Ingo L. schrieb:
> Habe mich jetzt auch für die Variante1 (FIR) entschlossen. Wie errechnet
> sich hier die Eckfrequenz?

Bei der Version must Du genau wissen, was Du tust. Ist zwar auch ein 
Tiefpasse, aber anders als bei der RC-Variante kommt nach der maximalen 
Dämpfung (bei T = Abtastrate * N) das Signal wieder durch, jedoch 
Phasenverschoben. Beispiel: Stell Dir vor, Du tastest mit 1ms ab und 
mittelst über 50 Takte:
100Hz-Wechselspannung wird perfekt zu 0 gemittelt, da immer genau eine 
ganze Vollwelle integriert wird.
50Hz-Wechselspannung kommen jedoch mit 180° Phasenverschiebung wieder 
durch, da immer genau der Mittelwert der letzten Halben Phase anliegt.

Hättest Du ein 50Hz Rechteck, käme ein 50Hz Sägezahn mit voller 
amplitude raus.

Zudem kommt hinzu, dass die Bezeichnung (gleitender Mittelwert) oftmals 
auch für die exponentielle Glättung verwendet wird.

Ganz unabhängig davon musst Du bei jedem Digitalfilter noch dafür 
sorgen, dass die Eingangswerte schon physikalisch begrenzt sind. Du 
kannst mit einem Digigalfilter z.B. keinen ADC filtern, dessen Eingang 
SignaleAnteile über der Samplerate hat.

von Markus (Gast)


Lesenswert?

Nr1: gleitender Mittelwert, Vorstellung ein Fenster wird über das Signal 
geschoben und von den Werten innerhalb des Fensters der Mittelwert 
gebildet. Interessant ist hier der Frequenzgang. Er hat nämlich 
Nullstellen. Macht man den Filter genau 20ms lang, kann man eine 50Hz 
Störung vollständig weg filtern.

Nr2: IIR-Tiefpass erster Ordnung. Die Sprungantwort entspricht der eines 
RC-Filters. Man kann damit das Verhalten eines RC-Tiefpass nachbilden.
Das ist kein gleitender Mittelwert. Der Begriff "Exponentialfilter" mag 
an das aussehen der Sprungantwort angelehnt sein, gebräuchlich ist der 
Begriff in der Signalverarbeitung nicht.

von THOR (Gast)


Lesenswert?

Achim S. schrieb:
> Ingo L. schrieb:
>> Habe mich jetzt auch für die Variante1 (FIR) entschlossen. Wie errechnet
>> sich hier die Eckfrequenz?
>
> Bei der Version must Du genau wissen, was Du tust. Ist zwar auch ein
> Tiefpasse, aber anders als bei der RC-Variante kommt nach der maximalen
> Dämpfung (bei T = Abtastrate * N) das Signal wieder durch, jedoch
> Phasenverschoben.

Durch das Sampling wiederholt sich das Spektrum periodisch, ja. Aber das 
ist eh eine Verletzung des Shannon Nyquist Abtasttheorems. Ein 
Anti-Aliasing Filter wird immer vorrausgesetzt bei solchen Fragen.

von Markus (Gast)


Lesenswert?


von A. S. (Gast)


Lesenswert?

THOR schrieb:
> Durch das Sampling wiederholt sich das Spektrum periodisch, ja. Aber das
> ist eh eine Verletzung des Shannon Nyquist Abtasttheorems. Ein
> Anti-Aliasing Filter wird immer vorrausgesetzt bei solchen Fragen.

Nyquist und Anti-Aliasing beziehen sich normalerweise auf die Abtastung, 
nicht auf die Sampleanzahl des FIR-Filters. Also dass bei einer 
Abtastrate von 1ms keine Frequenzen über 500Hz liegen. Das habe ich am 
Ende auch angemerkt. Ein IIR-Filter glättet dann in jedem Fall stetig, 
das FIR-Filter halt nicht.

Achim S. schrieb:
> Ganz unabhängig davon musst Du bei jedem Digitalfilter noch dafür
> sorgen, dass die Eingangswerte schon physikalisch begrenzt sind. Du
> kannst mit einem Digigalfilter z.B. keinen ADC filtern, dessen Eingang
> SignaleAnteile über der Samplerate hat.

von A. S. (Gast)


Lesenswert?

Markus schrieb:
> Der Begriff "Exponentialfilter" mag
> an das aussehen der Sprungantwort angelehnt sein, gebräuchlich ist der
> Begriff in der Signalverarbeitung nicht.

Es ist die digitale Form des PT1-Gliedes, nur halt mit P = 1;

von W.S. (Gast)


Lesenswert?

Ingo L. schrieb:
> Beide glätten das Signal, Variante zwei jedoch stärker.

Dann hast du irgendwo nen Fehler gemacht.

Im Grunde ist es egal, ob man einen gleitenden Mittelwert bei jedem 
neuen Sample komplett ausrechnet oder sich das Ergebnis gemerkt hat und 
bei jedem Sample den ältesten abzieht und den jüngsten addiert.

Ingo L. schrieb:
> Wie errechnet sich hier die Eckfrequenz?

Na dann denke doch mal nach: Wenn du zuvor nur Nullen hattest und dann 
alle neuen Samples gleich 1 sind, dann siehst du ne lineare Rampe am 
Ausgang. Sie ist so lang wie die Länge deines Filters. Wenn du nun 
wieder Nullen nachschiebst, kommst du wieder bei null an, aber erst nach 
so viel Samples, wie dein Filter lang ist. Also hast du für eine 
Vollwelle 2*Filterlänge an Periode. Du hast dabei aber aus einem 
Rechteck ein Dreieck gemacht und das ist noch kein Sinus. Also ist deine 
echte Eckfrequenz nochmal ein Stück niedriger. Grob geschätzt würde ich 
den Sinus bei etwa 2/3 deiner Dreieckfrequenz ansiedeln.

W.S.

von W.A. (Gast)


Lesenswert?

W.S. schrieb:
> Im Grunde ist es egal, ob man einen gleitenden Mittelwert bei jedem
> neuen Sample komplett ausrechnet

Wo wird der bei jedem neuen Sample komplett neu gerechnet. Beim 
IIR-Filter (2) steht
1
Frequency.BufferSum -= Frequency.BufferSum / NR_OF_MIDDLE;
Guck dir den Unterschied zwischen FIR- und IIR-Filter noch mal an.

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.