Kivy-Frontpanel — Frequenzanzeige + matplotlib-Spektrum/Zeitsignal

Nachbau von Frequenzregler/-anzeige und Spektrumdarstellung des
USB-Sprachempfängers in Kivy — siehe
homepage/src/projekte/ssb-usb-frontpanel/index.md für den Hintergrund
(native GRC-Widgets vs. Alternativen).

Trennt Signalverarbeitung und Darstellung bewusst:

Ausführen

pip install kivy kivy_garden.matplotlib
python3 main.py
pip install kivy kivy_garden.matplotlib
python3 main.py

Voraussetzung: ../ssb-usb-sender/ssb_usb_144300_testsignal.iq muss
existieren (mit ssb-usb-sender/ssb_usb_sender_testsignal.grc erzeugt).

Datenformat der Probe-Blöcke

Jeder Probe Signal Vector-Block liefert bei .level() immer einen
kompletten Vektor auf einmal
, nicht sequenziell:

Frequenzsteuerung

carrier_freq ist eine normale GRC-Variable, die als center_freq des
Freq Xlating FIR Filter verwendet wird. GRC generiert dafür automatisch
set_carrier_freq(), das intern freq_xlating_fir_filter_xxx_0.set_center_freq()
aufruft — ein Kivy-Button kann diese Methode direkt aufrufen, um den
Empfänger live umzustimmen (siehe main.py:_step_frequency).

Verifiziert

Tatsächlich ausgeführt (GNU Radio 3.10.12.0, Kivy 2.3.1, matplotlib 3.10.1)
und per Widget.export_to_png() geprüft — screenshot.png zeigt die
laufende App bei 500 kHz (Original-Spektrum mit deutlichem Träger,
demoduliertes Spektrum und sauberes Zeitsignal). Ein zweiter Test mit
+15 kHz Verstimmung zeigt, wie der Träger aus dem USB-Filter herausläuft:
die demodulierte Amplitude bricht um zwei Größenordnungen ein (0,4 → 0,008),
und das demodulierte Spektrum zeigt nur noch die Filterflanken statt eines
sauberen Tons.

Nächste Schritte

Weitere QT-Elemente aus dem Empfänger, die sich nach demselben Muster
nachbauen ließen: Lautstärke-/Squelch-Regler (Kivy Slider), LED-Indikator
für Squelch-Status, S-Meter (analog.probe_avg_mag_sqrd_f statt
probe_signal_vf, aggregierter Einzelwert statt eines Vektors).