SDR DVB-T2-Empfänger in C++

Software Defined Radio ist eine Methode, Metallarbeiten (die eigentlich gesundheitsfördernd sind) durch den Programmieraufwand zu ersetzen. SDRs sagen eine große Zukunft voraus und als Hauptvorteil wird die Beseitigung von Einschränkungen bei der Implementierung von Funkprotokollen angesehen. Ein Beispiel ist das Modulationsverfahren OFDM (Orthogonal Frequency Division Multiplexing), das nur durch das SDR-Verfahren möglich ist. Aber SDR bietet noch eine weitere, rein technische Möglichkeit: die Möglichkeit, ein Signal an jedem beliebigen Punkt mit geringstem Aufwand zu steuern und zu visualisieren.

Einer der interessanten Kommunikationsstandards ist das terrestrische terrestrische Fernsehen DVB-T2.
Wofür? Natürlich kann man den Fernseher einfach einschalten, ohne aufzustehen, aber es gibt dort absolut nichts zu sehen und das ist nicht mehr meine Meinung, sondern eine medizinische Tatsache.

Im Ernst, DVB-T2 ist mit sehr umfangreichen Funktionen ausgestattet, darunter:

  • Innenanwendung
  • Modulation von QPSK bis 256QAM
  • Bandbreite von 1,7 MHz bis 8 MHz

Ich habe Erfahrung im Empfang von digitalem Fernsehen nach dem SDR-Prinzip. Der DVB-T-Standard ist im bekannten GNURadio-Projekt enthalten. Es gibt einen gr-dvbs2rx-Block für den DVB-T2-Standard (alle für dasselbe GNURadio), aber er erfordert eine vorläufige Signalsynchronisierung und ist inspirierend (besonderer Dank geht an Ron Economos).

Was wir haben.

Es gibt einen ETSI EN 302 755-Standard, der die Übertragung detailliert beschreibt, nicht jedoch den Empfang.

Das Signal wird mit einer Abtastfrequenz von 9,14285714285714285714 MHz ausgestrahlt, moduliert durch COFDM mit 32768 Trägern, in einem Band von 8 MHz.

Es wird empfohlen, solche Signale mit der doppelten Abtastfrequenz zu empfangen (um nichts zu verlieren) und bei der Zwischenfrequenz mehr Bandbreite (Superheterodyn-Empfang), um Gleichstrom-Offset (DC) und „Leckage“ des lokalen Oszillators zu beseitigen (LO) mit dem Empfängereingang. Geräte, die diese Bedingungen erfüllen, sind für bloße Neugierde zu teuer.

SdrPlay mit 10Msps 10bit oder AirSpy mit ähnlichen Eigenschaften ist deutlich günstiger. Von einer doppelten Abtastfrequenz kann hier keine Rede sein und der Empfang kann nur mit Direktwandlung (Zero IF) erfolgen. Daher wechseln wir (aus finanziellen Gründen) auf die Seite der Anhänger von „reinem“ SDR mit minimalem Hardware-Umbau.

Es mussten zwei Probleme gelöst werden:

  1. Synchronisation. Ermitteln Sie die genaue phasengenaue HF-Abweichung und Abtastfrequenzabweichung.
  2. Schreiben Sie den DVB-T2-Standard rückwärts um.

Die zweite Aufgabe erfordert deutlich mehr Code, ist aber mit Ausdauer lösbar und lässt sich anhand von Testsignalen leicht verifizieren.

Testsignale mit detaillierten Anweisungen sind auf dem BBC-Server ftp://ftp.kw.bbc.co.uk/t2refs/ verfügbar.

Die Lösung des ersten Problems hängt stark von den Eigenschaften des SDR-Geräts und seinen Steuerungsfähigkeiten ab. Die Verwendung der empfohlenen Frequenzsteuerungsfunktionen war, wie es heißt, nicht erfolgreich, brachte aber viel Erfahrung beim Lesen dieser Funktionen. Dokumentation, Programmierung, Fernsehserien schauen, philosophische Fragen lösen... kurz gesagt, es war nicht möglich, das Projekt aufzugeben.

Der Glaube an „reines SZR“ ist nur noch stärker geworden.

Wir akzeptieren das Signal so wie es ist, interpolieren es nahezu analog und nehmen ein diskretes Signal heraus, das dem echten jedoch ähnlich ist.

Blockdiagramm der Synchronisation:

SDR DVB-T2-Empfänger in C++

Hier entspricht alles dem Lehrbuch. Als nächstes ist es etwas komplizierter. Abweichungen müssen berechnet werden. Es gibt eine Menge Literatur und Forschungsartikel, in denen die Vor- und Nachteile verschiedener Methoden verglichen werden. Von den Klassikern – das ist „Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimales Empfängerdesign für OFDM-basierte Breitbandübertragung – Teil I und II.“ Aber ich habe keinen einzigen Ingenieur getroffen, der zählen kann und will, also wurde ein ingenieurwissenschaftlicher Ansatz gewählt. Mit der gleichen Synchronisationsmethode wurde eine Verstimmung in das Testsignal eingeführt. Durch den Vergleich verschiedener Metriken mit bekannten Abweichungen (er stellte sie selbst vor) wurden die besten hinsichtlich Leistung und einfacher Implementierung ausgewählt. Die Empfangsfrequenzabweichung wird durch Vergleich des Schutzintervalls und seines sich wiederholenden Teils berechnet. Aus der Phasenabweichung der Pilotsignale werden die Phase der Empfangsfrequenz und die Abtastfrequenz geschätzt und auch in einem einfachen, linearen Entzerrer eines OFDM-Signals verwendet.

Equalizer-Charakteristik:

SDR DVB-T2-Empfänger in C++

Und das alles funktioniert gut, wenn Sie wissen, wann der DVB-T2-Frame beginnt. Dazu wird im Signal das Präambelsymbol P1 übertragen. Die Methode zur Erkennung und Dekodierung des P1-Symbols ist in der Technischen Spezifikation ETSI TS 102 831 beschrieben (es gibt auch viele nützliche Empfehlungen für den Empfang).

Autokorrelation des P1-Signals (höchster Punkt am Anfang des Frames):

SDR DVB-T2-Empfänger in C++

Erstes Bild (nur noch sechs Monate bis zum Bewegtbild...):

SDR DVB-T2-Empfänger in C++

Und hier erfahren wir, was IQ-Ungleichgewicht, DC-Offset und LO-Leckage sind. Eine Kompensation dieser bei der Direktkonvertierung spezifischen Verzerrungen ist in der Regel im SDR-Gerätetreiber implementiert. Daher hat es lange gedauert, bis wir verstanden haben: Sterne aus der freundlichen QAM64-Konstellation auszuschalten ist die Arbeit der Kompensationsfunktionen. Ich musste alles ausschalten und mein Fahrrad schreiben.

Und dann bewegte sich das Bild:

SDR DVB-T2-Empfänger in C++

QAM64-Modulation mit spezifischer Konstellationsrotation im DVB-T2-Standard:

SDR DVB-T2-Empfänger in C++

Kurz gesagt, dies ist das Ergebnis der Rückführung des Hackfleisches durch den Fleischwolf. Die Norm sieht vier Arten der Mischung vor:

  • Bit-Interleaving
  • Zellverschachtelung (Mischen von Zellen in einem Kodierungsblock)
  • Zeitverschachtelung (es gehört auch zur Gruppe der Codierungsblöcke)
  • Frequenzverschachtelung (Frequenzmischung in einem OFDM-Symbol)

Als Ergebnis haben wir am Eingang folgendes Signal:

SDR DVB-T2-Empfänger in C++

All dies ist ein Kampf um die Störfestigkeit des codierten Signals.

Ergebnis

Jetzt können wir nicht nur das Signal selbst und seine Form sehen, sondern auch Serviceinformationen.
Es sind zwei Multiplexe auf Sendung. Jeder verfügt über zwei physische Kanäle (PLP).

Im ersten Multiplex ist eine Kuriosität aufgefallen: Der erste PLP trägt die Bezeichnung „multiple“, was logisch ist, da es im Multiplex mehr als einen gibt, und der zweite PLP trägt die Bezeichnung „single“, und das ist eine Frage.
Noch interessanter ist die zweite Kuriosität im zweiten Multiplex: Alle Programme befinden sich im ersten PLP, aber im zweiten PLP gibt es ein Signal unbekannter Art mit niedriger Geschwindigkeit. Zumindest der VLC-Player, der etwa fünfzig Videoformate und die gleiche Menge an Audio versteht, erkennt es nicht.

Das Projekt selbst finden Sie hier.

Das Projekt wurde mit dem Ziel erstellt, die Möglichkeit der Decodierung von DVB-T2 mit SdrPlay (und jetzt AirSpy) zu ermitteln, daher handelt es sich nicht einmal um eine Alpha-Version.

PS Während ich den Artikel mit Mühe schrieb, gelang es mir, PlutoSDR in das Projekt zu integrieren.

Jemand wird sofort sagen, dass am USB6-Ausgang nur 2.0 Msps für das IQ-Signal anliegen, man aber mindestens 9,2 Msps benötigt, aber das ist ein separates Thema.

Source: habr.com

Kommentar hinzufügen