Steam Tags

In GNU Radio fließen Daten normalerweise als ununterbrochener Strom von Samples. Ein Stream Tag ist ein Mechanismus, um Metadaten (in Form von Schlüssel-Wert-Paaren) direkt an ein spezifisches Sample innerhalb dieses Datenstroms zu heften.

Im Gegensatz zu “Message Passing” (das asynchron und ohne Zeitstempel erfolgt) sind Tags synchron: Wenn ein Tag an Sample n klebt, bleibt er an diesem Sample, auch wenn es durch Filter, Dezimatoren oder andere Blöcke wandert.

Ein Tag besteht technisch aus vier Komponenten:

  1. Offset: Die absolute Position im Datenstrom (Sample-Index).
  2. Key: Ein PMT-Symbol (z.B. pmt::mp("rx_freq")).
  3. Value: Ein PMT-Wert (kann fast alles sein: Zahlen, Strings, Vektoren).
  4. Source ID: Ein PMT-Symbol, das den Block identifiziert, der den Tag erstellt hat.

PMT (Polymorphic Types).

Ein PMT ist ein Container-Typ, der jeden beliebigen Datentyp aufnehmen kann. Er verhält sich ähnlich wie ein Variant-Typ in anderen Sprachen oder ein Object in Java/Python. Das ermöglicht es GNU Radio, Nachrichten und Tags zu versenden, ohne dass der Empfänger-Block vorher genau wissen muss, welche Struktur die Daten haben. Die meisten PMTs sind immutable. Um einen Wert zu ändern, muss daher technisch gesehen ein neues PMT-Objekt erzeugt werden. Das macht sie sicher für den Einsatz in Multi-Threaded-Umgebungen, da keine Locks benötigt werden, wenn ein Tag von mehreren Blöcken gleichzeitig gelesen wird. Ein in Python erstelltes PMT Element kann auch direkt in einem C++ Block gelesen werden. Das ermöglicht eine nahtlose Datenübergabe.

Python verfügt über ein PMT Modul, mit dessen Hilfe die PMT Variablen erzeugt werden können.

Bsp.:  pmt.from_long(42)Code-Sprache: CSS (css)

In Verbindung mit den Steam Tags können Tags sowohl asl Keys als auch als Values angelegt werden.

self.key_preamble = pmt.intern(“preamble_start”) wäre z.B. ein Key um den Start einer Preamble zu markieren.

Ein Tag wird mit der Methode self.add_item_tag in einen Datenstrom eingespeist.

self.add_item_tag (steam_id, offset, key, value)

Bsp.: self.add_item_tag(0, self.nitems_written(0) + index, self.key_preamble, pmt.PMT_T)

Code-Sprache: CSS (css)