Gleitender Mittelwert unterschied

OP #4805468
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?
OP #4805554
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.
#4805565
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.
Gast #4805671
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.
Gast #4805674
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 ...)
Gast #4805710
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.
Gast #4805794
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.
Gast #4805813
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.
Gast #4805815
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.
Gast #4806351
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.
Gast #4806770
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.
Gast #4806783
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren