Der Effekt der Koeffizientenquantisierung auf die Leistung eines Digitalfilters

02. Der Effekt der Überzeugung (Kann 2019).

$config[ads_text] not found
Anonim

Der Effekt der Koeffizientenquantisierung auf die Leistung eines Digitalfilters


Der vorhergehende Artikel in dieser Reihe diskutierte einige grundlegende Strukturen, um Finite-Impulse-Response (FIR) -Filter zu implementieren. Dieser Artikel wird bestätigen, dass eine geeignete Struktur die Empfindlichkeit der Filterantwort auf die Koeffizientenquantisierung reduzieren kann.

Für einen gegebenen Satz von Filterspezifikationen erhalten wir im Allgemeinen die Filtersystemfunktion, $$ H (z) $$, unter der Annahme, dass die Filterkoeffizienten mit unendlicher Genauigkeit dargestellt werden können. Wenn jedoch das Filter in der realen Welt implementiert wird, müssen wir eine endliche Anzahl von Bits verwenden, um jeden Koeffizienten von $$ H (z) $$ darzustellen. Diese Koeffizientenquantisierung kann irgendwie den Ort der Filterpole und Nullstellen ändern.

Als Ergebnis können wir nach dem Implementieren eines Filters beobachten, dass die Frequenzantwort des Filters sich ziemlich von derjenigen des ursprünglichen Entwurfs unterscheidet. Der Fehler in den Pol- und Nullstellen hängt von mehreren Faktoren ab. Dieser Artikel wird einige dieser Faktoren diskutieren und zeigen, wie wir Filter entwerfen können, die eine geringere Empfindlichkeit für die Koeffizientenquantisierung aufweisen.

Bevor wir unsere Diskussion fortsetzen, wollen wir ein Beispiel für die Koeffizientenquantisierung betrachten.

Beispiel 1

Die Übertragungsfunktion eines Infinite Impulse Response (IIR) Filters ist gegeben durch:

$$ H (z) = \ frac {\ Summe_ {k = 0} ^ {M-1} b_ {k} z ^ {- k}} {\ Summe_ {k = 0} ^ {N-1} a_ { k} z ^ {- k}} $$

Wir können die MATLAB ellip- Funktion verwenden, um einen elliptischen Filter zu entwerfen. Zum Beispiel ergibt (b, a) = ellip (7, 0, 5, 50, 0, 3) ein elliptisches Tiefpassfilter siebter Ordnung mit 0, 5 dB Welligkeiten im Durchlassbereich und 50 dB Dämpfung im Sperrbereich. Die Passbandkante des Filters liegt bei der normalisierten Frequenz von $$ 0.3 \ pi $$. Die Koeffizienten dieses Filters sind in der folgenden Tabelle angegeben. Wir betrachten diese Koeffizienten als die unquantisierten.

Tabelle 1. Die unquantisierten Koeffizienten eines elliptischen Tiefpassfilters mit dem Durchlassbereich von DC nach $$ 0.3 \ pi $$.
kb k (nicht quantifiziert)a k (nicht quantifiziert)
00.0122183578821431.000000000000000
1-0, 009700754662078-4.288900601525732
20, 0243504508268459.216957436091198
30, 002532504848041-12.195350561406707
40, 00253250484804110.633166152311462
50, 024350450826845-6, 062798190498858
6-0, 0097007546620782.098067018562072
70.012218357882143-0, 342340135743532

Die Größe des Frequenzgangs dieses Filters ist in Abbildung 1 dargestellt.

Abbildung 1. Die Größe der Frequenzantwort des nicht quantisierten Filters.

Abbildung 2 zeigt die Pole (blaue Kreuze) und Nullen (rote Punkte) der Übertragungsfunktion. Da sich die Pole innerhalb des Einheitskreises befinden, ist der Filter stabil.

Abbildung 2. Die Pole und Nullen der nicht quantisierten Systemfunktion.

Wir quantisieren die Koeffizienten unter Verwendung eines Bits für das Vorzeichen und neun Bits für die Größe der Koeffizienten. Da alle Koeffizienten von $$ b_k $$ kleiner sind als $$ 2 ^ {- 5} = 0.03125 $$, können wir einen Skalierungsfaktor von $$ 2 ^ {(Anzahl \; von \; Bits + 5)} = 2 ^ betrachten {(9 + 5)} = 16384 $$ für diese Koeffizienten und erreichen eine genauere Darstellung. Die quantisierten $$ b_k $$ Koeffizienten sind in Tabelle 2 aufgelistet. Um beispielsweise den quantisierten Wert von $$ b_1 $$ zu berechnen, werden wir zuerst den Skalierungsfaktor anwenden und erhalten:

$$ b_ {1} \ mal 2 ^ {(9 + 5)} = 0.012218357882143 \ mal 2 ^ {(9 + 5)} = 200.1856 $$

Jetzt können wir das Ergebnis auf $ 200 $ runden. Die binäre Darstellung von $$ 200 $$, welche $$ 011001000 $$ ist, wird verwendet, um die Koeffizienten zu implementieren. Wir sollten jedoch berücksichtigen, dass wir die Ergebnisse mit einem Neuskalierungsfaktor von $$ 2 ^ {- (9 + 5)} $$ interpretieren müssen. Dann kann das Dezimaläquivalent des quantisierten Koeffizienten durch Multiplizieren von $$ 200 $$ mit $$ 2 ^ {- (9 + 5)} $$ erhalten werden, was $$ 0, 0122 $ ergibt.

In diesem speziellen Beispiel wären mit einem Skalierungsfaktor, der kleiner als $$ 2 ^ {(9 + 5)} $$ ist, mehrere Bits der binären Repräsentation der Koeffizienten $$ b_k $$ für alle Koeffizienten Null und wir würden die Richtigkeit. Nehmen wir zum Beispiel an, dass wir neun Bits zuweisen, um den Bruchteilwert der Koeffizienten $$ b_k $$ darzustellen. Daher sollten wir einen Skalierungsfaktor von $$ 2 ^ {9} $$ anwenden, der folgendes ergibt:

$$ b_ {1} \ mal 2 ^ 9 = 0.012218357882143 \ mal 2 ^ 9 = 6.2558 $$

Offensichtlich muss in diesem Fall ein Neuskalierungsfaktor von $$ 2 ^ {- 9} $$ bei der Interpretation des Ergebnisses der Berechnungen berücksichtigt werden. Um $$ 6.2558 $$ zu runden und in die binäre Darstellung umzurechnen, erhalten wir $$ 00000110 $$. Wir stellen fest, dass, obwohl wir neun Bits verwenden, um diese Zahl darzustellen, die meisten von ihnen Null sind. Der Leser kann verifizieren, dass mit diesem Skalierungsfaktor mehrere Bits sogar für das größte $$ b_k $$, dh $$ 0.024350450826845 $$, Null sind.

Um die Koeffizienten $$ a_k $$ zu quantisieren, stellen wir fest, dass die Größe des ganzzahligen Teils dieser Koeffizienten kleiner ist als $$ 16 $$. Daher können wir vier Bits für den ganzzahligen Teil und fünf Bits für den gebrochenen Teil reservieren. Als Ergebnis wird der Skalierungsfaktor der Koeffizienten $$ a_k $$ $$ 2 ^ 5 $$ sein. Zum Beispiel haben wir mit $$ a_2 = 9.216957436091198 $$:

$$ a_ {2} \ mal 2 ^ 5 = 9.216957436091198 \ mal 2 ^ 5 = 294.9426 \ ca. 295 $$

Daher wird der quantisierte Dezimalwert für den Koeffizienten $ 9.2188 $$ betragen. In ähnlicher Weise können wir die quantisierten Werte von anderen Koeffizienten von $$ a_k $$ finden, wie sie in Tabelle 2 unten angegeben sind.

Tabelle 2. Der Dezimalwert der quantisierten Koeffizienten.
kb k (quantisiert)a k (quantisiert)
00.01221.0000
1-0, 0097-4.2813
20, 02449.2188
30, 0025-12.1875
40, 002510.6250
50, 0244-6.0625
6-0, 00972.0938
70.0122-0, 3438

Abbildung 3 vergleicht die Frequenzantwort des quantisierten Filters (die Kurve in Rot) mit der des unquantisierten Systems (die Kurve in Blau). Wir beobachten, dass die Quantisierung der Koeffizienten die Frequenzantwort beeinträchtigt hat.

Abbildung 3. Der Frequenzgang des quantisierten Filters (in Rot) gegenüber dem des unquantisierten Systems (in blau).

Die Pole (blaue Kreuze) und Nullen (die roten Punkte) des quantisierten Filters sind in Fig. 4 gezeigt. Wie in dieser Figur gezeigt, sind zwei der Pole aus dem Einheitskreis herausbewegt und das quantisierte Filter ist instabil. Dieses Beispiel zeigt, dass nach dem Entwurf eines Filters der Effekt der Koeffizientenquantisierung untersucht werden muss. Wenn der quantisierte Filter die Zielspezifikationen nicht erfüllt, müssen wir den Filter neu entwerfen. Im Rest des Artikels werden wir sehen, dass die Implementierung eines Filters höherer Ordnung als eine Kaskade von Sektionen zweiter Ordnung die Empfindlichkeit auf die Koeffizientenquantisierung signifikant reduzieren kann.

Abbildung 4. Die Pole und Nullen des quantisierten Filters.

Analyse der Empfindlichkeit auf Koeffizient-Quantisierung

Um die Empfindlichkeit der Pole und Nullen eines Filters auf die Koeffizientenquantisierung zu untersuchen, betrachten wir ein Polynom, $$ D (z) $$, mit $ N Wurzeln:

$$ D (z) = 1 + \ Summe_ {k = 0} ^ {N} a_ {k} z ^ {- k} $$

Gleichung 1

Gleichung 1 kann die Systemfunktion eines FIR-Filters (Finite Impulse Response) oder entweder des Zählers oder des Nenners eines IIR-Filters darstellen. Die Analyse der Empfindlichkeit von Wurzeln von $$ D (z) $$ auf die Koeffizientenquantisierung ermöglicht uns einen besseren Einblick darüber, wie sich die Wurzeln und Pole eines digitalen Filters unter Bedingungen mit endlicher Genauigkeit bewegen.

Wir können $$ D (z) $$ in Bezug auf seine Faktoren schreiben als:

$$ D (z) = 1 + \ Summe_ {k = 0} ^ {N} a_ {k} z ^ {- k} = \ prod_ {k = 1} ^ {N} (1-p_ {k} z ^ {- 1}) $$

Wobei $$ p_k $$ die Wurzeln des Polynoms bezeichnet. Mit einer endlichen Anzahl von Bits zur Darstellung jedes Koeffizienten erwarten wir, dass $$ a_k $$ zu $$ a_k + \ Delta a_k $$ ändert, wobei $$ \ Delta a_k $$ der Fehler ist, der sich aus der Verwendung einer Darstellung mit endlicher Genauigkeit ergibt. Folglich erwarten wir, dass sich die Wurzeln des Polynoms von $$ p_k $$ zu $$ p_k + \ Delta p_k $$ ändern. Der Fehler im Wurzelverzeichnis, $$ \ Delta p_i $$, kann wie folgt gefunden werden:

$$ \ Delta p_ {i} = - \ Summe_ {k = 1} ^ {N} \ Frac {p_ {i} ^ {Nk}} {\ prod_ {l = 1, l \ neq i} ^ {N} (p_ {i} -p_ {l})} \ Delta a_ {k} $$

Gleichung 2

Den Beweis von Gleichung 2 finden Sie in Abschnitt 9.5 dieses Buches. Gleichung 2 hat zwei wichtige Auswirkungen, die als nächstes diskutiert werden.

Vermeiden Sie Cluster von Polen und Nullen

Erstens ist der Fehler in der Wurzel $$ i $$ th, $$ Delta p_i $$, gleich dem Fehler in dem Koeffizienten $$ k $$ th, multipliziert mit dem folgenden Faktor:

$$ F_ {k} = \ frac {p_ {i} ^ {Nk}} {\ prod_ {l = 1, l \ neq i} ^ {N} (p_ {i} -p_ {l})} $$

Gleichung 3

Dieser Faktor kann sehr groß sein, wenn das Polynom andere Wurzeln in der Nähe des $$ i $ -ten Pols hat, dh $$ p_ {i} -p_ {l} $$ ist klein. Mit anderen Worten, wenn wir einen Cluster von Wurzeln haben, wird der Fehler in den Wurzelpositionen für ein gegebenes $$ \ Delta a_k $$ viel höher sein. Da ein Schmalbandfilter im Allgemeinen dicht geclusterte Wurzeln aufweist, erwarten wir, dass der Frequenzgang dieser Filter sehr empfindlich auf die Koeffizientenquantisierung reagiert.

Vermeiden Sie Filterbereiche höherer Ordnung

Wenn wir die Gleichung 2 als Gleichung 4 umschreiben, beobachten wir, dass jeder Koeffizient des Polynoms einen Fehler zur Position eines bestimmten Pols beiträgt:

$$ \ Delta p_ {i} = - \ Summe_ {k = 1} ^ {N} F_ {k} \ Delta a_ {k} $$

Gleichung 4

Dies bedeutet, dass mit steigender Anzahl der Wurzeln eines Polynoms die Empfindlichkeit für den Quantisierungsfehler zunimmt. Dies liegt an der Tatsache, dass jede Wurzel von $$ D (z) $$ in Gleichung 1 von dem Wert aller Koeffizienten $$ a_ {k} $$ abhängt. Für ein Polynom des Grades $$ N $$ gibt es $ N -Konzentrationen, die quantisiert werden müssen. Und natürlich trägt jeder dieser quantisierten Koeffizienten zu dem Gesamtfehler einen bestimmten Fehlerbetrag bei.

Zusammenfassend sollten wir Cluster von Polen und Nullen vermeiden und Filterabschnitte niedriger Ordnung verwenden. Diese zwei Ziele können erreicht werden, indem einpolige Abschnitte verwendet werden, um ein Filter höherer Ordnung zu implementieren. Ein Filter weist jedoch im Allgemeinen komplexe Pole und Nullen auf und die Verwendung von einpoligen Abschnitten erfordert eine komplexe Arithmetik, die die Rechenkomplexität erhöht. Die nächstbeste Alternative ist die Verwendung von Sektionen zweiter Ordnung. In diesem Fall können wir komplex-konjugierte Wurzeln paaren und die komplexe Arithmetik vermeiden. Da das Auffinden der Kaskadenform eines Filters hoher Ordnung eine langwierige Mathematik erfordert, können wir die MATLAB-Funktion tf2sos, die für die Übertragungsfunktion zum Abschnitt zweiter Ordnung steht, verwenden, um die Kaskadenform einer gegebenen Übertragungsfunktion zu erhalten.

Beispiel 2

Wir werden die Funktion tf2sos verwenden, um die Übertragungsfunktion von Beispiel 1 in die Kaskadenform umzuwandeln. Dann quantisieren wir die Koeffizienten dieser Abschnitte zweiter Ordnung und vergleichen die Frequenzantwort der erhaltenen Struktur mit der des nicht quantisierten Systems.

Die folgenden Codezeilen definieren die Übertragungsfunktion von Beispiel 1 und konvertieren diese in Abschnitte zweiter Ordnung:

N = (0, 012218357882143 -0, 009700754662078 0, 024350450826845 0, 002532504848041 0, 002532504848041 0, 024350450826845 -0, 009700754662078 0, 012218357882143); % Diese Zeile definiert den Zähler von H (z)

D = (1, 000000000000000 -4, 288900601525731 9, 216957436091192 -12, 19535056140669510, 633166152311450 -6, 062798190498850 2, 098067018562069 -0, 342340135743531); % Dies definiert den Nenner von H (z)

(sos, G) = tf2sos (N, D)% wandelt die durch N und D definierte Übertragungsfunktion in eine Kaskade von Abschnitten zweiter Ordnung um

Das Ergebnis wird sein:

sos =

1.00000000001.00000000000.00000000001.0000000000-0, 67908300010.0000000000
1.00000000000.01027999611.00000000001.0000000000-1.28187590370.6209275764
1.0000000000-0, 81060304321.00000000001.0000000000-1.18049026670.8437961219
1.0000000000-0, 99362608711.00000000001.0000000000-1.14745143110, 9621803579

und:

$$ G = $$ 0.0122183579.

Jede Zeile von sos oben gibt die Übertragungsfunktion eines der Abschnitte zweiter Ordnung. Die ersten drei Zahlen jeder Reihe repräsentieren den Zähler des entsprechenden Abschnitts zweiter Ordnung und die zweiten drei Zahlen geben ihren Nenner an. Zum Beispiel ist der Abschnitt zweiter Ordnung, der von der zweiten Zeile erhalten wird,

$$ H_ {2} (z) = \ frac {1.0000000000 + 0.0102799961z ^ {- 1} + 1.0000000000z ^ {- 2}} {1.0000000000-1.2818759037z ^ {- 1} + 0.6209275764z ^ {- 2}} $$

Wir quantisieren die Koeffizienten unter Verwendung eines Bits für das Vorzeichen und neun Bits für die Größe der Koeffizienten. Wir müssen einen geeigneten Skalierungsfaktor wählen. Da die Koeffizienten der Abschnitte zweiter Ordnung kleiner als 2 sind, verwenden wir ein Bit für den ganzzahligen Teil und acht Bits für den Bruchteil, dh der Skalierungsfaktor wird $$ 2 ^ 8 $$ sein. Daher erhalten wir die Übertragungsfunktion des ersten Abschnitts als:

$$ H_ {1} (z) = \ frac {1.00000000 + 1.00000000z ^ {- 1}} {1.00000000-0.67968750z ^ {- 1}} $$

Die quantisierte Übertragungsfunktion der anderen Abschnitte zweiter Ordnung ist:

$$ H_ {2} (z) = \ frac {1.00000000+ 0.01171875z ^ {- 1} + 1.00000000z ^ {- 2}} {1.00000000-1.28125000z ^ {- 1} + 0.62109375z ^ {- 2}} $$

$$ H_ {3} (z) = \ frac {1.00000000-0.81250000z ^ {- 1} + 1.00000000z ^ {- 2}} {1.00000000-1.17968750z ^ {- 1} + 0.84375000z ^ {- 2}} $$

$$ H_ {4} (z) = \ frac {1.00000000-0.99218750z ^ {- 1} + 1.00000000z ^ {- 2}} {1.00000000-1.14843750z ^ {- 1} + 0.96093750z ^ {- 2}} $$

Fig. 5 vergleicht die Frequenzantwort von $$ H (z) = GH_ {1} (z) H_ {2} (z) H_ {3} (z) H_ {4} (z) $$ (was in Rot gezeigt ist ) mit dem des nicht quantisierten Filters (blau dargestellt). Wie Sie sehen können, sind die beiden Graphen kaum voneinander zu unterscheiden.

Abbildung 5. Der Frequenzgang der Kaskadenstruktur (in rot) gegenüber dem des nicht quantisierten Systems (in blau).

Der Leser kann leicht die MATLAB roots () - Funktion verwenden, um zu verifizieren, dass die Pole der quantisierten Kaskadenstruktur innerhalb des Einheitskreises liegen und das System stabil ist. Dieses Beispiel zeigt, dass die Implementierung eines Filters höherer Ordnung als eine Kaskade von Abschnitten zweiter Ordnung die Empfindlichkeit für die Koeffizientenquantisierung erheblich reduzieren kann.

Zusammenfassung

  • Wenn ein digitales Filter in der realen Welt implementiert wird, müssen wir eine endliche Anzahl von Bits verwenden, um jeden Koeffizienten von $$ H (z) $$ darzustellen.
  • Der Frequenzgang des quantisierten Filters könnte sich von dem des ursprünglichen Designs stark unterscheiden.
  • Die Implementierung eines Filters höherer Ordnung als eine Kaskade von Sektionen zweiter Ordnung kann die Empfindlichkeit gegenüber der Koeffizientenquantisierung signifikant reduzieren.

zusätzliche Informationen

  • FIR Filter Design by Windowing: Konzepte und das rechteckige Fenster
  • Unerwünschte Auswirkungen einer Fensterfunktion im FIR-Filterdesign
  • Das Bartlett gegen das rechteckige Fenster
  • Von Filterspezifikationen zu Fensterparametern im FIR-Filterdesign
  • Design von FIR-Filtern mit der Frequenz-Sampling-Methode
  • Strukturen zur Implementierung von Filtern mit endlicher Impulsantwort