Moduliert ein Audiosignal per Phasenmethode (Hartley-Modulator, siehe
SSB-Grundlagenartikel,
Abschnitt 2) auf USB und schreibt das Ergebnis als rohe komplexe IQ-Datei —
zum Testen der Demodulationskette (z. B.
ssb-usb-empfaenger), ohne dass dafür ein realer
Sender oder SDR-Empfang nötig wäre. Zwei Varianten, je nach Audioquelle:
ssb_usb_sender.grc — Live-MikrofonQT-GUI-Anwendung (Audio Source → Throttle → Hilbert → Rational Resampler → Multiply mit komplexem NCO-Träger → Multiply Const → File Sink), nimmt
laufend über das Mikrofon auf und schreibt nach ssb_usb_144300_test.iq.
Läuft, bis das Fenster geschlossen wird — zum Aufzeichnen eigener
Sprachdurchsagen als Testmaterial.
ssb_usb_sender_testsignal.grc — reproduzierbarer Batch-GeneratorKein GUI, läuft automatisch bis zum Dateiende durch (Wav File Source → Hilbert → Rational Resampler → Multiply mit NCO → Multiply Const → File Sink), liest test_audio.wav und schreibt nach
ssb_usb_144300_testsignal.iq. Deterministisch und reproduzierbar — die
richtige Wahl für automatisierte Tests oder um die Demodulationskette ohne
Mikrofon zu prüfen.
test_audio.wav — mitgeliefertes Testsignal: linearer Sinus-Chirp vonssb_usb_144300_test.iq / ssb_usb_144300_testsignal.iq — Ausgabedateiengr_complex-Samples, Format .cfile/.fc32: pro Sample 2× 32-bit| 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 |
volume |
0,8 | Amplitudenskalierung vor dem File Sink |
carrier_freq frei wählbar (Nyquist beachten: samp_rate/2 muss deutlich über
carrier_freq + 3000 Hz liegen — bei 500 kHz und 1,92 MS/s reichlich Reserve
bis knapp unter 960 kHz).
Wichtig bei generate_options im GRC: Für ein eigenständig lauffähiges
Programm (python3 datei.py) muss die Option „QT GUI" oder „No GUI"
gewählt sein — „Hier Block (QT GUI)" erzeugt nur eine Klassendefinition
ohne main()/if __name__ == "__main__" und lässt sich nicht direkt
ausführen (das Skript beendet sich dann sofort, ohne Fehlermeldung).
FFT der mit ssb_usb_sender_testsignal.grc erzeugten Datei zeigt die Energie
exakt im erwarteten Band, das Spiegelband (unteres Seitenband) ist um
114 dB unterdrückt:
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
Vollständiger Kreislauf Sender → Datei → Test-Empfänger
→ Audio verifiziert: Die Momentanfrequenz des demodulierten Signals folgt dem
eingespeisten Chirp-Verlauf über die gesamte Dauer (z. B. bei t=2,05s
gemessen 1710,9 Hz gegenüber 1682,4 Hz erwartet — die kleine,
gleichbleibende Differenz stammt von der endlichen FFT-Fensterauflösung der
Messung, nicht von der Modulationskette).
Der fertig vorbereitete ssb_usb_144300_file_test.grc
im ssb-usb-empfaenger-Ordner liest bereits standardmäßig
ssb_usb_144300_testsignal.iq und demoduliert es — einfach
ssb_usb_sender_testsignal.py einmal laufen lassen und danach den
Test-Empfänger öffnen.