SpectrumWidget (Kivy)

Eigenständiges matplotlib-Kivy-Widget zur Anzeige eines Spektrums — kein GRC-Block, sondern reiner Python/Kivy-Code aus dem Kivy-Frontpanel-Projekt.

Kein GNU-Radio-Block. 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.

Einschränkung bei mehreren gleichzeitig sichtbaren Instanzen: 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.
Verifiziert (Kivy 2.3.1, matplotlib 3.10.1, tatsächlich ausgeführt und per Widget.export_to_png() geprüft) — mit synthetischem Testsignal (Peak über Rauschteppich) aus dem eigenständigen Testskript test_spectrum_widget.py:

SpectrumWidget mit synthetischem Testsignal

Download

Download: Beide Widgets (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