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.
> 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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.