SDR Audiorahmen

Zur Vermeidung doppelter Arbeit wird zunächst in den ersten Schritten ein Basisrahmen erstellt, der später weiterverwendet werden soll.

Bild 11 zeigt das Blockdiagramm des für die Audiokommunikation erstellten Programmrahmens.

Das VI kann als SDR Frame.vi unter [11] abgerufen werden.

Um Platz zu sparen, werden alle Funktionsblöcke (VIs) im Blockdiagramm nunmehr in ihrer kleinsten Variante abgebildet. Über das jeweilige Kontextmenü geschieht dies durch Abwahl von Als Symbol Darstellen.


 

Bild 11: SDR-Audiorahmen

Bild 11: SDR-Audiorahmen HIGHRES Version

Der obere Audiozug mit Parametrisierung der Ein- und Ausgabekanäle, Einlesen der Daten und Ausgabe der Daten entspricht dem im Abschnitt PC Audioverarbeitung dargestellten Prinzip.

Hinzugekommen ist eine initiale Ladung des Ausgabepuffers mit Nullen und eine Löschung der Puffer am Ende des Programms. Zur Ladung wird ein mit Nullen gefülltes Array in Pufferlänge ausgegeben.

Alle enthaltenden Audio-VIs finden sich in Labview analog des Beispiels Zweitongenerator.

Um eine sequenzielle Abarbeitung von Initialisierung, Datenverarbeitung und Beendigung zu erzwingen, ist eine neue Struktur mit Namen Flache Sequenz eingefügt worden. Sie findet sich unter FunktionenÆProgrammierungÆStrukturen. Wie bei einem Filmstreifen werden die Programmteile von links nach rechts abgearbeitet.

Die eigentliche Verarbeitung mit Lesen von Datenblöcken, noch zu erstellender Signalverarbeitung und Schreiben von Datenblöcken findet in einer While-Schleife statt. Diese wird solange ausgeführt, bis ein Fehler auftritt oder das Programm durch die Stopp-Taste angehalten wird.

Im Abschnitt PC-Audioverarbeitung wurde erläutert, dass für die Verarbeitung der Daten nur eine gewisse Zeit zur Verfügung steht, da ansonsten neue Daten am Lesepuffer anstehen. Wird dieser Zeitraum zu groß, bricht Labview mit einem Fehler 4823 ab. Die Daten des Eingangspuffers können nicht abgenommen werden, der Lese-Prozess wird abgebrochen, das Programm stoppt.

Abhilfe schafft eine Vergrößerung der Puffergröße, am besten jeweils um den Faktor 2 auf Kosten einer größeren Latenz. Ein aktueller PC sollte mit 8192 Bytes Puffergröße auskommen und ca. 150 Millisekunden Verarbeitungszeit ermöglichen. Bei einem Labtop musste der Wert auf 16384 vergrößert werden.

Die aufgrund der Puffergröße erwartete, zur Verfügung stehende Zeit, kann aus Erfahrung nur zu 50 % angesetzt werden, da das Labview-Audiointerface ebenfalls Rechenleistung benötigt und Windows selbst kein Echtzeitbetriebssystem ist, sondern dauernd zahlreiche Hintergrund-Prozesse ausführt.

Die Übergänge zwischen Audioschnittstelle und Signalverarbeitung bilden die am Rande der Schleife lokalisierten Signalverläufe der portionsweise eintreffenden I(n) & Q(n) Rohdaten und portionsweise abfließenden L(n) & R(n) Audiodaten.

Die I(n) & Q(n) Signalverläufe werden zunächst aus dem Summensignalverlauf abgespalten, um danach auf die eigentlichen Sequenzwerte reduziert zu werden. Das erstellte Y Signal ist jeweils ein eindimensionales Array mit der Größe des Eingangspuffers pro Kanal. Die verwendeten VIs sind bekannt oder können mittels Hilfefunktion leicht erschlossen werden.

Auf der rechten Seite werden die später resultierenden Audiosequenzen entsprechend zusammengefasst.

Eine Anzeige des Audio-Signalverlaufs, wie im Abschnitt Zweitongenerator beschrieben, ergänzt das Programm. Eine umfangreiche Änderung der Anzeigeparameter ist über die Eigenschaften des VIs möglich. Insbesondere den Eigenschaften Autoskalierung Y Achse, logarithmische Darstellung und die manuelle Einstellung der Achsenwerte sollte Beachtung geschenkt werden.

Das Audiorahmen-VI kann leicht getestet werden, indem als Eingangskanal ein Mikrofon o. ä. gewählt wird. Ein Lautsprecher als Ausgangskanal sollte das Signal unverzerrt und, je nach gewählter Puffergröße, verzögert wiedergeben. Die Signale des Audiosignals sollten auf dem Grafen sichtbar sein.

Wenngleich die Signalverarbeitung mit Komplexen Zahlen hier nicht eingeführt wird, soll vereinfacht darauf zugegriffen werden.

Zunächst kann man sich eine Komplexe Zahl als Gruppe von zwei Reellen Zahlen vorstellen Z(n) = (I(n), Q(n)). Jedes I(n) wird mit dem entsprechenden Q(n) zu einer Komplexen Zahl Z(n) zusammengefasst. Der erste Teil wird auch als Realteil, der zweite als Imaginärteil bezeichnet. Die beiden Anteile dieser Zahl werden nicht untereinander vermischt oder verrechnet, sondern parallel weiterverarbeitet. Bei einer Multiplikation werden beispielsweise beide Anteile separat multipliziert.

Mathematiker mögen diesen Trivialansatz kurz verzeihen, aber genau so wird in Labview mit Komplexen Zahlen im Wesentlichen gerechnet.

Dies ermöglicht eine einfachere Programmierung mit Labview, da alle VIs polymorph (sich den Eingangsdaten anpassend) ausgelegt sind, und zumeist auch für Komplexe Zahlen vorgesehen sind. Bei einer Multiplikation von I(n) und Q(n) mit einem festen Faktor reicht daher ein Multiplizier VI für die Komplexe Zahl Z(n) aus.  

In Bild 11 findet sich diese ‚Zusammenfassung’ und ‚Trennung’ anhand der beiden VIs in der Mitte der While-Schleife. Die aktuell hier durchgezogene Verbindung transportiert also ein Array der Puffergröße mit Datenpaaren I(n) & Q (n) zu den beiden Ausgabekanälen L(n) und R(n). Diese Verbindung wird später aufgetrennt und alle Komponenten der Signalverarbeitung werden hier eingefügt.