M-ary Modulation im GNU Radio Companion

Dieselbe Sender/Empfänger-Kette für BPSK, QPSK, 8-PSK, 4-/8-ASK und 16-QAM — ein Praxis-Lab aus dem GNU Radio Wiki zeigt, welchen Preis höhere Datenraten in Bitfehlerrate kosten.

Das GNU Radio Wiki bietet neben den grundlegenden Mod/Demod-Tutorials für BPSK und QPSK auch ein aufbauendes Lab, das gezielt M-äre Modulationsverfahren vergleicht: M-ASK, M-PSK, and QAM-M Mod and Demod. „M-är" bedeutet dabei, dass ein Symbol nicht nur zwei, sondern $M$ mögliche Zustände annehmen kann — bei $M=2^k$ werden also $k$ Bit pro Symbol übertragen.

Die im Lab formulierten Lernziele:

  • M-äre Modulationen mit unterschiedlichen Schemata (ASK, PSK, QAM) gegenüberstellen
  • die Konstellation jeder Modulation visualisieren
  • spektrale Effizienz und Rauschempfindlichkeit analysieren
  • die Verfahren anhand der Bitfehlerrate (BER) vergleichen

Der Clou dabei: Es wird nicht für jede Modulationsart ein neuer Flowgraph von Grund auf gebaut. Stattdessen dient ein einziger BPSK/2-ASK-Referenzaufbau als Ausgangspunkt, der Schritt für Schritt zu QPSK, 8-PSK, 4-ASK, 8-ASK und 16-QAM umgebaut wird — meist durch Austausch von nur zwei, drei Parametern. Das macht den direkten Vergleich erst aussagekräftig, weil Rauschkanal, Pulsformung und Synchronisationsblöcke über alle Varianten identisch bleiben.

Die Wiki-Seite selbst liefert kaum Fließtext — sie verweist für die Erklärung der Basis-Kette explizit auf die ausführlicheren Vorgänger-Tutorials BPSK Demodulation und QPSK Mod and Demod. Die folgende Aufbereitung fasst beide Quellen zusammen, damit die Block-Kette ohne Sprünge zwischen drei Wiki-Seiten nachvollziehbar ist.

Die gemeinsame Sender/Empfänger-Kette

Jede Variante im Lab basiert auf derselben Abfolge von Blöcken:

Stufe Block Aufgabe
Sender Random Source erzeugt gepackte Bytes (0–255) als Rohdaten
Sender Constellation Object legt Symbol-Mapping und Konstellationspunkte fest
Sender Constellation Modulator Unpack → Map → (Differential Encoder) → Chunks-to-Symbols → RRC-Pulsformung (Polyphase Arbitrary Resampler, ein Filterblock, der Hoch- und Herunterabtastung mit der eigentlichen RRC-Filterung in einem Schritt kombiniert)
Kanal Channel Model simuliert AWGN (Additive White Gaussian Noise — additives, gaußverteiltes, spektral weißes Rauschen; als Rauschspannung parametriert), Frequenzoffset und Timing-Offset zwischen Sender- und Empfängertakt
Empfänger Polyphase Clock Sync Taktrückgewinnung, Empfänger-Matched-Filter (2. RRC-Filter gegen ISI) und Downsampling auf 1 Sample/Symbol
Empfänger Costas Loop Träger-/Phasennachführung (2. Ordnung, Ordnungsparameter = Bits/Symbol der Konstellation)
Empfänger Constellation Decoder + Differential Decoder Symbol → Bitgruppe zurückrechnen, Phasenmehrdeutigkeit per Differenzcodierung auflösen
Prüfung K-bit Unpack + Delay + Subtract rekonstruierten Bitstrom gegen die (verzögerten) Originalbits vergleichen → Bitfehlerrate

Zwei Details, die für alle Varianten gleich funktionieren und deshalb nur einmal erklärt werden:

RRC-Pulsformung und ISI. Der Sender formt die Symbole mit einem Root-Raised-Cosine-Filter (Parameter „Excess Bandwidth", üblich 0,2–0,35), um das Sendespektrum zu begrenzen — ohne Filter würden Rechteckimpulse breitbandige Nebenaussendungen erzeugen. Dieser Filter erzeugt allerdings absichtlich Intersymbolinterferenz (ISI): Nachbarsymbole überlagern sich im Zeitbereich. Erst das identische RRC-Filter im Empfänger (im Polyphase-Clock-Sync-Block enthalten) faltet mit dem Sendefilter zu einem echten Raised-Cosine-Filter zusammen, das die ISI am idealen Abtastzeitpunkt wieder auf null bringt.

Differenzcodierung gegen Phasenmehrdeutigkeit. Die Costas-Loop kennt nur den Betrag der Phase, nicht deren ursprüngliche Zuordnung zu Bitmustern — bei QPSK bleibt so eine 90°-Mehrdeutigkeit (bei BPSK 180°), weil die Loop auf jede der $M$ gleichwertigen Rotationen einrasten kann. Das Lab umgeht dieses Problem, indem der Constellation Modulator mit „Differential Encoding" nicht die Symbole selbst, sondern die Phasenübergänge zwischen Symbolen sendet. Ein Differential Decoder macht das auf der Empfangsseite rückgängig — unabhängig davon, bei welcher der $M$ Rotationen die Loop eingerastet ist.

BPSK/2-ASK — der Referenzaufbau

Ausgangspunkt ist BPSK.grc. Drei Variablen sind hier zentral, weil sie in den folgenden Abschnitten wiederkehren:

  • rrc_taps: firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), Alpha, 11*sps*nfilts) — die Filterkoeffizienten des Polyphase-Filters im Clock-Sync-Block (nfilts Teilfilter für feine Phasenauflösung bei der Taktrückgewinnung)
  • timing_loop_bw: 0.0628 (≈ 2π/100) — Schleifenbandbreite der Taktrückgewinnung; ein Kompromiss zwischen schnellem Einrasten und Rauschunempfindlichkeit
  • Delay: int(5.5 * sps + 7) — wie viele Samples der Originalbitstrom verzögert werden muss, damit er beim BER-Vergleich mit dem (durch RRC-Filter, Clock-Sync und Costas-Loop verzögerten) Empfangssignal synchron liegt

Der Delay-Wert ist reiner Bilanzposten: Jeder Filter- und Synchronisationsblock in der Kette kostet eine feste Anzahl Samples Latenz. 5.5 * sps + 7 ist diese Summe für die BPSK-Kette bei Samples-per-Symbol sps — bei den folgenden Varianten mit mehr Bit/Symbol muss dieser Wert mit der Anzahl der Bits pro Symbol multipliziert werden (siehe unten), weil der Vergleich nach dem K-bit-Unpack-Block auf Bit-, nicht auf Symbolebene stattfindet.

M-PSK: QPSK und 8-PSK

QPSK (QPSK.grc) entsteht aus dem BPSK-Aufbau durch vier Änderungen:

  1. Constellation Object auf QPSK mit Modulus 4 umstellen (Modulus = Anzahl möglicher Symbolzustände, also $M$)
  2. ein K-bit-Unpack-Block (K=2) an der markierten Stelle ergänzen, damit je Symbol 2 statt 1 Bit verglichen werden
  3. Delay verdoppeln: int(5.5 * sps + 7) * 2
  4. BER bei steigender Rauschleistung beobachten

8-PSK (8psk.grc) folgt demselben Muster mit Modulus 8, K-bit-Unpack K=3 und Delay * 3.

Der Grund, warum sich 8-PSK schlechter schlägt als QPSK und BPSK, liegt rein in der Geometrie der Konstellation: Bei gleicher Sendeleistung (alle Punkte auf dem Einheitskreis) liegen die 8 Phasenpunkte enger beieinander (45° Abstand) als die 4 Punkte von QPSK (90°) oder die 2 Punkte von BPSK (180°). Ein kleinerer Mindestabstand zwischen benachbarten Konstellationspunkten bedeutet: Dieselbe Rauschamplitude reicht eher aus, um einen Punkt in die Entscheidungsregion des Nachbarn zu schieben — die BER steigt mit $M$, auch ohne dass sich sonst etwas an der Kette ändert.

M-ASK: 4-ASK und 8-ASK

Für M-ASK wird nicht das Constellation Object, sondern das Constellation Rect. Object verwendet — der Block, der rechteckige (gitterförmige) Konstellationen erzeugt und dabei automatisch auf Einheitsamplitude normiert.

4-ASK (4ASK.grc): Die QPSK-Kette wird umgebaut, indem das Constellation Object durch ein Constellation Rect. Object mit 4 Punkten auf einer Linie (statt in der Ebene verteilt) ersetzt wird — die Punkte unterscheiden sich nur in der Amplitude, nicht in der Phase. Modulus 4, K-bit-Unpack K=2, Delay * 2 — strukturell identisch zu QPSK, nur mit anderer Konstellationsgeometrie.

8-ASK (8ASK.grc) erweitert das auf 8 Amplitudenstufen.

M-ASK ist bei gleicher mittlerer Sendeleistung grundsätzlich anfälliger für Rauschen als M-PSK oder QAM-M mit derselben Anzahl Zustände: Alle ASK-Punkte liegen auf einer Linie durch den Ursprung, während PSK- und QAM-Punkte die komplexe Ebene zweidimensional ausnutzen. Bei gleicher Anzahl Zustände $M$ ist der minimale Punktabstand bei eindimensionaler Anordnung kleiner als bei zweidimensionaler — das erklärt, warum ASK in Vergleichstabellen für dieselbe BER durchgängig mehr Sendeleistung braucht als PSK/QAM.

QAM-M: 16-QAM

16-QAM (QAM16.grc) baut wieder auf der QPSK-Kette auf: Constellation Object auf 16QAM, Modulus 16, K-bit-Unpack K=4, Delay * 4.

QAM nutzt — anders als reines ASK oder PSK — sowohl Amplitude als auch Phase, um Symbole zu unterscheiden (vgl. die Konstellationstabellen auf der Digitale-Modulation-Übersichtsseite). Dadurch lassen sich bei gleichem $M$ die Konstellationspunkte gleichmäßiger über die Ebene verteilen als bei reinem M-PSK, was den minimalen Punktabstand vergrößert und QAM bei hohem $M$ (16, 64, 256 …) günstiger macht als eine reine Phasenmodulation mit derselben Zustandsanzahl.

Was der Vergleich zeigt

Über alle Varianten hinweg demonstriert das Lab denselben Trade-off: Jede Verdopplung von $M$ verdoppelt die Bits/Symbol (mehr Datenrate bei gleicher Symbolrate = gleicher Bandbreite), verkleinert aber den Punktabstand in der Konstellation und erhöht damit die Bitfehlerrate bei gleichem Rauschpegel. Wer die Flowgraphs in GNU Radio Companion selbst durchspielt, sieht das am deutlichsten, wenn man die Noise Voltage im Channel-Model-Block schrittweise erhöht: Bei BPSK/2-ASK bleibt die Konstellation noch länger sauber, bei 8-PSK oder 16-QAM franst sie schon bei geringerem Rauschen sichtbar aus.

Kochbuch: Systematisches Vorgehen für eine neue M-äre Variante

Alle sechs Varianten im Lab entstehen durch dieselbe Abfolge von Entscheidungen. Das folgende Schema verallgemeinert diese Schritte, sodass es auch für Kombinationen trägt, die im Original-Lab nicht vorkommen (z. B. 16-PSK oder 32-QAM) — Voraussetzung ist nur, dass $M$ eine Zweierpotenz ist und auf der bestehenden Sender/Empfänger-Kette aufgebaut wird.

Schritt Was tun Warum Stolperstein / Prüfweg
1. Bits/Symbol festlegen $k = \log_2(M)$ berechnen bestimmt Modulus, K-bit-Unpack und Delay-Faktor aller folgenden Schritte $M$ muss Zweierpotenz sein; sonst keine ganzzahlige Bit/Symbol-Zuordnung mit diesem einfachen Schema
2. Konstellationsgeometrie wählen ASK → Punkte auf einer Linie, PSK → Punkte auf dem Einheitskreis, QAM → Punkte im Gitter Geometrie bestimmt den minimalen Punktabstand bei gegebener Sendeleistung und damit die Rauschempfindlichkeit bei QAM auf Average-Power-Normalisierung achten, sonst ist der BER-Vergleich zwischen Varianten nicht fair (siehe Constellation-Blöcke)
3. Blocktyp wählen Constellation Rect. Object für Gitter/Linien-Konstellationen (ASK, QAM), Constellation Object für freie Punktlisten (PSK, benutzerdefiniert) Rect. Object normiert automatisch und ist für gitterförmige Layouts einfacher zu parametrieren Punkte müssen für Differenzcodierung im Uhr- oder Gegenuhrzeigersinn sortiert sein (gilt nur für rotationssymmetrische Konstellationen, siehe Schritt 5)
4. Modulus/Symbol Map setzen Modulus = $M$; Symbol Map nach Gray-Code prüfen Gray-Coding sorgt dafür, dass Nachbarsymbole sich nur in 1 Bit unterscheiden — ein Symbolfehler zum nächsten Nachbarn kostet dann nur 1 statt mehrerer Bitfehler Symbol Map manuell gegenrechnen, wenn kein Standard-Gray-Code hinterlegt ist (z. B. bei „Variable Constellation")
5. Differential Encoding aktivieren „Differential Encoding" im Constellation Modulator auf „Yes", passenden Differential Decoder im Empfänger einfügen löst die $360°/M$-Phasenmehrdeutigkeit der Costas-Loop ohne zusätzliche Pilotsymbole nur sinnvoll bei rotationssymmetrischen Konstellationen (PSK, QAM); bei reinem ASK ohne Rotationssymmetrie ist Differential Encoding meist unnötig, weil dort keine PLL/Costas-Loop-Mehrdeutigkeit auf mehreren Rotationswinkeln existiert
6. Costas-Loop-Ordnung setzen Ordnungsparameter = $M$ (bzw. Konstellations-Arity — die Anzahl der möglichen Symbolzustände, gleichbedeutend mit $M$) die Loop hebt die Modulation per $M$-ter Potenz auf, um die Trägerphase zurückzugewinnen gilt sauber nur für M-PSK — siehe Warnbox unten
7. K-bit Unpack einfügen K = $k$ aus Schritt 1 wandelt die vom Constellation Decoder gelieferten Symbolwerte zurück in eine Bitfolge zum Vergleich mit den Originalbits K muss exakt zu Schritt 1 passen, sonst verschiebt sich der Bitvergleich fortlaufend
8. Delay skalieren Delay = int(5.5 * sps + 7) * k der BER-Vergleich läuft auf Bit-, nicht Symbolebene; die feste Sample-Verzögerung der Kette muss deshalb in Bit-Einheiten hochgerechnet werden falscher Delay zeigt sich als BER nahe 50 % trotz sauberer Konstellation — erst variieren, bis die Differenz zweier Bitströme durchgehend 0 wird
9. Rauschen schrittweise erhöhen Noise Voltage im Channel Model langsam hochdrehen, Konstellation und BER parallel beobachten zeigt den Trade-off Datenrate vs. Störfestigkeit direkt am eigenen Aufbau, statt ihn nur zu behaupten Konstellationspunkte, die zuerst verschwimmen, liegen meist am dichtesten beieinander — daran lässt sich der schwächste Punkt der gewählten Geometrie ablesen
Costas-Loop nicht blind auf ASK/QAM übertragen: Die im Lab verwendete Costas-Loop funktioniert zuverlässig nur für Konstellationen mit konstantem Betrag (M-PSK) — sie gewinnt die Trägerphase, indem sie das Signal in die $M$-te Potenz erhebt und damit die Modulation auslöscht. Bei ASK und QAM variiert die Amplitude zwischen den Symbolen, wodurch die Potenzbildung zusätzliches Amplitudenrauschen in die Phasenschätzung einschleppt ("Selbstrauschen"). Das Original-Lab verwendet für 4-/8-ASK und 16-QAM dieselbe Costas-Loop trotzdem weiter, weil Frequenz-/Timing-Offset in der Simulation moderat gewählt sind — für echte, rauschbehaftete QAM-Signale (z. B. reale Digitalfunk-Modes) braucht man in der Praxis eher eine entscheidungsgesteuerte (decision-directed) Trägerrückgewinnung, die anhand des bereits (grob) demodulierten Symbols die tatsächliche Phasenabweichung berechnet, statt sich auf die reine Potenzbildung zu verlassen.

GRC-Dateien öffnen

Die .grc-Dateien lassen sich direkt in GNU Radio Companion öffnen (gnuradio-companion BPSK.grc). Der direkte Klick auf die Wiki-Links oben liefert bei manchen Netzwerk-/Firewall-Konfigurationen einen Cloudflare-403; in dem Fall hilft ein Browser mit aktiviertem JavaScript, oder ersatzweise die archivierte Version über die Wayback Machine.

Quellen