SDR DVB-T2-ontvanger in C++

Software Defined Radio is een methode om de hoofdpijn van programmeren te vervangen door de metaalbewerking (die overigens gezond is). Er wordt voorspeld dat SDR's een grote toekomst hebben en hun belangrijkste voordeel is het wegnemen van beperkingen bij de implementatie van radioprotocollen. Een voorbeeld hiervan is de OFDM-modulatiemethode (Orthogonal frequency-division multiplexing), die pas mogelijk werd met de SDR-methode. Maar SDR heeft ook nog een andere, puur technische, mogelijkheid: het kan met minimale inspanning een signaal op elk willekeurig punt besturen en visualiseren.

Eén van de interessante communicatiestandaarden is de terrestrische televisie DVB-T2.
Waarvoor? U kunt natuurlijk ook gewoon de televisie aanzetten zonder op te staan, maar er is dan absoluut niets te kijken. Dit is niet mijn mening, maar een medisch feit.

Echt waar, DVB-T2 is ontworpen met zeer brede mogelijkheden, waaronder:

  • binnengebruik
  • modulatie van QPSK naar 256QAM
  • bandbreedte van 1,7 MHz tot 8 MHz

Er is ervaring met het ontvangen van digitale televisie volgens het SDR-principe. De DVB-T-standaard is opgenomen in het bekende GNURadio-project. Er is een gr-dvbs2rx-blok voor de DVB-T2-standaard (allemaal voor dezelfde GNURadio), maar dat vereist voorafgaande signaalsynchronisatie en is inspirerend (speciale dank aan Ron Economos).

Wat wij hebben.

Er is een norm ETSI EN 302 755 die gedetailleerd de transmissie beschrijft, maar niet de ontvangst.

Signaal in de lucht met een bemonsteringsfrequentie van 9,14285714285714285714 MHz, gemoduleerd door COFDM met 32768 draaggolven, in een band van 8 MHz.

Het is aan te raden om dergelijke signalen te ontvangen met een dubbele bemonsteringsfrequentie (om niets te verliezen) en bij de tussenliggende frequentie een grotere bandbreedte (superheterodyne ontvangst), om de DC-offset en de "lekkage" van de lokale generator (LO) naar de ontvangeringang te elimineren. Apparaten die aan deze voorwaarden voldoen, zijn te duur voor louter curiositeit.

SdrPlay met 10Msps 10bit of AirSpy met vergelijkbare karakteristieken zijn een stuk goedkoper. Er is hier geen sprake van dubbele bemonsteringsfrequentie en ontvangst kan alleen plaatsvinden met directe conversie (Nul-IF). Daarom (om financiële redenen) stappen we over naar de kant van de aanhangers van “pure” SDR met een minimale hardwareconversie.

Er waren twee problemen die opgelost moesten worden:

  1. Synchronisatie. Bepaal de exacte RF-afwijking met fasenauwkeurigheid en bemonsteringsfrequentieafwijking.
  2. Herschrijf de DVB-T2-standaard achterstevoren.

De tweede taak vereist veel meer code, maar kan met wat doorzettingsvermogen worden opgelost en is eenvoudig te verifiëren met behulp van testsignalen.

Testsignalen zijn beschikbaar op de BBC-server ftp://ftp.kw.bbc.co.uk/t2refs/ met gedetailleerde instructies.

De oplossing voor het eerste probleem hangt sterk af van de eigenschappen van het SDR-apparaat en de besturingsmogelijkheden. Het gebruik van de aanbevolen frequentieregelfuncties was, zoals ze zeggen, niet succesvol, maar leverde wel een hoop ervaring op in het lezen van techniek. documentatie, programmeren, series kijken, filosofische vraagstukken oplossen..., kortom, het was niet mogelijk om het project op te geven.

Het geloof in ‘pure SDR’ is alleen maar sterker geworden.

We accepteren het signaal zoals het is, interpoleren het bijna naar een analoog signaal en halen er een discreet signaal uit, dat echter wel lijkt op het echte signaal.

Synchronisatieblokdiagram:

SDR DVB-T2-ontvanger in C++

Hier gaat alles volgens het boekje. Dan wordt het iets ingewikkelder. Het is noodzakelijk om de afwijkingen te berekenen. Er zijn veel literatuur en onderzoeksartikelen waarin de voor- en nadelen van verschillende methoden worden vergeleken. Van de klassiekers: dit is "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimaal ontvangerontwerp voor OFDM-gebaseerde breedbandtransmissie – Deel I en II". Maar ik heb nog geen enkele ingenieur ontmoet die weet hoe hij moet tellen en die dat ook wil, dus werd er een technische aanpak gebruikt. Dezelfde synchronisatiemethode werd gebruikt om verstemming in het testsignaal te introduceren. Door verschillende meetgegevens met bekende afwijkingen (die ik zelf heb ingevoerd) te vergelijken, werden de beste geselecteerd op basis van prestaties en gebruiksgemak. De afwijking van de ontvangstfrequentie wordt berekend door het guard-interval en het herhalende deel ervan te vergelijken. De fase van de ontvangstfrequentie en de bemonsteringsfrequentie worden geschat op basis van de faseafwijking van de pilootsignalen. Deze wordt ook gebruikt in een eenvoudige, lineaire equalizer van het OFDM-signaal.

Equalizer-eigenschappen:

SDR DVB-T2-ontvanger in C++

En dit werkt allemaal goed als je weet wanneer het DVB-T2-frame begint. Hiervoor wordt het preambulesymbool P1 in het signaal meegezonden. De methode voor het detecteren en decoderen van het P1-symbool wordt beschreven in de technische specificatie ETSI TS 102 831 (er zijn ook veel nuttige aanbevelingen voor de ontvangst).

Autocorrelatie van signaal P1 (het hoogste punt is het begin van het frame):

SDR DVB-T2-ontvanger in C++

Eerste afbeelding (nog maar zes maanden tot de bewegende afbeelding…):

SDR DVB-T2-ontvanger in C++

En hier leren we wat IQ-onbalans, DC-offset en LO-lekstroom zijn. Normaal gesproken wordt compensatie voor deze directe conversiespecifieke vervormingen geïmplementeerd in het SDR-apparaatstuurprogramma. Het heeft dan ook lang geduurd voordat we begrepen dat het uitschakelen van de sterren in het vriendelijke QAM64-constellatie het werk is van compensatiefuncties. Ik moest alles uitschakelen en mijn eigen fiets ontwerpen.

En toen begon de foto te bewegen:

SDR DVB-T2-ontvanger in C++

QAM64-modulatie met specifieke constellatierotatie in de DVB-T2-standaard:

SDR DVB-T2-ontvanger in C++

Kort gezegd is dit het resultaat van het malen van het gehakt door de vleesmolen. De norm voorziet in vier soorten menging:

  • bit interleaving (bit shuffling met kolomverdraaiing)
  • celinterleaving (het mengen van cellen in een codeblok)
  • tijdsinterleaving (hetzelfde in de coderingsblokgroep)
  • frequentie-interleaving (het mengen van frequenties in een OFDM-symbool)

Als resultaat hebben we het volgende signaal bij de ingang:

SDR DVB-T2-ontvanger in C++

Dit alles is een strijd om de ruisimmuniteit van het gecodeerde signaal.

Totaal

Nu kunnen we niet alleen het signaal zelf en de vorm ervan zien, maar ook service-informatie.
Er worden twee multiplexen uitgezonden. Elk heeft twee fysieke kanalen (PLP).

Er viel één eigenaardigheid op in de eerste multiplex: de eerste PLP heeft het label "multiple", wat logisch is aangezien het niet de enige in de multiplex is, en de tweede PLP heeft het label "single". Dat is een vraag.
Nog interessanter is de tweede eigenaardigheid in de tweede multiplex: in de eerste PLP staan ​​alle programma's, en in de tweede PLP, op lage snelheid, is er een signaal van onbekende aard. De VLC-speler, die ongeveer vijftig videoformaten en evenveel audioformaten begrijpt, herkent hem in ieder geval niet.

Het project zelf is hier te vinden.

Het project werd opgezet met als doel om de mogelijkheid te onderzoeken om DVB-T2 te decoderen met behulp van SdrPlay (en nu ook AirSpy). Het is dus nog niet eens een alfaversie.

P.S. Terwijl ik veel moeite had met het schrijven van het artikel, lukte het mij toch om PlutoSDR aan het project toe te voegen.

Iemand zal meteen zeggen dat er maar 6 Msps beschikbaar zijn voor het IQ-signaal bij de USB 2.0-uitgang, en dat er minimaal 9,2 Msps nodig is, maar dat is een ander onderwerp.

Bron: www.habr.com