USB-Sender (Phasenmethode)
Ein GNU-Radio-Sender, der die im SSB-Grundlagenartikel hergeleitete Phasenmethode zur Erzeugung nutzt — als IQ-Testdatei-Generator für den USB-Empfänger, ganz ohne Antenne oder Hardware.
Dieses Projekt ist das Gegenstück zum USB-Sprachempfänger für 144,300 MHz: Statt ein empfangenes Signal zu demodulieren, moduliert es ein Audiosignal per Phasenmethode (Hartley-Modulator) auf USB und schreibt das Ergebnis als rohe IQ-Datei — genau das Format, das ein SDR-Empfänger sonst live vom Antennensignal liefern würde. Damit lässt sich die komplette Demodulationskette des Empfängers testen, ohne dass irgendwo tatsächlich gefunkt wird oder überhaupt eine Antenne angeschlossen sein muss.
SSB (USB) – Grundlagen
Abschnitt 2 leitet die Phasenmethode her, die dieser Sender direkt umsetzt.
USB-Sprachempfänger für 144,300 MHz
Das Gegenstück — demoduliert, was dieser Sender erzeugt hat.
1. Die Phasenmethode als Modulator
Der SSB-Grundlagenartikel leitet in Abschnitt 2 die Phasenmethode zur Erzeugung eines SSB-Signals her:
$$s_{\text{USB}}(t) = m(t)\cos(\omega_c t) - \hat{m}(t)\sin(\omega_c t)$$
Digital umgesetzt, entspricht das genau dem Realteil von $\big(m(t) + j\hat m(t)\big) \cdot e^{j\omega_c t}$ — und da eine IQ-Datei ohnehin komplexe Werte speichert, kann der Sender direkt das vollständige komplexe Ergebnis herausschreiben, ohne den Umweg über den Realteil zu gehen:
- Hilbert-Transformation erzeugt aus dem reellen Audiosignal $m(t)$ das analytische Signal $m(t) + j\hat m(t)$ — dieselbe Operation, die der Empfänger andernorts zur Demodulation nutzt, hier aber zur Erzeugung.
- Rational Resampler hebt die Abtastrate des analytischen Signals von
audio_rate(48.000 S/s) aufsamp_rate(1.920.000 S/s) an. - Multiplikation mit einem komplexen Oszillator $e^{j\omega_c t}$ verschiebt das bereits einseitige (analytische) Spektrum von 0 Hz auf die gewünschte Trägerfrequenz — das Ergebnis ist automatisch USB, ohne dass ein zweiter Zweig mit Sinus/Kosinus wie in der Lehrbuchformel nötig wäre.
Audioquelle ─► Hilbert (analytisches Signal) ─► Rational Resampler ─► Multiply mit komplexem Träger ─► × Pegel ─► File Sink (IQ)
Audioquelle ─► Hilbert (analytisches Signal) ─► Rational Resampler ─► Multiply mit komplexem Träger ─► × Pegel ─► File Sink (IQ)
Warum der Rational Resampler nötig ist
Das Audiosignal liegt nach der Hilbert-Transformation mit audio_rate = 48.000 S/s vor. Das Abtasttheorem erlaubt bei dieser Rate nur Frequenzinhalte bis zur Nyquist-Grenze von 24.000 Hz — der gewünschte Trägerversatz von 500.000 Hz liegt weit außerhalb und lässt sich bei dieser Abtastrate schlicht nicht darstellen, egal wie der komplexe Oszillator im nächsten Schritt eingestellt wird.
Der Rational Resampler löst das, indem er die Abtastrate anhebt (hier um den Faktor interp = 40, von 48.000 auf 1.920.000 S/s) — technisch durch Einfügen von Nullwerten zwischen den vorhandenen Samples und anschließende Tiefpassfilterung, die die dabei entstehenden Spiegelspektren wieder entfernt. Wichtig dabei: Der eigentliche Signalinhalt (das Sprachband bei 300–3000 Hz) bleibt an derselben absoluten Frequenz und unverändert — es wird lediglich derselbe Inhalt mit mehr Samples pro Sekunde dargestellt. Diese höhere Abtastrate schafft im Frequenzbereich erst den nötigen „Platz", damit der nachfolgende komplexe Oszillator den Träger anschließend tatsächlich bei 500.000 Hz platzieren kann, ohne die Nyquist-Grenze zu verletzen.
interp = 40 ist kein Zufallswert, sondern genau so gewählt, dass audio_rate * interp exakt die gewünschte samp_rate ergibt (48.000 × 40 = 1.920.000) — der Rational Resampler verlangt ein ganzzahliges Verhältnis zwischen Ein- und Ausgangsrate.2. Zwei Varianten
| Variante | Audioquelle | Betriebsart | Einsatzzweck |
|---|---|---|---|
ssb_usb_sender.grc |
Live-Mikrofon | QT-GUI, läuft bis zum Schließen des Fensters | eigene Sprachdurchsagen als Testmaterial aufnehmen |
ssb_usb_sender_testsignal.grc |
mitgeliefertes Testsignal (test_audio.wav) |
kein GUI, läuft automatisch bis zum Dateiende | reproduzierbare, automatisierte Tests |
Das mitgelieferte Testsignal ist ein linearer Sinus-Chirp von 300 bis 3000 Hz über 4 Sekunden — bewusst gewählt, weil er die komplette Sprachbandbreite durchläuft und jede Lücke oder Beschneidung im Passband der Empfängerkette sofort als hörbaren/sichtbaren Aussetzer im durchlaufenden Ton offenlegt, statt sie in einem statischen Einzelton zu verstecken.
python3 datei.py) muss unter „Generate Options" „QT GUI" oder „No GUI" gewählt sein. Die Option „Hier Block (QT GUI)" erzeugt dagegen nur eine wiederverwendbare Blockdefinition ohne main() und ohne if __name__ == "__main__" — das generierte Skript beendet sich beim direkten Aufruf sofort, ohne jede Fehlermeldung.3. Parameter
| Variable | Wert | Bedeutung |
|---|---|---|
audio_rate |
48.000 S/s | Abtastrate der Audioquelle |
interp |
40 | Interpolationsfaktor des Rational Resampler |
samp_rate |
1.920.000 S/s | Abtastrate der erzeugten IQ-Datei (audio_rate * interp) |
carrier_freq |
500.000 Hz | „Sendefrequenz" — Position des Trägers im IQ-Basisband, frei wählbar |
volume |
0,8 | Amplitudenskalierung vor dem File Sink |
carrier_freq lässt sich frei anpassen — die einzige Bedingung ist die Nyquist-Grenze: samp_rate/2 muss deutlich über carrier_freq + 3000 Hz liegen. Bei 500 kHz Trägerversatz und 1,92 MS/s bleibt reichlich Reserve bis knapp unter 960 kHz.
4. Geschlossener Testkreislauf
Eine Testvariante des Empfängers (ssb_usb_144300_file_test.grc) ersetzt den RTL-SDR Source-Block durch einen File Source-Block, der die hier erzeugte IQ-Datei liest — die restliche Demodulationskette (Frequency-Xlating-Filter, Power Squelch, AGC) bleibt identisch zum echten Empfänger. Damit lässt sich der komplette Weg von der Audioquelle bis zum demodulierten Ausgangssignal durchspielen.
Peak-Pegel bei +300..+503 kHz (USB, erwartet): 0.0 dB
Peak-Pegel bei -503..-300 kHz (Spiegel-/LSB-Bereich): -114.3 dB
Peak-Pegel bei -3..+3 kHz um DC: -178.9 dB
Peak-Pegel bei +300..+503 kHz (USB, erwartet): 0.0 dB
Peak-Pegel bei -503..-300 kHz (Spiegel-/LSB-Bereich): -114.3 dB
Peak-Pegel bei -3..+3 kHz um DC: -178.9 dB
Nach dem vollständigen Durchlauf durch die Test-Empfänger-Kette folgt die Momentanfrequenz des demodulierten Audiosignals dem eingespeisten Chirp-Verlauf über die gesamte Dauer — z. B. bei t=2,05 s gemessen 1710,9 Hz gegenüber 1682,4 Hz erwartet. Die kleine, gleichbleibende Differenz stammt von der Frequenzauflösung der Messung (STFT-Fenstergröße), nicht von der Modulations- oder Demodulationskette.
5. Grenzen
- Keine Rauschsimulation: Das erzeugte Signal ist sauber und rauschfrei — es testet die Demodulationslogik, nicht das Verhalten unter realistischen Empfangsbedingungen (Fading, Störträger, schwaches SNR).
- Feste Kopplung der Parameter:
samp_rateundcarrier_freqmüssen zwischen Sender und Test-Empfänger manuell synchron gehalten werden — es gibt keine automatische Übernahme der Sendereinstellungen. - Live-Variante ohne natürliches Ende: Die Mikrofon-Variante läuft, bis das Fenster geschlossen wird; es gibt keine automatische Aufnahmedauer-Begrenzung.
6. Download
.grc und generiertes .py) inklusive des Chirp-Testsignals test_audio.wav als ZIP —
ssb-usb-sender.zip herunterladen, entpacken, dann in GNU Radio Companion öffnen oder direkt ausführen:
# Live-Mikrofon (GUI, laeuft bis zum Schliessen des Fensters)
python3 ssb_usb_sender.py
# reproduzierbarer Batch-Generator mit dem mitgelieferten Chirp-Testsignal
python3 ssb_usb_sender_testsignal.py
# Live-Mikrofon (GUI, laeuft bis zum Schliessen des Fensters)
python3 ssb_usb_sender.py
# reproduzierbarer Batch-Generator mit dem mitgelieferten Chirp-Testsignal
python3 ssb_usb_sender_testsignal.py
Zum Demodulieren der erzeugten IQ-Datei siehe den USB-Sprachempfänger.