Decimating & Interpolating FIR Filter

Die beiden generischen FIR-Filter-Blöcke in GRC 3.10 — Filterung kombiniert mit ganzzahliger Dezimierung bzw. Interpolation, Parameter und Ein-/Ausgänge.

GRC 3.10 bietet zwei generische FIR-Filter-Blöcke, die dieselben Tap-Vektoren wie Low Pass Filter Taps oder andere firdes-Blöcke entgegennehmen, aber im Gegensatz zu diesen keine eigene Grenzfrequenz oder Fensterfunktion kennen — sie wenden ausschließlich die übergebenen Taps an und ändern dabei zusätzlich die Abtastrate.

1. Beschreibung der Blöcke

Decimating FIR Filter (filter.fir_filter_*) filtert den Eingangsstrom mit den übergebenen Taps und gibt dabei nur jedes decim-te gefilterte Sample aus. Er ist die generische Variante des dezimierenden Anteils, den auch der Frequency Xlating FIR Filter intern nutzt — nur ohne die zusätzliche Frequenzverschiebung.

Decimating FIR Filter Block

Interpolating FIR Filter (filter.interp_fir_filter_*) macht das Gegenteil: Er fügt zwischen den Eingangssamples interp − 1 Nullen ein, bevor er filtert, und erhöht so die Abtastrate um den Faktor interp. Das Filter unterdrückt dabei die durch die Nullen erzeugten Spiegelspektren (Images) oberhalb der ursprünglichen Nyquist-Grenze.

Interpolating FIR Filter Block


2. Technischer Einsatz

  • Decimating FIR Filter: Einsatz, wenn Filterung und Ratenreduktion gebraucht werden, aber keine Frequenzverschiebung — z. B. zur reinen Kanalbandbreitenbegrenzung vor einer Weiterverarbeitung mit niedrigerer Rate.
  • Interpolating FIR Filter: Einsatz vor einer Signalquelle mit höherer erforderlicher Abtastrate, etwa vor einem DAC/Sender, der eine höhere Rate erwartet als im restlichen Flowgraph verarbeitet wird. Das Filter glättet dabei zugleich die durch die Interpolation eingefügten Nullen heraus.
  • Taps kommen von außen: Beide Blöcke entwerfen selbst keinen Filter — die Taps müssen über einen separaten Taps-Block (z. B. Low Pass Filter Taps) oder direkt als Python-Liste übergeben werden.

3. Parameter und Dimensionierung

Parameter Typ/Einheit Bedeutung Dimensionierungshinweis
decim (nur Decimating) int Dezimierungsfaktor Ausgangsrate = Eingangsrate / decim
interp (nur Interpolating) int Interpolationsfaktor Ausgangsrate = Eingangsrate × interp
taps Vektor (reell oder komplex, je nach Typ) Filterkoeffizienten von einem Taps-Block oder manuell übergeben; bestimmt Durchlassbereich und Übergangsbreite (siehe FIR-Filter)
samp_delay (Sample Delay) int, Standard 0 informiert GNU Radio über die vom Filter verursachte Verzögerung in der Regel auf Standard belassen; nur relevant, wenn nachgeschaltete Blöcke die Verzögerung für die Auswertung von Stream-Tags kennen müssen

4. Ein- und Ausgänge

Type-Variante Eingangstyp Ausgangstyp Taps-Art
Complex->Complex (Complex Taps) complex complex komplex
Complex->Complex (Real Taps) complex complex reell
Float->Complex (Complex Taps) float complex komplex
Float->Float (Real Taps) float float reell
Float->Short (Real Taps) float short reell
Short->Complex (Complex Taps) short complex komplex

Beide Blöcke besitzen je einen einzelnen Stream-Eingang und -Ausgang, keine Message-Ports.


5. Weitere wichtige Aspekte

Live-Anpassung der Taps: Über den Callback set_taps() lassen sich die Filterkoeffizienten zur Laufzeit austauschen, z. B. wenn ein vorgeschalteter Taps-Block seine Parameter über einen QT-GUI-Regler ändert. Decimation bzw. Interpolation selbst sind dagegen nur beim Bau des Flowgraphs festlegbar, nicht zur Laufzeit änderbar.

Reine Ratenänderung ohne Filterung: Für eine Dezimierung oder Interpolation ohne Filterwirkung (z. B. reines Sample-Auslassen) sind Keep 1 in N bzw. eine Rational Resampler-Konfiguration mit einfachen Taps die geeigneteren, einfacheren Blöcke.