SDR DVB-T2 ontvanger in C++

Software Defined Radio (softwaregedefinieerde radio) is een methode om metallbewerking te vervangen (wat eigenlijk gunstig is voor de gezondheid) door de hoofdpijn van programmeren. SDR wordt een grote toekomst voorspeld en het belangrijkste voordeel is de verwijdering van beperkingen bij de implementatie van radioprotocols. Een voorbeeld is de modulatiemethode OFDM (Orthogonal frequency-division multiplexing), die alleen mogelijk werd door de SDR-methode. Maar er is ook nog een andere, puur technische mogelijkheid in SDR, namelijk de mogelijkheid om het signaal te controleren en visualiseren op elke willekeurige locatie met minimale inspanning.

Een van de interessante communicatiestandaarden is het terrestrische digitale televisie DVB-T2.
Waarom? Natuurlijk, je kunt gewoon je tv aanzetten zonder op te staan, maar er is daar absoluut niets om naar te kijken en dat is al geen mening meer, maar een medisch feit.

Als we serieus zijn, is DVB-T2 ontwikkeld met zeer uitgebreide mogelijkheden, waaronder:

  • binnengebruik
  • modulatie van QPSK tot 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 te vinden in het bekende GNURadio-project. Er is een blok gr-dvbs2rx voor de DVB-T2 standaard (ook voor GNURadio), maar dat vereist een voorafgaande signaal-synchronisatie en het inspireert (speciale dank aan Ron Economos).

Wat hebben we.

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

Het signaal in de lucht 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 op een tussenliggende frequentie hoger dan de bandbreedte (superheterodyne ontvangst), om DC-afwijking en 'lekkage' van de lokale oscillator (LO) bij de ingang van de ontvanger te vermijden. Apparaten die aan deze voorwaarden voldoen, zijn te duur voor eenvoudig nieuwsgierigheid.

SdrPlay met 10Msps 10bit of AirSpy met vergelijkbare kenmerken is veel goedkoper. Hier is er geen sprake van een dubbele bemonsteringsfrequentie en kan de ontvangst alleen plaatsvinden met directe conversie (Zero IF). Daarom (om financiële redenen) stappen we over naar de zijde van de aanhangers van 'pure' SDR met minimaal hardware-conversie.

Er moesten twee taken worden opgelost:

  1. Synchronisatie. Ontdek de exacte afwijking van de radiogolffrequentie met een precisie tot de fase en de afwijking van de bemonsteringsfrequentie.
  2. Herschrijven van de standaard DVB-T2 achterstevoren.

De tweede taak vereist veel meer code, maar is op te lossen met doorzettingsvermogen en kan eenvoudig worden gecontroleerd met testsignalen.

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

De oplossing voor de eerste taak hangt sterk af van de kenmerken van het SDR-apparaat en de besturingsmogelijkheden. Het gebruik van de aanbevolen functies voor frequentiebeheer, zoals gezegd, was niet succesvol, maar bood veel ervaring in het lezen van technische documentatie, programmeren, het bekijken van series, en 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 praktisch tot een analoog signaal en extraheren dan een gedigitaliseerd signaal dat lijkt op het echte.

Synchroonschema:

SDR DVB-T2 ontvanger in C++

Hier is alles volgens het lesboek. Daarna wordt het iets ingewikkelder. We moeten de afwijkingen berekenen. Er is veel literatuur en onderzoeksartikelen die de voor- en nadelen van verschillende methoden vergelijken. Een klassiek voorbeeld is "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission – Deel I en II". Alleen heb ik nog geen enkele ingenieur gevonden die kan en wil rekenen, daarom is een engineeringsaanpak toegepast. Op dezelfde manier van synchronisatie werden verstoringen in het testsignaal aangebracht. Door verschillende statistieken te vergelijken met bekende afwijkingen (die ik zelf had aangebracht) zijn de beste voor prestaties en eenvoud van implementatie gekozen. De afwijking van de ontvangfrequentie wordt berekend door de beschermingsperiode en het herhalende deel ervan te vergelijken. De fase van de ontvangfrequentie en de bemonsteringsfrequentie worden geëvalueerd aan de hand van de afwijking van de fasen van de pilootsignal en diezelfde wordt gebruikt in de eenvoudige, lineaire equalizer van het OFDM-signaal.

Kenmerken van de equalizer:

SDR DVB-T2 ontvanger in C++

En dit werkt allemaal goed, als je weet wanneer een DVB-T2-frame begint. Voor dit doel wordt er een P1-preambule symbool in het signaal verzonden. De manier van detecteren en decoderen van het P1-symbool is beschreven in de Technical Specification ETSI TS 102 831 (daar staan ook veel nuttige aanbevelingen voor ontvangst).

Autocorrelatie van het P1-signaal (de bovenste punt markeert de start van het frame):

SDR DVB-T2 ontvanger in C++

De eerste afbeelding (er blijft nog maar zes maanden tot het bewegende beeld…):

SDR DVB-T2 ontvanger in C++

En precies hier leren we wat IQ-ongelijkheid, DC-offset en LO-lekkage zijn. Gewoonlijk is de compensatie van deze specifieke vervormingen voor directe conversie gerealiseerd in de SDR-apparaatstuurprogramma. Daarom heeft het veel tijd gekost om te begrijpen: het eruit trappen van sterretjes uit het hechte QAM64-constellatie is het werk van de compensatiefuncties. Ik moest alles uitschakelen en mijn eigen fietse maken.

En nu begon het beeld te bewegen:

SDR DVB-T2 ontvanger in C++

QAM64-modulatie met een specifieke rotatie van de constellatie in de DVB-T2-standaard:

SDR DVB-T2 ontvanger in C++

Kort gezegd is dit het resultaat van het teruglaten van gehakt door de vleesmolen.

  • bit interleaving (bitinterleaving met kolomdraaiing)
  • cell interleaving (interleaving van cellen in de coderingsblok)
  • time interleaving (ook in de groep coderingsblokken)
  • frequency interleaving (interleaving van frequenties in het OFDM-symbool)

Uiteindelijk hebben we zo’n signaal aan de ingang:

SDR DVB-T2 ontvanger in C++

Dit is allemaal een strijd voor de storingstolerantie van het gecodeerde signaal.

Conclusie

Nu kunnen we niet alleen het signaal en zijn vorm zien, maar ook de controle-informatie.
Er zijn twee multiplexen in de uitzending. In iedere multiplex zijn twee fysieke kanalen (PLP).

Een vreemde zaak opgemerkt in de eerste multiplex — de eerste PLP heeft het label 'multiple', wat logisch is, aangezien hij niet alleen in de multiplex is, en de tweede PLP heeft het label 'single' en dat roept vragen op.
Nog interessanter is de tweede vreemde zaak in de tweede multiplex — alle programma's zitten in de eerste PLP, terwijl in de tweede PLP op een lage snelheid een signaal van onbekende oorsprong aanwezig is. Tenminste, de VLC-speler, die ongeveer vijftig videovormen en evenveel audio begrijpt, herkent het niet.

Het project is hier te vinden.

Het project werd opgezet om de mogelijkheid te bepalen om DVB-T2 te decoderen met behulp van SdrPlay (en nu ook AirSpy), dus dit is zelfs geen alfa-versie.

P.S. Terwijl het artikel moeizaam werd geschreven, is het gelukt om PlutoSDR aan het project toe te voegen.

Iemand zal meteen zeggen dat er alleen 6Msps voor het IQ-signaal via USB2.0 is, terwijl minimaal 9,2Msps nodig is, maar dat is al een apart onderwerp.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster