QFSK Simulation in Octave

Mit Hilfe des open-source Mathematik-Tools GNU Octave, welches dem bekannten kommerziellen Matlab(tm) sehr ähnlich und damit weitgehend kompatibel ist, kann man sehr leicht in der programmeigenen Script-Sprache DSP Algorithmen gestalten und analysieren.

Im folgenden stelle ich eine kleine Script-Sammlung vor, die einen beliebigen Text (ASCII 8 Bit) in Dibits (Symbole bestehend aus 2 Bit mit dem Wertebereich 0 bis 3) und folgend in ein QFSK moduliertes, komplexes Basisbandsignal verwandelt, so wie es direkt auf einen Upconverter gegeben werden könnte.

QFSK steht für Quad Frequency Shift Keying, also Freqquenzumtastung mit vier Markerfrequenzen. Die Frequenzen in unserem Beispiel sind zwar äquidistant, haben immer den selben Abstand, ergeben aber im komplexen Basisband jeweils zwei nicht-orthogonale Frequenzen, was Oberwelleneffekte bei Filterung und Decodierung erleichtern soll. Im vorliegenden Beispielcode wird ein Hub von +/- 2kHz verwendet. Daraus ergeben sich unter und oberhalb der Mittenfrequenz die Träger bei +2kHz, bei +666Hz sowie -2kHz und -666Hz.

QFSK TRX Blockdiagramm

Der nicht-kohärente (heisst nicht phasensynchron arbeitende) Empfänger arbeitet nach dem Zero-IF Prinzip. (ZF liegt bei 0Hz). Solche Signale liefern moderne Downconverter-Bausteine standardmässig. Die beiden empfangenen Seitenbänder werden separiert und anschliessend einem Kreuzkorrelator zugeführt. Dieser vergleicht das eingehende Signal auf Ähnlichkeiten gegenüber der vier möglichen Trägersinuswellen. Der Decider (Entscheider) prüft dann, welcher Träger wohl am wahrscheinlichsten gesendet wurde.

TODO: In diesem Beispiel sind noch viele für den Alltag benötigte Teile nicht enthalten, oder eingebaute Teile möglicherweise fehlerhaft oder suboptimal. Was als nächstes folgen soll, ist die Signalerkennung mittels vorgestellter Präambel und sowie eine Symboltaktrückgewinnung.

Inbetriebnahme:

1. Benötigte Octave-Erweiterungen prüfen und ggf. nachinstallieren

Als erstes sollte man sicherstellen, dass Octave läuft und mit den benögtigen Zusatz-Paketen ausgestattet ist. Wir benötigen hauptsächlich das Paket „signal„. Wir sollten zuerst überprüfen, ob das Paket vorhanden ist, indem wir eine Funktion aus dem Paket Signal im Kommandozeilenfenster ausführen.

pkg load signal

gausswin(3)

Der letzte Befehl sollte uns drei Zahlen zurückgeben. Sollte dies der Falls ein, gehen wir weiter zu Schritt 2 – QFSK Scripts beschaffen.

VORSICHT: Einige aktuelle Pakete wie communications sind aktuell nicht auf allen Systemen fehlerfrei installierbar (z.B. Windows 64 Bit). Im Normalfall, müssen die Pakete signal und ltfat schon nach der Installation von Octave vorhanden sein.

Pakete lassen sich auf der Kommandozeile von Octave mit diesem Befehl installieren.

pkg install -forge signal

Möchten wir auch noch Spekrogramme erzeugen, benötigen wir noch zusätzlich das Paket ltfat.

pkg install -forge ltfat

Um die Funktionen eines Pakets wie ltfat nutzen zu können, muss es nach Programmstart geladen werden. Das Paket signal wird bereits in meinen Script-Dateien automatisch geladen.

2. QFSK Scripts beschaffen

Danach laden wir uns die QFSK Scripts herunter und entpacken diese in einen beliebigen Ordner. Wichtig ist, dass nun auch in Octave oben links der Pfad in das Arbeitsverzeichnis gewechselt wird, ansonsten kennt Octave unsere Scripts nicht.

LINK zu QFSK_simu.zip

3. Signal erzeugen

Nun möchten wir einen Text in ein Signal umrechnen. Dazu nehmen wir folgende Funktion:

bb = QFSK_TX(„Hallo“);

Wir berechnen also aus dem Text „Hallo“ das komplexe Basisband (I und Q Signal) und weisen dies unserer neuen Variable „bb“ zu. Beim ersten Start der Funktion kann es einige Zeit dauern, bis die Erweiterung „signal“ geladen ist. Später geht der Befehl QFSK_TX dann schneller, weil die Erweiterung nur einmal nach dem Programmstart von Octave geladen werden muss.

In der Funktion QFSK_TX sind auch Plot-Funktionen integriert, die den Verlauf des Signals durch die einzelnen Verarbeitungsstufen darstellt.

4. Spektrogramm betrachen (fakultativ, kann übersprungen werden)

Octave bietet auch die Möglichkeit, das Frequenzspektrum eines Signals im zeitlichen Verlauf darzustellen. Siehe dazu das Eingangsbild ganz oben. Dies kann mit der Funktion „sgram“ leicht getan werden.

sgram(bb, ‚lin“)

Stellt den Verlauf mit linearem Massstab dar, wohingegen

sgram(bb, ‚db‘)

den Verlauf im logarithmischen Massstab anzeigt.

5. Empfang und Demodulation des Basisbandsignals

Mit der Funktion QFSK_RX können wir das eben erzeugte Basisbandsignal wieder demodulieren und decodieren. Passen alle Parameter von Sender und Empfänger überein, sollte am Ende der Ausführung wieder der Text erscheinen, den wir anfangs bei QFSK_TX eingeben haben.

QFSK_RX(bb)

Auch die Empfängerfunktion öffnet wieder einige Plots. Das ist zu einem in Figure 2 die Filtercharkteristik des Kanalfilters,

und zum anderen wieder die einzelnen Signale im Verlauf durch den Empfänger

Am Ende der Funktionsausführung sollte im Kommandozeilenfenster von Octave dann

rx = Hallo

erscheinen.

Schlusswort

Es wurde ein Text in Dibits codiert, in ein QFSK-Signal mit 4 Datenfrequenzen in ein komplexes Basisbandsignal gewandelt und anschliessend wieder demoduliert und wieder zurück in Text decodiert. Die Arbeit ist noch nicht abgeschlossen. Aktuell integriere ich Funktionen zur Messung der Bitfehler. Erste Messungen ergaben ein Mindest-SNR von ca. 4,5dB für die in diesem Beispiel angewandten Datenrate von 2kBit/s.

(c) DG3YEV 2018. Dieses Werk steht unter der GNU GPL. Bitte um Benachrichtigung, sollten Verweise oder Auszüge daraus weiterverwendet werden. Der Text wurde nach Schweizer Rechtschreibregeln verfasst. Der Autor kann unter tobiw(at)suprafluid(dot)com erreicht werden.

 

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.