Kivy-SDR-Widgets

Wiederverwendbare matplotlib-basierte Kivy-Widgets zur Anzeige von SDR-Signalen
— entstanden im Kivy-Frontpanel-Projekt für den
USB-Empfänger, hier als eigenständige, von jedem konkreten Flowgraph
unabhängige Bibliothek herausgelöst. Wird u. a. vom neuen
SignalAnalyzer-Projekt verwendet.

Beide Widgets kennen kein GNU Radio — sie werden ausschließlich über
Kivy-Properties gefüttert (Label, Werte, Abtastrate) und lassen sich dadurch
beliebig oft unabhängig instanziieren und mit jeder beliebigen Datenquelle
kombinieren.

Dateien

API

SpectrumWidget

Property Typ Bedeutung
label str Titel über dem Plot
values list[float] ein FFT-Frame in dB, beliebige Länge
samp_rate float Abtastrate, aus der die Frequenzachse berechnet wird
freq_divisor float 1 für eine Hz-Achse, 1000 für eine kHz-Achse
line_color list[float, float, float] RGB der Kurve, Werte 0..1

TimeWidget

Property Typ Bedeutung
label str Titel über dem Plot
values list[float] aufeinanderfolgende Samples, lineare Amplitude
samp_rate float Abtastrate, für die Sample-zu-Zeit-Umrechnung auf der x-Achse
line_color list[float, float, float] RGB der Kurve, Werte 0..1

Test/Doku-Beispiele

Jedes Widget hat ein eigenständiges, von GNU Radio unabhängiges Testskript,
das das Widget mit synthetischen Daten füttert — Zweck ist sowohl der
Funktionsnachweis in Isolation als auch eine lauffähige Dokumentation der
Widget-API (welche Properties setzt man, wie sieht das Ergebnis aus).

pip install kivy kivy_garden.matplotlib numpy

# interaktiv, mit Animation:
python3 test_spectrum_widget.py
python3 test_time_widget.py

# ein Frame rendern und als PNG exportieren (fuer Doku-Zwecke):
python3 test_spectrum_widget.py --shot spectrum_widget_doc.png
python3 test_time_widget.py --shot time_widget_doc.png
pip install kivy kivy_garden.matplotlib numpy

# interaktiv, mit Animation:
python3 test_spectrum_widget.py
python3 test_time_widget.py

# ein Frame rendern und als PNG exportieren (fuer Doku-Zwecke):
python3 test_spectrum_widget.py --shot spectrum_widget_doc.png
python3 test_time_widget.py --shot time_widget_doc.png
Verifiziert (Kivy 2.3.1, matplotlib 3.10.1, tatsächlich ausgeführt und per Widget.export_to_png() geprüft):

spectrum_widget_doc.pngSpectrumWidget mit einem synthetischen Peak über Rauschteppich:

SpectrumWidget-Testbild

time_widget_doc.pngTimeWidget mit einem synthetischen 1-kHz-Testton:

TimeWidget-Testbild

Bekannte Einschränkung: nur ein Widget pro Frame aktualisieren

kivy_garden.matplotlib hat einen Race-Condition-Bug: Zeichnen mehrere
FigureCanvasKivyAgg-Widgets (also mehrere SpectrumWidget/TimeWidget-
Instanzen) ihre Textur im selben Kivy-Frame neu, kann die GPU-Textur
eines Widgets die eines anderen überschreiben — nur das zuletzt gezeichnete
Widget bleibt sichtbar. Verifiziert und ausführlich dokumentiert im
Kivy-Frontpanel-Artikel, Abschnitt 3.5.

Bei mehreren gleichzeitig sichtbaren Widgets: immer nur eines pro
Kivy-Frame aktualisieren (Round-Robin), nie mehrere .values-Zuweisungen im
selben Aufruf.