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:
- Offset: Die absolute Position im Datenstrom (Sample-Index).
- Key: Ein PMT-Symbol (z.B.
pmt::mp("rx_freq")). - Value: Ein PMT-Wert (kann fast alles sein: Zahlen, Strings, Vektoren).
- 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)