Forum: Digitale Signalverarbeitung / DSP / Machine Learning Digitaler Kerbfilter


von Kai123 (Gast)


Lesenswert?

Hallo,

ich habe einen Kerbfilter mit der Übertragungsfunktion
H(s)=1/(1+s/(1+s^2)).

Ich ersetze das s durch w/wc  (wc = cutoff-Frequenz)
und führe eine bilineare Transformation durch :
(w=j(1-z)/(1+z))

Mit dem resultierenden Quotient mache ich einen
Koeffizientenvergleich, um die a und b des
zugehörigen Biquads zu bestimmen.

Der Zähler lautet : (wc^2-1)+(2wc^2+2)z+(wc^2-1)z^2
Der Nenner lautet : (wc^2-1+jwc)+(2wc^2+2)z+(wc^2-1-jwc)z^2

Als letztes teile ich sämtliche Koeffizienten
durch (wc^2-1-jwc).

Ich habe die Formeln in ein Programm umgesetzt
und mir die Spektralfrequenzanzeige in Adobe Audition
angesehen. Leider ist das Ergebnis kein Kerbfilter.

Weiß einer von Euch, wo mein Denkfehler liegt?

Gruß
Kai

von Audioverarbeiter (Gast)


Lesenswert?

"Spektralfrequenzanzeige in Adobe Audition" ist nicht unbedingt das, was 
ich als Messintrument heranziehen würde.

von Kai123 (Gast)


Lesenswert?

Hm,
weiss nicht. Die ist eigentlich sehr
zuverlässig. Womit würdest Du es denn
machen?

Gruß
Kai

von Kai123 (Gast)


Lesenswert?

Okay,
habe es hinbekommen :-)

Nach dem Ersetzen von s durch (w/wc)^n musste
ich die Nullstellen von 1 + (1-µ)(w/wc)^n + (w/wc)^2n
bestimmen und die erste Hälfte faktorisieren.
Nach paarweisem Zusammenfassen erhielt ich die
gesuchten Koeffizienten für das jeweilige Biquad.
Die Biquads konnte ich dann problemlos
kaskadieren.

Einer von zwei Fehlern war, dass ich in den sinus
und cosinus-Termen pi * j / n
eingesetzt habe, wo eigentlich 2.0 * pi
* j / n hingehörte. Das rührte daher, dass
ich s durch (w/wc)^2n statt durch (w/wc)^n
ersetzte.

Für den anderen Fehler habe ich noch keine
Ursache gefunden. Nämlich, dass ich nicht
einfach die bilineare Transformation
anwenden kann.

von MJF (Gast)


Lesenswert?

Kai123 schrieb:
> Okay,
> habe es hinbekommen :-)
>>
> Für den anderen Fehler habe ich noch keine
> Ursache gefunden. Nämlich, dass ich nicht
> einfach die bilineare Transformation
> anwenden kann.

Vielleicht weil die bilineare Transformation zwischen einem Filter in 
Laplace-Transformation und Z-Transformation eine Taylor-Näherung 
verwendet mit einem Entwicklungspunkt bei der Frequenz Null. Ich habe 
jetzt  kein Lehrbuch zur Hand, aber bei der bilinearen Transformation 
wird

s = ln (z) (oder ähnlich)

Durch eine Taylor-Reihenentwicklung genähert.

von Kai123 (Gast)


Lesenswert?

Taylor kenne ich aus Analysis I. Aber ich verstehe nicht,
wie die Näherung mir hierbei helfen kann. Laplace und Z-
Transfomierte kenne ich nur vom Namen. Ich bin Neuling auf
diesem Gebiet und programmiere erst seit zwei Wochen Filter
in C++.

Mein Denkfehler tritt nicht nur bei dem
Kerbfilter auf, sondern auch bei einfacheren
Filtertypen. Ich würde gerne Schritt für
Schritt verstehen und sehen, wo genau die
falsche Umformung liegt.

Ich beginne mal mit einem
einfachen Butterworth-Tiefpass :

1. H(s) = 1 / (1 + s^2)
   f := s

2. z = exp(2*pi*j*f) <=>
   ln(z) = 2*pi*j*f <=>
   f = 1/(2*pi*j)*ln(z)
   @MJF : ist es das, was Du meintest mit
               "s = ln (z) (oder ähnlich)"?

3. Ausführen des pre-warp :
   w = tan(pi*f)
     = tan(-j/2*ln(z))
     = sin(-j/2*ln(z)) / cos(-j/2*ln(z))
     = j * sinh(-1/2*ln(z)) / cosh(-1/2*ln(z))
     = j * [1 / 2 * exp(-1/2*ln(z)) - exp(1/2*ln(z))]
         / [1 / 2 * exp(-1/2*ln(z)) + exp(1/2*ln(z))]
     = j * [z^(-1/2) - z^(1/2)] / [z^(-1/2) + z^(1/2)]
     = j * [1 - z] / [1 + z]

4. Somit ist w = j * [1 - z] / [1 + z] und
5. 1 / (1 + (w / wc)^2) = (1+z)^2*wc^2
     / [(wc^2-1)*z^2 + 2(wc^2+1)z + wc^2-1]

Das Ergebnis ist schon irgendwie ein Tiefpass,
aber mit starker Resonanz in der Eckfrequenz wie sie
bei Butterworth nicht auftreten sollte.

von Kai123 (Gast)


Lesenswert?

Ich denke, ich habe es.

Bei Butterworth (und anderen rekursiven Filtern) lautet die
Definition der Transfer-Funktion nicht H(s) = 1 / (1 + s^2)
(oder vergleichbar), sondern H(s)*H(-s) = 1 / (1 + s^2), also
ist sie definiert als das Produkt einer zu findenden Funktion
mit ihrer komplex konjugierten.

Nun hat 1 + s^2 zwei Nullstellen (j und -j), von denen nur
die erste interessiert. Nun setze ich w = j * (1-z) / (1+z)
in (w/wc - j) ein, kehre den Bruch um und bekomme (1+z)*wc
/ (-1 + wc + (1 + wc)z) (unter Vernachlässigung von j).

An dieser Stelle mache ich wieder einen Koeffizientenvergleich
und erhalte ein Biquad erster Ordnung. Es ist genau das gesuchte
Biquad zu der Transfer-Funktion :-)

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.