Implementierung kaskadierter IIR/FIR-Filter Matlab, der perfekter Helfer

Wie sich kaskadierte Filter in geringerer Ordnung realisieren und berechnen lassen.
Wie sich kaskadierte Filter in geringerer Ordnung realisieren und berechnen lassen.

Dieser Artikel beschreibt, wie sich Koeffizienten von FIR- und IIR-Filtern n-ter Ordnung, die als eine Anordnung kaskadierter Filter geringerer Ordnung realisiert werden sollen, berechnen lassen. Zum Beispiel mit Decimation Filter IP Block (DecFilter), wie er auf 32-bit-Automotive-Mikrocontrollern von NXP für Powertrain-Applikationen integriert ist.

Bei der Implementierung von FIR- oder IIR-Filtern n-ter Ordnung als kaskadierte Reihe von Filtern kleinerer Ordnung muss das Polynom, das den Filter n-ter Ordnung beschreibt, in eine Reihe kleinerer äquivalenter Polynome zerlegt werden. Diese werden auf den kaskadierten Blöcken implementiert. Matlab eröffnet verschiedene Möglichkeiten, Filter zu generieren und zu kaskadieren.

Als Beispiel dient die Berechnung der Koeffizienten für ein IIR-Filter sechster Ordnung, das mit Hilfe zweier Instanzen des DecFilter-Blocks realisiert werden soll. Letzterer ermöglicht die Implementierung entweder eines IIR-Filters vierter Ordnung oder eines FIR-Filters achter Ordnung. Die hier gezeigten Verfahren gelten genauso für FIR-Filter.

Für dieses Beispiel wird das IIR-Filter in Matlab dimensioniert. Dazu kommen die mathematischen, Signalverarbeitungs- und symbolmathematischen Toolb-Boxes zum Einsatz. Der Matlab-Code für das Beispiel ist am Ende dieses Textes zu finden. Das Filter-Design in Matlab ist allerdings nur als reines Beispiel zu sehen und soll keinem bestimmten Zweck dienen.

Für die Implementierung eines kaskadierten Filters gibt es folgende grundlegende Schritte:

  • 1. Einsatz von Matlab zur Berechnung der Filterkoeffizienten eines einzelnen Filters, dessen Ordnung höher ist als die maximal für ein Filter des DecECFilter-Blocks mögliche Ordnung.
  • 2. Berechnung der entsprechenden Z-Transformation in Faktoren mit Polen/Nullstellen durch Bestimmung der Wurzeln der Polynome im Zähler und Nenner
  • 3. Kombination der einzelnen Faktoren mit ihren Polen/Nullstellen so, dass sich für jedes kaskadierte Filter die Verstärkung, die Frequenzantwort und die Ordnung wie gewünscht ergeben. So werden die Koeffizienten der einzelnen kaskadierten Filter gewonnen.
  • 4. Analyse des Filters auf seine Stabilität und, wenn es die Spezifikation erfüllt, Untersuchen der Effekte einer Implementierung in Festkomma-Hardware.

Beispiel für ein IIR-Filter sechster Ordnung

Ein IIR-Filter wird allgemein durch die folgende Differenzengleichung beschrieben (1).

Bild 1 zeigt die Realisierung einer IIR-Filter-Gleichung vierter Ordnung im DecECFilter-IP. Um ein IIR-Filter auf dem DecECFilter IP zu implementieren, müssen zunächst die Filterkoeffizienten abgeleitet werden, die welche die gewünschte Frequenzantwort des Filters ergeben.

Bei der Implementierung des Filters müssen darüber hinaus die Verstärkung, die Stabilität und die durch die Quantisierung der Filterkoeffizienten eingeführten Fehler Berücksichtigung finden. Letztere entstehen bei der Realisierung in Festkomma-Hardware mit begrenzter Bitanzahl im Gegensatz zum in Matlab verwendeten Fließkommamodell. Zusätzlich gilt es bei kaskadierten Filtern, die Verstärkung gleichmäßig auf die einzelnen Stufen zu verteilen. Damit wird eine Verschlechterung des Störabstands durch übermäßige Dämpfung des Signals und die Übersteuerung nachfolgender Stufen durch übermäßige Verstärkung des Signals verhindert. Das nachfolgende Beispiel veranschaulicht alle diese Punkte.

Annahme: Realisierung eines Hochpassfilters (HPF) mit den in Tabelle 1 festgelegten Charakteristika. Andere Charakteristika wie Welligkeit im Durchlassbereich oder Roll-off Rolloff im Sperrbereich können spezifiziert und im Design berücksichtigt werden, aber um das Konzept von kaskadierten Filtern zu demonstrieren, ist das nicht notwendig. Das IIR sechster Ordnung wird mit Hilfe der direkten Filter-Design-Funktion yulewalk() in Matlab entworfen.

Die folgenden Koeffizienten – Reihenfolge in abnehmender Potenz von Z – werden erhalten (Tabelle 2). Es gibt andere Matlab-Toolbox-Funktionen, mit denen sich Filter entwerfen lassen, aber yulewalk() ist für dieses Beispiel ausreichend. Die Frequenzantwort des Filters ist in Bild 2 dargestellt.

2. Berechnung der Z-Transformation

An dieser Stelle wäre es ein Fehler, die Filterkoeffizienten auf kaskadierte Filterblöcke mit geringerer Ordnung als das entworfene Filter zu verteilen. Das würde kein äquivalentes Filter ergeben, weil sich die Frequenzantworten kaskadierter Filter multiplizieren. Um das Filter korrekt in kaskadierte Teilfilter zu partitionieren, muss das Filter-Polynom in einen äquivalenten Satz von Polynomen geringerer Ordnung aufgebrochen werden, die – miteinander multipliziert – das ursprüngliche Polynom und somit das gewünschte Filter zurückliefern.

Es gibt zwei Möglichkeiten, ein Polynom in Faktoren aufzubrechen: das Pol-und-Nullstellen-Verfahren oder alternativ die factor()-Funktion aus der Symbolic Math Toolbox von Matlab. In diesem Beispiel kommt das Pol-und-Nullstellen-Verfahren zum Einsatz, da es in der Signalverarbeitungs-Werkzeugbox verfügbar ist und die Symbolic Math Toolbox nicht erforderlich macht. Für diese ist eine zusätzliche Lizenz notwendig.

Mit der Symbolic Math Toolbox lässt sich über die factor()-Funktion direkt ein Satz äquivalenter Polynome mit einer maximalen Ordnung von 2 gewinnen. Mit diesem Verfahren können die Koeffizienten der kleineren Polynome nach Quantisierung auf die Festkommarepräsentation in Hardware einfach auf die DecECFilter-Blöcke verteilt werden.

Aspekte der Filterstabilität, der stufenweisen Verstärkung, Überlauf und Quantisierungsfehler müssen in der endgültigen Implementierung betrachtet werden.

Um diese Konzepte zu verdeutlichen, wird eine manuelle Methode für die Zerlegung des Filters in kleinere, äquivalente Filter gezeigt. Diese wird ebenfalls benötigt, wenn die Symbolic Math Toolbox nicht zur Verfügung steht. Die Transferfunktion der Filterdifferenzgleichung (1) wird mit Hilfe einer Z-Transformation abgeleitet. Die Koeffizienten eines IIR-Filters können in Form von Teilpolynomen berechnet werden (2).