SpectrumWidget (Kivy)
Eigenständiges matplotlib-Kivy-Widget zur Anzeige eines Spektrums — kein GRC-Block, sondern reiner Python/Kivy-Code aus dem Kivy-Frontpanel-Projekt.
SpectrumWidget lässt sich nicht in den GNU Radio Companion ziehen und hat keine .block.yml-Definition — es ist eine gewöhnliche Kivy-`BoxLayout`-Unterklasse aus ssb-usb-frontpanel-kivy, ausgelagert in das eigenständige kivy-sdr-widgets-Projekt. Dokumentiert wird es hier trotzdem im Block-Verzeichnis, weil es im selben Sinn wie ein GRC-Block eine wiederverwendbare, über klar definierte Ein-/Ausgänge (hier: Kivy-Properties statt Signalports) ansprechbare Einheit ist.SpectrumWidget zeichnet ein Spektrum (Frequenz vs. Pegel) als matplotlib-Achse in einem Kivy-Widget. Es kennt kein GNU Radio — jede Datenquelle, die einen Vektor von dB-Werten liefert, kann es füttern, ob aus einem Probe Signal Vector-Block, einer Datei oder einem synthetischen Testsignal.
Eigenschaften (Kivy-Properties statt Parameter)
| 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 |
Jede Zuweisung an values löst automatisch ein Neuzeichnen aus (bind(values=self._redraw, ...)) — es gibt keine explizite „Update"-Methode, die aufgerufen werden müsste.
Verwendung
from spectrum_widget import SpectrumWidget
widget = SpectrumWidget(
label="Original-Spektrum (IQ, vor Demodulation)",
samp_rate=1_920_000,
freq_divisor=1000, # Achse in kHz
line_color=[0.31, 0.72, 1.0],
)
widget.values = list(some_fft_frame) # loest Neuzeichnen aus
from spectrum_widget import SpectrumWidget
widget = SpectrumWidget(
label="Original-Spektrum (IQ, vor Demodulation)",
samp_rate=1_920_000,
freq_divisor=1000, # Achse in kHz
line_color=[0.31, 0.72, 1.0],
)
widget.values = list(some_fft_frame) # loest Neuzeichnen aus
Mehrere Instanzen lassen sich unabhängig nebeneinander verwenden — im Kivy-Frontpanel-Projekt z. B. einmal für das Original- und einmal für das demodulierte Spektrum, mit jeweils eigenem Label, eigener Abtastrate und eigener Farbe.
kivy_garden.matplotlib hat einen Race-Condition-Bug — zeichnen mehrere SpectrumWidget/TimeWidget-Instanzen ihre Textur im selben Kivy-Frame neu, kann sich das gegenseitig überschreiben. Details und Workaround (Round-Robin-Update) im Kivy-Frontpanel-Artikel, Abschnitt 3.5.Widget.export_to_png() geprüft) — mit synthetischem Testsignal (Peak über Rauschteppich) aus dem eigenständigen Testskript test_spectrum_widget.py:

Download
SpectrumWidget und TimeWidget) inklusive Testskripte als ZIP —
kivy-sdr-widgets.zip herunterladen, entpacken, dann:
pip install kivy kivy_garden.matplotlib numpy
python3 test_spectrum_widget.py
pip install kivy kivy_garden.matplotlib numpy
python3 test_spectrum_widget.py