Zweitongenerator mit der Soundkarte
Das folgende Beispiel des Zweitongenerators beschränkt sich auf den zweiten Teil des beschriebenen Signalzugs, auf die Erstellung einer definierten Zahl von Abtastwerten und deren Ausgabe. Die Abtastwerte stellen dabei die Zahlenwerte einer oder zweier überlagerter Sinuskurven dar.
Die Bilder 5 und 6 zeigen das Frontpanel und das Blockdiagramm des zu erstellenden Programms.
Der nachfolgende Text beschreibt im Detail wo die Komponenten in Labview zu finden sind, welche Funktion sie haben und wie das Zusammenspiel ist.
Bild 5 Zweitongenerator Frontpanel
Bild 6 Zweitongenerator Blockdiagramm
Die graue Umrandung im Blockdiagramm stellt eine While-Schleife dar und findet sich unter ProgrammierungÆStrukturen der Funktionspalette. Beim Start eines Programms werden Daten an der linken Seite in die Schleife aufgenommen, dann wird die Schleife und deren Funktionen so lange durchlaufen bis die rote Stop-Taste betätigt wird, danach werden Daten an der rechten Seite zur Verfügung gestellt. Die Ein- und Ausgänge sind bei solchen Elementen durch einen Knoten zu erstellen (Maus-Klick während des Verdrahtens).
Der Zugang zur Soundkarte findet sich unter ProgrammierungÆAudio & GrafikÆAudioÆAusgabe. Benötigt werden hier die Funktionen Audioausgabe Konfigurieren, Audioausgabe Schreiben, Audioausgabe-Lautstärke Einstellen und Audioausgabe Löschen.
Die Audioausgabefunktionen haben im wesentlichen Ein- und Ausgänge für eine Prozess-ID des Betriebssystems (Task-ID) und einen Fehler. Die Verbindung der Prozess-ID stellt sicher, dass sich alle Funktionen mit den gleichen Audiodaten beschäftigen. Mehre Prozesse parallel wären möglich.
Die Weiterleitung des Fehlers ist eine Methode zur Synchronisation des Programmablaufs. Erst wenn der Ausgabekanal erfolgreich konfiguriert wurde, kann in den Puffer geschrieben werden. Wenn dies erfolgreich war, kann sodann die Lautstärke geregelt werden.
Da der Ausgabekanal außerhalb der While-Schleife konfiguriert wird, ist eine Änderung während des Programmablaufs nicht mehr möglich und auch nicht erwünscht. Ebenso wird der Ausgabepuffer erst nach Beendigung der While-Schleife gelöscht. Um das Ganze einigermaßen übersichtlich zu halten, wurde hier bewusst auf eine weitere Auswertung von Fehlern etc. verzichtet.
Audioausgabe Konfigurieren benötigt einige Eingaben. Diese sind im Wesentlichen im vorherigen Theorieabschnitt erläutert worden. Geräte-ID beziffert den zu wählenden Ausgabekanal. Leider ist kein Klartext ersichtlich. ID 0 ist immer der in Windows unter EinstellungÆSystemeinstellungenÆSound und AudioÆAudio eingestellte Kanal. Ansonsten hilft ausprobieren.
Samplemodus Kontinuierlich überlässt Labview die gesamte Komplexität des zeitlichen Zusammenspiels der Ausgabe. Immer wenn genug Daten an der Funktion Audioausgabe-Schreiben anliegen, wird zeitrichtig in den Puffer geschrieben. Falls nicht, wird das Programm hier auf weitere Daten warten. Dies ist ein Resultat des in Labview konsequent umgesetzten Datenflussprinzips. Demnach müssen lediglich schnell genug entsprechend viele Ausgabedaten zur Verfügung gestellt werden. Den Rest erledigt Labview.
Mit den gewählten Einstellungen werden 96000 Abtastwerte pro Sekunde für 2 Kanäle benötigt.
Zur besseren Übersichtlichkeit wurden die Einzeleingaben zur Audio Konfiguration zu einem Cluster zusammengefasst. Dies entspricht der Bündelung von Kabeln zu einem Kabelstrang. Unter ProgrammierungÆCluster Klasse Variant finden sich die Funktionen Aufschlüsseln und Bündeln. Hier verwendet man zweckmäßigerweise Aufschlüsseln und zieht die Funktion auf 3 Ausgänge auf. Nachdem diese mit den Eingängen der Audiofunktion verbunden wurden, wählt man Eingabeelement Erstellen an der Cluster Funktion und erhält für Blockdiagramm und Frontpanel ein gebündeltes Eingabeelement.
Neben der trivialen Lautstärkeregelung sind die restlichen Funktionen in der While-Schleife für die Erstellung der überlagerten Sinussignale und deren grafischen Anzeige zuständig.
Labview bietet ein konfortables VI zur Erzeugung eines Sinussignals. Das VI Sinussignal findet sich unter ProgrammierungÆSignalverlaufÆAnaloger SignalverlaufÆSignalsverlaufserzeugung.
Bei dieser Gelegenheit bietet es sich an, etwas in der Funktionsvielfalt von Labview zu stöbern und über deren Vielfalt zu staunen.
Das VI Sinussignal hat als Ausgang einen Signalverlauf. Dieses Labview Datenformat stellt eine definierte Anzahl Daten als Array (Datenformat, entspricht einer Tabelle) mit einem beschriebenen, zeitlichen Abstand zur Verfügung. Abtastrate und Abtastwerteanzahl 4800 erzeugt ein Gesamt-Array mit 4800 Werten.
Es wurden 4800 und nicht 48000 Samples gewählt um die Latenz bei Änderungen gering zu halten. So werden Änderungen mit einer zehntel-Sekunde berücksichtigt, ansonsten würden sie sich erst nach einer Sekunde bemerkbar machen.
Wie viele Sinusschwingungen in diesen 4800 Abtastwerten abgelegt werden, wird über die Frequenzeingabe bestimmt. Bei Frequenz = 1 Hz ist es eine Schwingung, bei 100 Hz sind es 100 Schwingungen. Da aber bei der Audioausgabe 48000 Abtastwerte pro Sekunde definiert wurde, muss das VI 10-mal ein 4800 Abtastwerte-Array liefern, bevor ein Puffer geschrieben wird. Das wären dann 10-mal mehr Schwingungen als die Frequenzeingabe. Aus diesem Grunde wird die Frequenzeingabe durch 10 geteilt.
Wem die Umrechnung zu kompliziert ist, der verzichte auf diese Division und stelle die Abtastrate und Anzahl Abtastwerte ebenfalls auf 48000 ein.
Die weiteren Eingaben zu den Sinussignal VIs sind selbsterklärend. Es wurde wiederum die beschriebene Cluster-Funktion verwendet.
Die Ausgänge der Sinussignal VIs führen auf eine neue Programmstruktur. Die sogenannte Case-Struktur findet sich unter ProgrammierungÆStrukturen.
Da die Signale wahlweise überlagert, oder getrennt auf den linken und rechten Ausgang der Soundkarte geleitet werden sollen, müssen verschiedene Fälle selektierbar sein. Mit Nullschaltung eines Signals sind es insgesamt 4 Fälle.
Eine Case-Struktur sind hintereinander gelegte, wählbare Abläufe. Auch hier werden Daten links zugeführt und rechts aus der Struktur entnommen. Die einzelnen Fälle sind am oberen Rand der Struktur wählbar. Bei der Erstellung können über das Kontext-Menü zusätzliche Fälle eingeführt werden, ein Standard-Fall selektiert werden. Selektiert wird über ein Bedienelement, verbunden mit dem blauen Fragezeichen. Nachdem alle Fälle definiert sind, kann mittels Erstellen Bedienelement dieses Bedienelement samt passenden Inhalten erstellt werden. Die Fälle sind dabei im Kontextmenü zu definieren.
Innerhalb der Fälle findet sich eine einfache Arithmetik zur Erzeugung eines pegelkonstanten Signals. Rechenfunktionen finden sich unter ProgrammierungÆNummerisch.
Die folgende Funktion Arrays Erstellen aus ProgrammierungÆArray erstellt aus den, vereinfacht, 2 mal 4800 Elemente Arrays der einzelnen Signalverläufe einen Signalverlauf mit einem 2-dimensionalen Array. Das Audioausgabe VI teilt dieses Array korrekt auf den linken und rechten Kanal auf. Für Verschachtelung und ähnliches ist Labview zuständig.
Um sich den Kurvenverlauf des erzeugten Signals besser vorstellen zu können, wurde eine grafische Ausgabe integriert.
Aus den Signalverläufen müssen zunächst die Signalwerte selbst isoliert werden, um ein passendes, gebündeltes Signal für das VI Signalverlaufsgraph zu erzeugen. Mit einem Einzelsignal ginge es auch ohne Extrahierung.
Die passende Funktion Signalverlaufskomponenten Lesen findet sich unter ProgrammierungÆSignalverlauf. Lediglich die Signalwerte (Y) werden wiederum zu einem Array zusammengefasst und dann auf den Eingang des Signalverlaufsgraphen gegeben. Das VI Signalverlauf findet sich ausnahmsweise über das Frontpanel unter ElementeÆExpressÆGraph Anzeigeelemente.
Graph-VIs sind so mannigfaltig konfigurierbar, dass hier nur auf einen Aspekt eingegangen werden soll.
Ähnlich einer objektorientierten Sprache sind diesen VIs Eigenschaften zugeordnet, die während des Programmablaufs gelesen oder geändert werden können. Ein Rechtsklick auf das Symbol im Blockdiagramm eröffnet unter ErstellenÆEigenschaftsknoten eine enorme Anzahl an Eigenschaften. Hier ist X-AchseÆBereichÆMaximum interessant. Je nach gewählter Frequenz soll der Anzeigebereich manuell wählbar sein, um eine gute Sichtbarkeit der Signalform zu ermöglichen. Nach der Erstellung des Knotens findet sich ein neues Element im Blockdiagramm.
Da mit ErstellenÆBedienelement eine Einstellmöglichkeit geschaffen wurde, kann nun während des Programmablaufs der Anzeigebereich nach Bedarf geändert werden. Dabei handelt es sich lediglich um eine Visualisierung ohne Anspruch auf eine messtechnisch richtige Darstellung.
Das Zweitongenerator VI steht als Zweitongenerator.vi unter [11] zur Verfügung.
Zugegebenerweise ist der Zweitongenerator nicht trivial, behandelt aber viele Elemente, die für ein SDR benötigt werden. Weiterhin kann der Generator als Grundlage für andere Experimente dienen, z. B. für die Visualisierung einer Multiplikativen-Mischung.
Weitergehende Funktionen/VIs wie eine Spektralanalyse finden sich selbstverständlich ebenfalls in Labview und können zum Experimentieren anregen.