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.
Gast
#3329074
> 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
Einfach und übersichtlich: http://www.ibrtses.com/embedded/exponential.html
Gast
#3329465
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.