TimeWidget (Kivy)

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

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

TimeWidget zeichnet ein Zeitsignal (Sample-Index vs. lineare Amplitude) als matplotlib-Achse in einem Kivy-Widget — das Schwesterwidget von SpectrumWidget, nach demselben Muster gebaut. Es kennt kein GNU Radio — jede Datenquelle, die einen Vektor aufeinanderfolgender Samples liefert, kann es füttern.

Eigenschaften (Kivy-Properties statt Parameter)

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

Die x-Achsenbeschriftung wird bei jedem Neuzeichnen automatisch aus len(values) und samp_rate berechnet und zeigt sowohl den Sample-Index als auch die entsprechende Zeitspanne in Millisekunden an (z. B. „Sample n (0 … 1023, entspricht 0 … 21.3 ms bei 48000 Hz)").

Verwendung

from time_widget import TimeWidget

widget = TimeWidget(
    label="Demoduliertes Zeitsignal (nach Demodulation)",
    samp_rate=48_000,
    line_color=[1.0, 0.72, 0.31],
)
widget.values = list(some_audio_samples)  # loest Neuzeichnen aus
from time_widget import TimeWidget

widget = TimeWidget(
    label="Demoduliertes Zeitsignal (nach Demodulation)",
    samp_rate=48_000,
    line_color=[1.0, 0.72, 0.31],
)
widget.values = list(some_audio_samples)  # loest Neuzeichnen aus
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 1-kHz-Testton aus dem eigenständigen Testskript test_time_widget.py:

TimeWidget mit synthetischem Testton

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_time_widget.py
pip install kivy kivy_garden.matplotlib numpy
python3 test_time_widget.py