Hallo zusammen. Ich möchte einen einfachen Tiefpassfilter 1. Ordnung mit result = ((n - 1) * result + neuerWert) / n programmieren. Gibt es eine einfache Möglichkeit n anhand der Samplerate und der Grenzfrequenz zu bestimmen? Vielen Dank im Voraus.
result = ((n - 1) * result + neuerWert) / n a=1/n y(i) = (1-a)*y(-1) + a*x(i) https://en.wikipedia.org/wiki/Low-pass_filter Ts = Abtastperiodenzeit fs = 1/Ts Abtastfrequenz Grenzfrequenz fc fc = a/((1-a)*2*pi*Ts) fc = fs * a/((1-a)*2*pi) Dämpfung bei der halben Abtastfrequenz G(fs/2) = a/(2-a)
:
Bearbeitet durch User
Helmut S. schrieb: > (...) Grenzfrequenz fc = a/((1-a)*2*pi*Ts) (...) Hallo, ich bin zu einer anderen Formel gekommen: fc = 1/(2*PI*Ts) * arccos{1-a*a/[2(1-a)]} Und daraus: a = sqrt[B*(B+2)] - B wo B = 1-cos(2*PI*fc*Ts)
Jaroslaw schrieb: > ich bin zu einer anderen Formel gekommen: > fc = 1/(2*PI*Ts) * arccos{1-a*a/[2(1-a)]} Dann rechne mal arccos{1-a*a/[2(1-a)]} für kleine a aus ;-)
Jaroslaw schrieb: > Helmut S. schrieb: >> (...) Grenzfrequenz fc = a/((1-a)*2*pi*Ts) (...) > > Hallo, > ich bin zu einer anderen Formel gekommen: > fc = 1/(2*PI*Ts) * arccos{1-a*a/[2(1-a)]} > Und daraus: > a = sqrt[B*(B+2)] - B wo B = 1-cos(2*PI*fc*Ts) Hello Jaroslaw, vielen Dank für deine Formel. Ich hatte mich schon gewundert warum ich im Frequenzgang und in der Sprungantwort in meinem Beispiel um 4% daneben lag. (wc=1000/s, Ts=100us) Mit deiner Formel für "a" passt das perfekt. wc = 2*pi*fc fc = fs/(2*pi) * acos(1-a^2/(2*(1-a))) wc/fs = acos(1-a^2/(2*(1-a))) cos(wc/fs) = 1-a^2/(2*(1-a)) b = cos(wc/fs) b = 1-a^2/(2*(1-a)) a = b-1+sqrt((b-1)^2+2-2*b) B = 1 -cos(wc/fs) a = sqrt[B*(B+2)] - B Beispiel: wc=1000 fs=10000 a = 0.0951 Mit meiner alten Formel kam da a=0.09091 heraus. Gruß Helmut
:
Bearbeitet durch User
Da noch keiner den Rechenweg hingschrieben hat mache ich das mal ;). War etwas rumrechnerei, kennt jemand einen schnelleren Weg? k ist der diskrete Zeitschritt. y ist das Ausgangssignal im Zeitbereich x ist das Eingangssignal im Zeitbereich Y resp. X sind die Z-Transformierten ebenjener Signale. H(z) ist die diskrete Übertragunsfunktion
Der Frequenzgang ist die Übertragungsfunktion auf der komplexen Achse ausgewertet. Der Zusammenhang lautet
. Der Frequenzgang ist der Betrag der Übetragungsfunktion:
Da kann man jetzt noch etwas rumrechnen und cos^2 + sin^2 = 1 usw benutzen. Die cutoff Frequenz ist da, wo sich die Leistung halbiert, also im Falle unserer Übertragungsfunktion (das sind Amplituden, keine Leistungen):
Einsetzen, ich betrachte ab jetzt nur noch den Nenner!
Die quadratische Gleichung lösen, dann kommt mit
folgendes für n heraus:
Ich komme da mit
auf n = 10.517, was eurem a = 0.095087 entspricht. Kennt wer einfachere Möglichkeiten? Schöne Grüße, Jan
Sollte man bei den heutigen Möglichkeiten von MCUs den Rechenaufwand nicht direkt auf ein TPF zweiter Ordnung lenken?
Martin K. schrieb: > Sollte man bei den heutigen Möglichkeiten von MCUs den Rechenaufwand > nicht direkt auf ein TPF zweiter Ordnung lenken? Kommt drauf an was du brauchst ;) Das genannte Filter ist halt fix und einfach implementiert. Wenn du ein bisschen was glätten möchtest ohne viel rechnen passt du halt heuristisch an und gut ist.. Filter höherer Ordnung muss man halt irgendwie eine Funktion für schreiben oder eine Lib nehmen. Da muss man dann aber auch die Koeffizienten berechnen usw. Manchmal lohnt das, manchmal nicht. Von der Rechenleistung ist das natürlich sehr häufig gar kein Problem mehr.
Naja, für Filterauslegung für 2.Ordnung ist jetzt auch nicht so schwer. entweder man zieht die GF weit auseinander, in Anpassung an z.B. eine Dezimation oder man legt sie auf dieselbe Frequenz, um es steilflankig zu machen. Die einzige Abweichung, die ich sonst noch kenne ist die Auslegung von den ladder filter, wenn man Oktave-weise einen zusätzlichen Knick braucht. Alles andere drum herum ist Optimierung für den Rechenaufwand.
Hier noch eine Verbesserung für das Filter 1. Ordnung. Wenn man die Übertragungsfunktion 1/(1+jwT) mit der bilinearen Transformation in den z-Bereich transformiert, dann geht die Dämpfung vorteilhaft in Richtung unendlich bei der halben Abtastfrequenz. Siehe die rote Kennlinie. y(n) = (x(n) +x(n-1) +y(n)*c1)*c2 Die grüne Kennlinie ist das bisher diskutierte Filter 1. Ordnung. y(n) = x(n)*a +y(n)*(1-a)
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.