Forum: Digitale Signalverarbeitung / DSP / Machine Learning Dikreten Tiefpass programmieren?!


von Michael B. (yoobh)


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.

von Mario S. (Gast)


Lesenswert?

> Substitution -> r = y(n)*16
Wobei man hier sieht, dass r um 16 größer ist als die Ausgangsgröße.
Deshalb ist r in der Praxis oft ein long, während x und y noch in einen 
int passen.

von Johannes E. (cpt_nemo)


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

von Abdul K. (ehydra) Benutzerseite


Lesenswert?


von Ingenieur (Gast)


Lesenswert?

Ich lasse die grosse Summe immer auf erhöhter Auflösung rechnen und gebe 
das Ergebnis gerundet geteilt aus. Dann geht das auch in Ganzzahlen gut.

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.