Can Kosar

Digitales Tiefpassfilter (LPF)

Das Tiefpassfilter filtert die höheren Frequenzen als die Grenzfrequenz f_0  heraus und lässt die Tieferen durch.

Rendered by QuickLaTeX.com

Die Übertragungsfunktion eines digitalen Tiefpassfilters 2. Ordnung kann als

(1)   \begin{equation*} H(s)=\frac{1}{s^2+\frac{s}{Q}+1} \end{equation*}

beschrieben werden.

Ermittlung der Koeffizienten für das Biquad-filter

Nach der bilinearen Transformation erhält man

(2)   \begin{equation*} \begin{align} a_0&=1+\alpha \\ b_{n,0}&=\frac{1}{1+\alpha} \frac{1-\cos(w_0)}{2} \\ b_{n,1}&=\frac{1}{1+\alpha} (1-\cos(w_0))\\ b_{n,2}&=\frac{1}{1+\alpha} \frac{1-\cos(w_0)}{2} \\ a_{n,1}&=\frac{1}{1+\alpha} (-2 \cos(w_0))\\ a_{n,2}&=\frac{1}{1+\alpha} (1-\alpha)\\ \end{align} \end{equation*}

wobei

(3)   \begin{equation*} \begin{align} f_0 &: Grenzfrequenz\\ F_s&: Abtastrate\\ \omega_0&=2 \pi \frac{f_0}{F_s}\\ \alpha&=\frac{sin(\omega_0)}{2 Q} \end{align} \end{equation*}

Implementierung

Somit erhält man alle Koeffizienten, die man für die Implementierung braucht. Die Implementierung der Koeffizientenberechnung würde folgendermaßen aussehen.

Am Code lassen sich manche Optimierungen erkennen.

  • Mehrmals vorkommende Variablen sind vorberechnet (z.B. trigonometrische Funktionen)
  • Anstatt jedes mal durch a_0 zu teilen, wird mit inversem (ein mal vorberechneten) Wert a_0^{-1} multipliziert, da Multiplikation günstiger ist als Division für viele CPUs.
  • Die Berechnungen erfolgen mit  Gleitkommezahlen doppelter Präzision (double) und wird am Ende auf Float gecastet. Der Grund: Trigonometrischen Funktionen mit Single-Präzision (float) kann zu erheblichen numerischen Fehlern und dadurch zu unerwünschten Ergebnissen bzw. Instabilität führen.
  • Der Code ist optimiert für die Hardware-FPU von Cortex-M7 Mikroprozessor.

Klangbeispiele

Kategorie(n): Audiotechnik, DSP, Effects

Bilineare Transformation » « Biquad Filter

2 Kommentare

  1. Sehr geehrter Herr Kosar,

    Mein Name ist Markus Nickel.
    Zuerst Danke dass Sie die obigen Informationen online gestellt haben.
    Ich versuch gerade anhand Ihres Besipieles einen Filter zu programmieren.

    Ich habe eine Frage bezüglich der Amplitude des Ausgangssignales.
    Diese ist bei meinen Tests deutlich abgeschwächt gegenüber dem Eingangssignal.
    Ich habe bemerkt dass dies abhängig von der Abtastfrequenz ist.
    Wie bzw. an welcher Stelle müsste ich einen Verstärkungsfaktor in die Berechnung einfügen der das Ausganssignal im gleichen Amplitudenbereich wie das Eingangssignal wiedergibt?
    Der Verstärkungsfaktor sollte sich natürlich den variablen Abtastfrequenzen anpassen.

    Meine Internetrecherche hierzu hat leider zu keinem Ergebniß geführt.

    Es währe schön wenn Sie meine Frage beantworten könnten.

    Mit freundlichen Grüßen

    Markus Nickel

    • Das Signal sollte nicht abgeschwächt sein. Falls kein Implementierungsfehler vorliegt, vermute ich, dass Sie die Grenzfrequenz falsch (zu tief) berechnet haben und einen unerwünschten Bereich abschwächen.

      Abgesehen davon, eine Verstärkung hinzuzufügen ist nichts weiter als eine Multiplikation des (Ausgangs-)signals. Beachten Sie dabei, dass die Lautstärkenwahrnehmung logarithmisch ist.

Schreibe einen Kommentar

Ihre Email-Adresse wird nicht veröffentlicht.

*

Rechte © 2021 Can Kosar

Mit Unterstützung von Wordpress, QuickLaTeX und Design von Anders NorenSeitenanfang ↑