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.
spectrum_widget.py — SpectrumWidget: eine matplotlib-Achse, Frequenztime_widget.py — TimeWidget: eine matplotlib-Achse, Sample-Index (x)test_spectrum_widget.py / test_time_widget.py — eigenständigeSpectrumWidget| 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 |
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
Widget.export_to_png() geprüft):
spectrum_widget_doc.png — SpectrumWidget mit einem synthetischen Peak über Rauschteppich:

time_widget_doc.png — TimeWidget mit einem synthetischen 1-kHz-Testton:

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.