Dikreten Tiefpass programmieren?!

OP #3329067
Lesenswert?

Hallo,

Man findet oefter mal die Frage wie man in C einen Tiefpass
programmiert.
z.B Beitrag "Tiefpaß mit C programmieren"

Ich habe es jetzt nach langen Überlegungen endlich kapiert und will
das hier mit Euch teilen.

Diskreter Tiefpass:
y(n) = e * x + (1-e)* y(n-1) // Alter Wert mehr Gewicht, neuer Wert
weniger

mit e = exp(-Tabtast/TAU)

Jetzt zu der Umsetzung in C:
Annahme e = 1/16

y(n) = (1/16) * x + y(n-1) -(1/16)*y(n-1)

y(n) * 16 = x + y(n-1)*16 - y(n-1)

Substitution -> r = y(n)*16

r = x + y(n-1)*16 - y(n-1)
y(n) = r /16

Weiter vereinfachen

r = x + (r/16)*16 - y(n-1) = x + r -y(n-1)
y(n) = r / 16

Weiter vereinfachen zum Umsetzen in C

r = x + r -y(n-1)
y(n) = r >> 4

Ich hoffe die Herleitung interessiert den ein oder anderen.
Ich habe nie verstanden wie der Tiefpass mit den Shiftoperationen 
funktioniert. Jetzt ist es klar.
#3329165
Lesenswert?

Martin H. schrieb:
> y(n) = e * x + (1-e)* y(n-1) // Alter Wert mehr Gewicht, neuer Wert

Man kann das auch vereinfachen, indem man anders klammert:
y(n) = e*x + y(n-1) - e*y(n-1)
-> y(n) = y(n-1) + e*(x - y(n-1))

Das ist auch relativ anschaulich: zum alten Wert wird die Differenz 
zwischen neuem und altem Wert mit einem Gewichtungsfaktor addiert. Wenn 
dieser Faktor sehr klein ist, bewirkt eine bestimmte Differenz nur eine 
sehr kleine Änderung -> lange Zeitkonstante; mit einem größeren Faktor 
wird die Zeitkonstante kürzer und beim Faktor 1 wirkt der alte Wert 
überhaupt nicht mehr.

Dadurch hat man nur einmal die Multiplikation. Ist vorallem dann 
vorteilhaft, wenn e keine 2er-Potenz ist.

Beipspiel für e = 3/16:
y(n) = y(n-1) + 3/16*(x - y(n-1))

Substitution -> r = y(n)*16
r = r + 3*(x - y(n))
y(n+1) = r >> 4

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