Freq Xlating FIR Filter
Synthetisches Drei-Töne-Testsignal durch den Block geschickt, Spektrum vor/nach verglichen und alle Kennzahlen (Taps, Gruppenlaufzeit, Dezimierungsrate) ausgegeben.
Freq Xlating FIR Filter kombiniert Frequenzverschiebung, Tiefpassfilterung und Dezimierung in einem einzigen, optimierten Block — genau der Block, der im USB-Sprachempfänger die Empfangsfrequenz festlegt und das gewünschte Seitenband herausfiltert. Dieser Test prüft isoliert, mit einem synthetischen Signal statt echtem Empfang, ob der Block tatsächlich das tut, was seine Parameter versprechen.
Testaufbau
Ein IQ-Signal mit 1 MHz Abtastrate und drei Tönen:
| Ton | Frequenz | Rolle |
|---|---|---|
| Zielton | +100 kHz | soll nach der Verschiebung bei 0 Hz landen |
| Störer 1 | −300 kHz | soll unterdrückt werden |
| Störer 2 | +350 kHz | soll unterdrückt werden |
plus komplexes weißes Rauschen. Block-Konfiguration: center_freq=100 kHz (verschiebt den Zielton exakt auf 0 Hz), decim=10 (Ausgangsrate 100 kHz), Tiefpass mit 40 kHz Grenzfrequenz, 10 kHz Übergangsbreite, Hamming-Fenster.
=== Block-Parameter (Freq Xlating FIR Filter, Variante ccf) ===
center_freq (Frequenzverschiebung): +100.0 kHz
decim (Dezimierungsfaktor): 10
Eingangs-Abtastrate: 1.000 MHz
Ausgangs-Abtastrate: 100.0 kHz
Tiefpass-Grenzfrequenz: 40.0 kHz
Uebergangsbreite: 10.0 kHz
Fenster: Hamming
Anzahl Filter-Taps: 241
Gruppenlaufzeit (Taps // 2): 120 Samples bei 1.000 MHz = 120.00 us
relative_rate() (GNU-Radio-intern): 0.1000 (erwartet 1/10 = 0.1000)
Eingangs-Samples: 200000, Ausgangs-Samples: 20000 (erwartet ca. 20000)
=== Messung: Unterdrueckung der Stoerer ===
Zielton vorher (bei 100 kHz): 62.8 dB
Zielton nachher (bei 0 Hz): 63.3 dB
Stoerer 1 vorher (bei -300 kHz): 61.3 dB
(Stoerer liegen nach der Dezimierung ausserhalb des Ausgangsbands - vom Filter samt Alias-Schutz entfernt, siehe Abbildung.)
=== Block-Parameter (Freq Xlating FIR Filter, Variante ccf) ===
center_freq (Frequenzverschiebung): +100.0 kHz
decim (Dezimierungsfaktor): 10
Eingangs-Abtastrate: 1.000 MHz
Ausgangs-Abtastrate: 100.0 kHz
Tiefpass-Grenzfrequenz: 40.0 kHz
Uebergangsbreite: 10.0 kHz
Fenster: Hamming
Anzahl Filter-Taps: 241
Gruppenlaufzeit (Taps // 2): 120 Samples bei 1.000 MHz = 120.00 us
relative_rate() (GNU-Radio-intern): 0.1000 (erwartet 1/10 = 0.1000)
Eingangs-Samples: 200000, Ausgangs-Samples: 20000 (erwartet ca. 20000)
=== Messung: Unterdrueckung der Stoerer ===
Zielton vorher (bei 100 kHz): 62.8 dB
Zielton nachher (bei 0 Hz): 63.3 dB
Stoerer 1 vorher (bei -300 kHz): 61.3 dB
(Stoerer liegen nach der Dezimierung ausserhalb des Ausgangsbands - vom Filter samt Alias-Schutz entfernt, siehe Abbildung.)

Einordnung des Ergebnisses
Oben das Eingangsspektrum (drei deutliche Peaks über dem Rauschteppich), unten das Ausgangsspektrum: Der Zielton sitzt exakt bei 0 Hz, beide Störer sind komplett verschwunden — sie lägen nach der Verschiebung bei −400 kHz bzw. +250 kHz, weit außerhalb sowohl des Filterdurchlassbereichs als auch der Nyquist-Grenze der dezimierten 100-kHz-Ausgangsrate (±50 kHz). Der Block erledigt Tuning, Anti-Alias-Filterung vor der Dezimierung und die Dezimierung selbst in einem Durchgang.
Was die einzelnen Parameter bedeuten
| Parameter | Bedeutung |
|---|---|
center_freq |
Frequenz, die auf 0 Hz gemischt wird — bestimmt die Empfangs-/Sendefrequenz |
decim |
Dezimierungsfaktor; Ausgangsrate = Eingangsrate / decim |
taps |
Tiefpass-Filterkoeffizienten (hier via firdes.low_pass erzeugt) — legen Durchlassbereich, Übergangsbreite und Anzahl der Taps fest |
relative_rate() |
GNU-Radio-interne Kenngröße, die das Verhältnis Ausgangs- zu Eingangsrate bestätigt (hier 0,1 = 1/decim) |
| Gruppenlaufzeit | len(taps) // 2 Samples — Verzögerung, die der Filter dem Signal aufprägt (symmetrisches FIR-Filter) |
Download
pip install numpy matplotlib
python3 test_freq_xlating_fir_filter.py
pip install numpy matplotlib
python3 test_freq_xlating_fir_filter.py