SDR DVB-T2-ontvanger in C++

Software Defined Radio is een methode om metaalwerk (wat eigenlijk goed is voor je gezondheid) te vervangen door de hoofdpijn van programmeren. SDR's voorspellen een grote toekomst en het belangrijkste voordeel wordt beschouwd als het wegnemen van beperkingen bij de implementatie van radioprotocollen. Een voorbeeld is de OFDM-modulatiemethode (Orthogonal Frequency-Division Multiplexing), die alleen mogelijk wordt gemaakt door de SDR-methode. Maar SDR heeft ook nog een puur technische mogelijkheid: de mogelijkheid om met de minste inspanning een signaal op elk willekeurig punt te controleren en te visualiseren.

Een van de interessante communicatiestandaarden is terrestrische terrestrische televisie DVB-T2.
Waarvoor? Je kunt natuurlijk gewoon de tv aanzetten zonder op te staan, maar daar is absoluut niets te zien en dit is niet langer mijn mening, maar een medisch feit.

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

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

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

Wat we hebben.

Er is een ETSI EN 302 755-standaard die de verzending beschrijft, maar niet de ontvangst.

Het signaal wordt uitgezonden met een bemonsteringsfrequentie van 9,14285714285714285714 MHz, gemoduleerd door COFDM met 32768 draaggolven, in een band van 8 MHz.

Het wordt aanbevolen om dergelijke signalen te ontvangen met een dubbele bemonsteringsfrequentie (om niets te verliezen) en bij de middenfrequentie meer bandbreedte (superheterodyne ontvangst), om gelijkstroom (DC) offset en “lekkage” van de lokale oscillator te voorkomen (LO) naar de ontvangeringang. Apparaten die aan deze voorwaarden voldoen, zijn te duur voor louter nieuwsgierigheid.

SdrPlay met 10Msps 10bit of AirSpy met vergelijkbare kenmerken is veel goedkoper. Er is hier geen sprake van een dubbele bemonsteringsfrequentie en ontvangst kan alleen plaatsvinden met directe conversie (Zero IF). Daarom schakelen we (om financiële redenen) over naar de kant van de aanhangers van “pure” SDR met een minimum aan hardwareconversie.

Er moesten twee problemen worden opgelost:

  1. Synchronisatie. Ontdek de exacte fase-nauwkeurige RF-afwijking en bemonsteringsfrequentieafwijking.
  2. Herschrijf de DVB-T2-standaard achterstevoren.

De tweede taak vereist veel meer code, maar kan met doorzettingsvermogen worden opgelost en kan eenvoudig worden geverifieerd 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 is sterk afhankelijk van de kenmerken van het SDR-apparaat en zijn besturingsmogelijkheden. Het gebruik van de aanbevolen frequentiecontrolefuncties was, zoals ze zeggen, niet succesvol, maar gaf wel veel ervaring met het lezen ervan. documentatie, programmeren, tv-series kijken, filosofische vragen oplossen... kortom het project kon niet worden opgegeven.

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

We nemen het signaal zoals het is, interpoleren het bijna analoog en halen er een discreet signaal uit, maar vergelijkbaar met het echte signaal.

Synchronisatieblokschema:

SDR DVB-T2-ontvanger in C++

Alles is hier volgens het leerboek. Het volgende is iets ingewikkelder. Afwijkingen moeten worden berekend. Er is veel literatuur en onderzoeksartikelen waarin de voor- en nadelen van verschillende methoden worden vergeleken. Uit de klassiekers - dit is "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission - Part I en II." Maar ik ben nog geen enkele ingenieur tegengekomen die kan en wil tellen, dus is er gekozen voor een engineeringaanpak. Met behulp van dezelfde synchronisatiemethode werd ontstemming in het testsignaal geïntroduceerd. Door verschillende statistieken te vergelijken met bekende afwijkingen (hij introduceerde ze zelf), werden de beste geselecteerd op basis van prestaties en implementatiegemak. De afwijking van de ontvangstfrequentie wordt berekend door het bewakingsinterval 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 en deze wordt ook gebruikt in een eenvoudige, lineaire equalizer van een OFDM-signaal.

Equalizer-kenmerk:

SDR DVB-T2-ontvanger in C++

En dit alles werkt goed als je weet wanneer het DVB-T2-frame begint. Om dit te doen, wordt het preambulesymbool P1 in het signaal verzonden. 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 ontvangst).

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

SDR DVB-T2-ontvanger in C++

Eerste foto (nog maar zes maanden tot het bewegende beeld...):

SDR DVB-T2-ontvanger in C++

En dit is waar we leren wat IQ-onbalans, DC-offset en LO-lekkage zijn. In de regel wordt compensatie voor deze vervormingen die specifiek zijn voor directe conversie geïmplementeerd in het SDR-apparaatstuurprogramma. Daarom duurde het lang om het te begrijpen: het uitschakelen van sterren uit het vriendelijke QAM64-sterrenbeeld is het werk van de compensatiefuncties. Ik moest alles uitschakelen en mijn fiets schrijven.

En toen bewoog het beeld:

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 terug door de vleesmolen halen van het gehakt. De norm voorziet in vier soorten menging:

  • beetje interleaving
  • celinterleaving (cellen mengen in een coderingsblok)
  • time interleaving (het zit ook in de groep coderingsblokken)
  • frequentie-interleaving (frequentiemenging in een OFDM-symbool)

Als resultaat hebben we het volgende signaal aan 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 zijn vorm zien, maar ook service-informatie.
Er zijn twee multiplexen in de lucht. Elk heeft twee fysieke kanalen (PLP).

Er werd één eigenaardigheid opgemerkt in de eerste multiplex: de eerste PLP heeft het label "multiple", wat logisch is, aangezien er meer dan één in de multiplex zit, en de tweede PLP heeft het label "single", en dit is een vraag.
Nog interessanter is de tweede eigenaardigheid in de tweede multiplex: alle programma's bevinden zich in de eerste PLP, maar in de tweede PLP is er een signaal van onbekende aard met lage snelheid. De VLC-speler, die ongeveer vijftig videoformaten en dezelfde hoeveelheid audio begrijpt, herkent hem in ieder geval niet.

Het project zelf is hier te vinden.

Het project is gemaakt met als doel de mogelijkheid te bepalen om DVB-T2 te decoderen met SdrPlay (en nu AirSpy), dus dit is niet eens een alfaversie.

PS Terwijl ik het artikel met moeite aan het schrijven was, slaagde ik erin PlutoSDR in het project te integreren.

Iemand zal meteen zeggen dat er maar 6Msps is voor het IQ-signaal op de USB2.0-uitgang, maar je hebt minimaal 9,2Msps nodig, maar dit is een apart onderwerp.

Bron: www.habr.com

Voeg een reactie