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.