Dikreten Tiefpass programmieren?!

OP #3329067
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.
#3329165
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.