Im ersten Teil ging es um xara als Programm. Hier geht es um die unterste Schicht: wie aus einem Datenblock ein Audiosignal wird, das ins Mikrofon des Transceivers geht. Alle Zahlen stammen aus dem Quellcode von xara 0.1.3 (Crate xara-phy) oder sind aus dessen Tabellen berechnet.
Grundlagen: Abtastrate und Passband
xara rechnet intern mit 48 kHz. Die HF-Modi liegen um eine Mittenfrequenz von 1500 Hz im NF-Band. Bei 2300 Hz Bandbreite reicht das Signal also von etwa 350 bis 2650 Hz, bei 500 Hz von 1250 bis 1750 Hz.
Für fast alle pseudozufälligen Tabellen (Codebücher, Interleaver, Phasenverwürfelung, Whitening) verwendet xara einen Nachbau des Zufallsgenerators von Visual Basic: ein linearer Kongruenzgenerator mit 24 Bit Zustand, Multiplikator 0xFD43FD, Inkrement 0xC39EC3 und Startzustand 0x050000, inklusive der Eigenheiten von Randomize beim Setzen des Seeds. Beide Seiten müssen exakt dieselben Folgen erzeugen, sonst passt nichts zusammen. Im Code heißt der Generator deshalb VbRnd.
Zwei Arten von Aussendungen
VARA trennt klar zwischen Kontrollframes und Datenframes.
Kontrollframes sind kurz und funktionieren noch bei sehr schlechtem SNR (bis −15,5 dB). Sie tragen keine frei wählbaren Bits, sondern nur die Nummer eines Codeworts aus einem Codebuch mit 58 Einträgen. Damit werden Verbindungswünsche, Quittungen, Stufenwechsel und Sendeübergaben signalisiert.
Datenframes tragen die Nutzdaten. Ihr Format hängt von der aktuellen Geschwindigkeitsstufe ab.
Kontrollframes
Ein Kontrollframe ist eine Folge von Sinustönen. Jedes Symbol dauert 2048 Abtastwerte, also 42,7 ms, und die möglichen Töne liegen im Raster von 48000 / 2048 = 23,4 Hz. Es gibt drei Formate:
| Format | Symbole | Töne pro Symbol | Dauer Codewort | SNR-Schwelle |
|---|---|---|---|---|
| F0 | 32 | 1 | 1,32 s | −15,5 dB |
| F1 | 16 | 1 | 0,64 s | −7,5 dB |
| F2 | 8 | 2 | 0,30 s | −3,5 dB |
Vor dem Codewort steht ein Vorlauf (Lead-in) von 40 bis 160 ms aus zufälligen Tönen zwischen 1170 und 1970 Hz, damit der Empfänger einrasten kann. Welches Format eine Station für ihre Antworten nutzt, handeln beide Seiten während der Verbindung aus: Bei gutem Kanal reicht das kurze F2, bei schlechtem wird auf F0 zurückgeschaltet. Bei guten Bedingungen spart das Sendezeit, denn jede Quittung ist ein Kontrollframe.
Codebücher
Die Codewörter werden nicht übertragen, sondern auf beiden Seiten berechnet. Für jedes Symbol zieht der Generator eine Basisfrequenz aus einem Kamm mit 14 Bins Abstand (rund 328 Hz) und addiert einen zufälligen Versatz. So entsteht eine Tonfolge, die über die ganze Bandbreite springt.
Für die Verbindungswünsche (Connect-Request) fließt ein Hash des Zielrufzeichens ein. Der Hash besteht aus der CRC-16 des ganzen Rufzeichens und dem oberen Byte der CRC-16 über dessen letzte drei Zeichen. Eine Station hört also nur auf die Tonfolge, die zu ihrem eigenen Rufzeichen gehört. Bis zu fünf Rufzeichen pro Station sind möglich (Befehl MYCALL mit mehreren Argumenten), deshalb gibt es pro Bandbreite fünf Connect-Request-Codes. Nach dem Verbindungsaufbau werden die Codes für BREAK und IDLE mit einem sitzungsabhängigen Wert neu berechnet.
Einige Codes aus hf/ctrl/code.rs:
| Code | Bedeutung |
|---|---|
| 1 | ACK, Stufe bleibt |
| 7, 5, 8, 9 | ACK, eine, zwei, drei oder vier Stufen höher |
| 6 | ACK, eine Stufe tiefer |
| 10, 11 | nur zweiter bzw. nur erster von zwei Frames angekommen |
| 2, 19 | NACK |
| 12, 13 | Bitte um Wiederholung der letzten Quittung (abwechselnd) |
| 14 | GO AHEAD, Sendeübergabe |
| 15-18, 22-25 | Antwort auf Connect bei 2300 bzw. 500 Hz, mit Startstufe 1 bis 4 |
| 26-30, 31-35, 36-40 | Connect-Request für 2300, 500 und 2750 Hz, je fünf Rufzeichen |
| 3, 46 | QRT, mit oder ohne CW-ID |
| 43 | Verbindung abgelehnt |
| 48 | CQ |
| 49 | BREAK, Wunsch nach dem Sendrecht |
| 50 | IDLE |
| 51-57 | Startstufe 1-7 für die Gegenrichtung |
| 45, 47, 58 | KISS-Rahmen (Broadcast ohne Verbindung) |
Der Tuning-Ton für automatische Antennenkoppler liegt übrigens auf Bin 64, also genau bei 1500 Hz.
Datenframes
Aufbau eines Frames
Ein Datenframe hat eine feste Länge, die von der Stufe abhängt (12 Byte auf Stufe 1, bis 3922 Byte auf der höchsten Stufe bei 2750 Hz). Er besteht aus:
+-----------+--------------------+-------------+-----------+--------+
| Nutzdaten | 0x14 Marker 00 ... | Folgestufe | Steuerbyte| CRC-16 |
| | (nur wenn nicht | (nur im | | 2 Byte |
| | voll) | letzten) | | |
+-----------+--------------------+-------------+-----------+--------+
Ist der Frame nicht voll, folgt den Daten ein Endezeichen 0x14, ein Marker-Byte und Auffüllnullen. Der Marker ist das obere Byte der CRC-16 des Anruferrufzeichens (0x00 und 0x14 werden durch 0x01 ersetzt). Damit kann der Empfänger ein echtes Endezeichen von einem zufälligen 0x14 in den Daten unterscheiden.
Das Steuerbyte enthält:
| Bits | Inhalt |
|---|---|
| 7-6 | gewünschtes Format für Kontrollframes in Gegenrichtung (F0/F1/F2) |
| 5 | Nutzdaten sind textkomprimiert |
| 4-2 | Füllstand der Sendewarteschlange (0-6) |
| 1 | letzter Frame dieses Durchgangs |
| 0 | Frame ist randvoll |
Der Füllstand sagt der Gegenstation, wie viele Frames noch warten. Sie schaltet nur hoch, wenn sich das lohnt: Bei einer kurzen Restmenge bringt eine schnellere Stufe nichts.
Im letzten Frame eines Durchgangs steht vor dem Steuerbyte noch die Stufe, die der Sender für die Gegenrichtung vorschlägt. Die Prüfsumme ist eine CRC-16/GENIBUS (Polynom 0x1021, Startwert 0xFFFF, Ergebnis invertiert, Prüfwert für “123456789” ist 0xD64E), gespeichert in Big Endian.
Der allererste Datenframe einer Verbindung ist der Header des Anrufers. Er enthält das Rufzeichen in 6 Byte gepackt (sieben Zeichen à 6 Bit plus 6 Bit SSID, wobei T, R, X und L als SSID 16 bis 19 kodiert sind), ein Flag-Byte mit “gültig”, “registriert” und der gewünschten Kompression sowie die angebotene Startstufe.
Fehlerschutz
Bevor ein Frame moduliert wird, durchläuft er diese Kette:
- Die Bytes werden MSB zuerst in Bits zerlegt und auf die Blocklänge k der Stufe aufgefüllt.
- Whitening: XOR mit einer festen Pseudozufallsfolge (Seed 292), damit lange Nullfolgen keine Spektrallinien erzeugen.
- Turbo-Code: zwei gleiche rekursiv-systematische Faltungscodierer mit drei Speicherzellen (8 Zustände). Der zweite Codierer bekommt die Bits in permutierter Reihenfolge. Am Ende werden beide Codierer mit je drei Tail-Bits in den Nullzustand gebracht.
- Punktierung: Je nach Stufe werden Paritätsbits weggelassen. Daraus ergeben sich die Coderaten 1/3, 1/2, 2/3, 3/4, 4/5 und 5/6.
- Kanal-Interleaver: eine Zufallspermutation über alle codierten Bits, damit ein Fading-Loch nicht viele benachbarte Bits trifft.
Turbo-Permutation und Kanal-Interleaver sind für jede Stufe eigene Tabellen, erzeugt mit dem VB-Generator und Seed 43. xara berechnet sie beim Start selbst.
Auf der Empfangsseite arbeitet ein Max-Log-MAP-Decoder mit bis zu 10 Iterationen und einem Skalierungsfaktor von 0,7 für die extrinsische Information. Stimmt die CRC nach mindestens zwei Iterationen, bricht er früh ab. Den Decoder gibt es in Gleitkomma und in einer Festkomma-Variante mit SIMD-Befehlen.
Modulation
Je nach Stufe wird eines von drei Verfahren verwendet.
FSK (Stufen 1 bis 3 oder 4): Ein Ton pro Symbol, 8 oder 16 Frequenzen, Gray-kodiert. Die Tonmenge springt von Symbol zu Symbol nach einer festen Hopping-Tabelle über das Band. 24 Symbole pro Frame sind Pilote mit bekanntem Inhalt. Stufe 1 hat 42,7 ms lange Symbole und funktioniert laut Tabelle noch bei −13,6 dB.
PSK (bei 2300 Hz die Stufen 5 bis 9): 3 bis 13 Einzelträger mit je 93,75 Baud, differentiell moduliert (DBPSK oder DQPSK) und mit Raised-Cosine- oder Root-Raised-Cosine-Impulsen geformt. Bei 2300 Hz liegen die Träger der Stufe 5 zum Beispiel auf 900, 1500 und 2100 Hz, auf Stufe 9 sind es zehn Träger von 555 bis 2445 Hz. In jeden Träger sind Referenzsymbole (Marker) eingestreut.
OFDM (die oberen Stufen): FFT-Länge 1024 bei 48 kHz, also 46,875 Hz Trägerabstand, Schutzintervall 128 Abtastwerte und 32 Abtastwerte Fensterung. Ein Symbol dauert damit 24 ms. Bei 2300 Hz sind es 49 Träger von 375 bis 2625 Hz, bei 2750 Hz 59 Träger, bei 500 Hz 11. Mit DQPSK und D8PSK wird differentiell über die Zeit moduliert, mit 16-QAM und 32-QAM kohärent. Für QAM ist jedes achte Symbol ein Pilot, auf geraden und ungeraden Trägern zeitlich versetzt.
Bei PSK und OFDM wird jedes Symbol zusätzlich mit einer pseudozufälligen Phase aus 128 Schritten multipliziert. Das senkt den Crestfaktor (PAPR) des Summensignals, weil sich die Träger nicht mehr systematisch addieren. Vor jedem Datenframe steht ein Vorlauf von 80 ms (bei QAM 120 ms) aus Zufallssymbolen.
Die Stufen bei 2300 Hz
Die Tabelle ist aus hf/level.rs berechnet. “Netto” ist die Datenrate während der Datensymbole, ohne Vorlauf, Quittungen und Wartezeiten. In der Praxis ist der Durchsatz also niedriger. Die SNR-Schwelle ist der Tabellenwert, an dem sich die Geschwindigkeitsanpassung orientiert.
| Stufe | Verfahren | Träger | Coderate | Frame (Byte) | Netto (bit/s) | SNR-Schwelle |
|---|---|---|---|---|---|---|
| 1 | 8-FSK | 1 | 1/3 | 12 | 18 | −13,6 dB |
| 2 | 8-FSK | 1 | 1/3 | 25 | 41 | −11,2 dB |
| 3 | 16-FSK | 1 | 1/2 | 50 | 82 | −9,4 dB |
| 4 | 16-FSK | 1 | 1/2 | 92 | 175 | −6,6 dB |
| 5 | DQPSK | 3 | 1/2 | 135 | 270 | −3,6 dB |
| 6 | DQPSK | 4 | 1/2 | 176 | 363 | −2,4 dB |
| 7 | DQPSK | 6 | 1/2 | 259 | 549 | −0,6 dB |
| 8 | DQPSK | 8 | 1/2 | 344 | 735 | 0,4 dB |
| 9 | DQPSK | 10 | 1/2 | 428 | 922 | 1,3 dB |
| 10 | OFDM DQPSK | 49 | 1/2 | 899 | 2011 | 5,4 dB |
| 11 | OFDM DQPSK | 49 | 2/3 | 1199 | 2682 | 7,2 dB |
| 12 | OFDM DQPSK | 49 | 4/5 | 1439 | 3219 | 8,5 dB |
| 13 | OFDM D8PSK | 49 | 2/3 | 1799 | 4025 | 11,2 dB |
| 14 | OFDM D8PSK | 49 | 4/5 | 2159 | 4830 | 13,2 dB |
| 15 | OFDM 16-QAM | 49 | 5/6 | 2713 | 5872 | 14,2 dB |
| 16 | OFDM 32-QAM | 49 | 4/5 | 3257 | 7050 | 17,2 dB |
Der Wert 175 bit/s für Stufe 4 taucht auch in den Testvektoren auf: Der Host bekommt dort die Meldung BITRATE (4) 175 bps TX. Stufe 4 ist zugleich die Obergrenze ohne Registrierung.
Ein einzelner Datenframe dauert auf allen Stufen etwa 3,7 bis 5,4 Sekunden. Langsamere Stufen haben weniger Bytes pro Frame, nicht längere Frames. Das hält das Timing der Quittungen vorhersehbar.
Bei 2750 Hz kommt eine zehnte PSK-Stufe mit 13 Trägern dazu, die OFDM-Stufen haben 59 statt 49 Träger, und oben stehen 17 Stufen bis 8489 bit/s. Der 500-Hz-Modus hat 13 Stufen. Er nutzt 2 bis 3 PSK-Träger und 11 OFDM-Träger und erreicht oben 1543 bit/s.
VARA FM
VARA FM verwendet dieselbe OFDM-Grundlage (1024er FFT, 24 ms Symbole), aber ein breiteres NF-Band, weil ein FM-Kanal mehr hergibt als ein SSB-Filter. Zwischen 14 und 116 Träger liegen je nach Stufe zwischen etwa 280 und 5670 Hz. Bei so gutem SNR lohnen sich höhere Modulationen bis 256-QAM, die Pilote kommen hier alle neun Symbole.
| Stufe | narrow | wide |
|---|---|---|
| 1 | 14 Träger, DQPSK, 566 bit/s | gleich |
| 2 | 29 Träger, DQPSK, 1188 bit/s | gleich |
| 3 | 58 Träger, DQPSK, 2390 bit/s | gleich |
| 4 | 58 Träger, DQPSK, 3188 bit/s | 98 Träger, DQPSK, 4040 bit/s |
| 6 | 58 Träger, 16-QAM, 5668 bit/s | 98 Träger, 8-QAM, 7185 bit/s |
| 8 | 58 Träger, 64-QAM, 8505 bit/s | 116 Träger, 16-QAM, 11340 bit/s |
| 11 | 58 Träger, 256-QAM, 12750 bit/s | 116 Träger, 64-QAM, 19003 bit/s |
| 13 | gibt es nicht | 116 Träger, 256-QAM, 25210 bit/s |
Narrow hat 11 Stufen, wide 13. Ohne Registrierung ist bei Stufe 2 Schluss. Auf FM sind die Frames außerdem anders aufgebaut als auf HF: Der Connect-Frame enthält Quell- und Zielrufzeichen und bis zu zwei Digipeater, weil VARA FM über Digis laufen kann.
Busy-Erkennung und CW-ID
Bevor xara sendet, prüft ein Busy-Detektor, ob der Kanal belegt ist. Er sucht im Spektrum sowohl nach einzelnen Tönen als auch nach den typischen Trägermustern der VARA-PSK-Stufen. Ist eine CW-ID eingeschaltet (CWID ON), hängt xara beim Verbindungsende das Rufzeichen in Morse an. Ein Morse-Element dauert dabei wieder 2048 Abtastwerte.
Im dritten Teil geht es darum, wie die beiden Stationen diese Bausteine benutzen: Verbindungsaufbau, Quittungen und die Wahl der Stufe.