Receptor SDR DVB-T2 en C++

La ràdio definida per programari és un mètode per substituir el treball metàl·lic (que en realitat és bo per a la vostra salut) pel mal de cap de la programació. Els SDR prediuen un gran futur i es considera que el principal avantatge és l'eliminació de les restriccions en la implementació de protocols de ràdio. Un exemple és el mètode de modulació OFDM (Orthogonal frequency-division multiplexing), que només és possible gràcies al mètode SDR. Però SDR també té una oportunitat més, purament d'enginyeria: la capacitat de controlar i visualitzar un senyal en qualsevol punt arbitrari amb el mínim esforç.

Un dels estàndards de comunicació interessants és la televisió terrestre terrestre DVB-T2.
Per a què? Per descomptat, simplement pots encendre el televisor sense aixecar-te, però no hi ha absolutament res per veure i això ja no és la meva opinió, sinó un fet mèdic.

De debò, DVB-T2 està dissenyat amb capacitats molt àmplies, que inclouen:

  • aplicació interior
  • modulació de QPSK a 256QAM
  • amplada de banda d'1,7 MHz a 8 MHz

Tinc experiència en rebre televisió digital utilitzant el principi SDR. L'estàndard DVB-T es troba al conegut projecte GNURadio. Hi ha un bloc gr-dvbs2rx per a l'estàndard DVB-T2 (tot per al mateix GNURadio), però requereix una sincronització preliminar del senyal i és inspirador (gràcies especials a Ron Economos).

El que tenim.

Hi ha una norma ETSI EN 302 755 que detalla la transmissió, però no la recepció.

El senyal és a l'aire amb una freqüència de mostreig de 9,14285714285714285714 MHz, modulat per COFDM amb 32768 portadores, en una banda de 8 MHz.

Es recomana rebre aquests senyals amb el doble de la freqüència de mostreig (per no perdre res) i a la freqüència intermèdia més amplada de banda (recepció superheterodina), per desfer-se de la compensació de corrent continu (DC) i la "fuga" de l'oscil·lador local. (LO) a l'entrada del receptor. Els dispositius que compleixen aquestes condicions són massa cars per a la simple curiositat.

SdrPlay amb 10Msps 10bit o AirSpy amb característiques similars és molt més barat. No es tracta de duplicar la freqüència de mostreig aquí i la recepció només es pot fer amb conversió directa (Zero IF). Per tant (per raons financeres) estem canviant al costat dels partidaris de l'SDR "pur" amb un mínim de conversió de maquinari.

Calia resoldre dos problemes:

  1. Sincronització. Descobriu la desviació exacta de la fase de RF i la desviació de la freqüència de mostreig.
  2. Torneu a escriure l'estàndard DVB-T2 al revés.

La segona tasca requereix molt més codi, però es pot resoldre amb perseverança i es pot verificar fàcilment mitjançant senyals de prova.

Els senyals de prova estan disponibles al servidor de la BBC ftp://ftp.kw.bbc.co.uk/t2refs/ amb instruccions detallades.

La solució al primer problema depèn molt de les característiques del dispositiu SDR i de les seves capacitats de control. L'ús de les funcions de control de freqüència recomanades, com diuen, no va tenir èxit, però va donar molta experiència en llegir-les. documentació, programació, veure sèries de televisió, resoldre qüestions filosòfiques..., en definitiva, no es va poder abandonar el projecte.

La fe en el "SDR pur" només s'ha fet més forta.

Prenem el senyal tal com és, l'interpolem gairebé a un analògic i en traiem un de discret, però semblant al real.

Diagrama de blocs de sincronització:

Receptor SDR DVB-T2 en C++

Tot aquí és segons el llibre de text. El següent és una mica més complicat. Cal calcular les desviacions. Hi ha molta literatura i articles de recerca que comparen els avantatges i els desavantatges de diferents mètodes. Dels clàssics: aquest és "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, disseny òptim del receptor per a la transmissió de banda ampla basada en OFDM - Part I i II". Però no he conegut cap enginyer que pugui i vulgui comptar, així que es va utilitzar un enfocament d'enginyeria. Utilitzant el mateix mètode de sincronització, es va introduir la desintonització al senyal de prova. En comparar diferents mètriques amb desviacions conegudes (ell mateix les va presentar), es van seleccionar les millors per al rendiment i la facilitat d'implementació. La desviació de la freqüència de recepció es calcula comparant l'interval de guàrdia i la seva part repetida. La fase de la freqüència de recepció i la freqüència de mostreig s'estimen a partir de la desviació de fase dels senyals pilot i això també s'utilitza en un equalitzador simple i lineal d'un senyal OFDM.

Característica de l'equalitzador:

Receptor SDR DVB-T2 en C++

I tot això funciona bé si sabeu quan comença el marc DVB-T2. Per fer-ho, es transmet al senyal el símbol de preàmbul P1. El mètode per detectar i descodificar el símbol P1 es descriu a l'especificació tècnica ETSI TS 102 831 (també hi ha moltes recomanacions útils per a la recepció).

Autocorrelació del senyal P1 (el punt més alt al principi del fotograma):

Receptor SDR DVB-T2 en C++

Primera imatge (només falten sis mesos per a la imatge en moviment...):

Receptor SDR DVB-T2 en C++

I aquí és on aprenem què són el desequilibri de coeficient intel·lectual, la compensació de CC i les fuites de LO. Per regla general, la compensació d'aquestes distorsions específiques de la conversió directa s'implementa al controlador del dispositiu SDR. Per tant, va trigar molt de temps a entendre-ho: eliminar estrelles de la amigable constel·lació QAM64 és el treball de les funcions de compensació. Vaig haver d'apagar-ho tot i escriure la meva bicicleta.

I llavors la imatge es va moure:

Receptor SDR DVB-T2 en C++

Modulació QAM64 amb rotació de constel·lació específica a l'estàndard DVB-T2:

Receptor SDR DVB-T2 en C++

En resum, aquest és el resultat de tornar a passar la carn picada per la picadora de carn. La norma preveu quatre tipus de mescla:

  • poc entrellaçat
  • intercalat cel·lular (mescla de cèl·lules en un bloc de codificació)
  • intercalat temporal (també està al grup de blocs de codificació)
  • entrellaçat de freqüències (mescla de freqüències en un símbol OFDM)

Com a resultat, tenim el següent senyal a l'entrada:

Receptor SDR DVB-T2 en C++

Tot això és una lluita per la immunitat al soroll del senyal codificat.

Total

Ara podem veure no només el senyal en si i la seva forma, sinó també la informació del servei.
Hi ha dos multiplex a l'aire. Cadascun té dos canals físics (PLP).

Es va notar una curiositat al primer múltiplex: el primer PLP s'anomena "múltiple", la qual cosa és lògic, ja que n'hi ha més d'un al múltiplex, i el segon PLP s'etiqueta "únic" i aquesta és una pregunta.
Encara més interessant és la segona raresa del segon multiplex: tots els programes es troben al primer PLP, però al segon PLP hi ha un senyal de naturalesa desconeguda a baixa velocitat. Almenys el reproductor VLC, que entén una cinquantena de formats de vídeo i la mateixa quantitat d'àudio, no el reconeix.

El projecte en si es pot trobar aquí.

El projecte es va crear amb l'objectiu de determinar la possibilitat mateixa de descodificar DVB-T2 mitjançant SdrPlay (i ara AirSpy.), de manera que ni tan sols és una versió alfa.

PS Mentre escrivia l'article amb dificultats, vaig aconseguir integrar PlutoSDR al projecte.

Algú dirà immediatament que només hi ha 6 Msps per al senyal IQ a la sortida USB2.0, però necessiteu almenys 9,2 Msps, però aquest és un tema a part.

Font: www.habr.com

Afegeix comentari