Forum: Digitale Signalverarbeitung / DSP / Machine Learning Tiefpassfilter 1. Ordnung; Abtastrate / Grenzfrequenz


von Jens (Gast)


Lesenswert?

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.

von Helmut S. (helmuts)


Lesenswert?

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
von Jaroslaw (Gast)


Lesenswert?

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)

von Wolfgang (Gast)


Lesenswert?

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 ;-)

von Helmut S. (helmuts)


Lesenswert?

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
von Jan K. (jan_k)


Lesenswert?

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

von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

Sollte man bei den heutigen Möglichkeiten von MCUs den Rechenaufwand 
nicht direkt auf ein TPF zweiter Ordnung lenken?

von Jan K. (jan_k)


Lesenswert?

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.

von J. S. (engineer) Benutzerseite


Lesenswert?

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.

von Helmut S. (helmuts)


Angehängte Dateien:

Lesenswert?

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