Ricevitore SDR DVB-T2 in C++

La Software Defined Radio è un metodo per sostituire la lavorazione dei metalli (che in realtà fa bene alla salute) con il mal di testa della programmazione. Gli SDR prevedono un grande futuro e il vantaggio principale è considerato l’eliminazione delle restrizioni nell’implementazione dei protocolli radio. Un esempio è il metodo di modulazione OFDM (multiplexing a divisione di frequenza ortogonale), reso possibile solo dal metodo SDR. Ma l'SDR ha anche un'altra opportunità puramente ingegneristica: la capacità di controllare e visualizzare un segnale in qualsiasi punto arbitrario con il minimo sforzo.

Uno degli standard di comunicazione interessanti è la televisione terrestre DVB-T2.
Per quello? Certo, puoi semplicemente accendere la TV senza alzarti, ma lì non c'è assolutamente niente da guardare e questa non è più una mia opinione, ma un fatto medico.

Seriamente, DVB-T2 è progettato con funzionalità molto ampie, tra cui:

  • applicazione interna
  • modulazione da QPSK a 256QAM
  • larghezza di banda da 1,7 MHz a 8 MHz

Ho esperienza nella ricezione della televisione digitale secondo il principio SDR. Lo standard DVB-T fa parte del noto progetto GNURadio. Esiste un blocco gr-dvbs2rx per lo standard DVB-T2 (tutti per lo stesso GNURadio), ma richiede una sincronizzazione preliminare del segnale ed è stimolante (un ringraziamento speciale a Ron Economos).

Quello che abbiamo

Esiste uno standard ETSI EN 302 755 che descrive dettagliatamente la trasmissione, ma non la ricezione.

Il segnale è in onda con una frequenza di campionamento di 9,14285714285714285714 MHz, modulata dal COFDM con 32768 portanti, in una banda di 8 MHZ.

Si consiglia di ricevere tali segnali con una frequenza di campionamento doppia (per non perdere nulla) e con una maggiore larghezza di banda alla frequenza intermedia (ricezione supereterodina), per eliminare l'offset di corrente continua (DC) e le "dispersioni" dell'oscillatore locale (LO) all'ingresso del ricevitore. I dispositivi che soddisfano queste condizioni sono troppo costosi per mera curiosità.

SdrPlay con 10Msps 10bit o AirSpy con caratteristiche simili sono molto più economici. In questo caso non si tratta di raddoppiare la frequenza di campionamento e la ricezione può essere effettuata solo con conversione diretta (Zero IF). Pertanto (per ragioni finanziarie) stiamo passando dalla parte dei sostenitori dell'SDR “puro” con una conversione hardware minima.

Era necessario risolvere due problemi:

  1. Sincronizzazione. Scopri l'esatta deviazione RF con precisione di fase e la deviazione della frequenza di campionamento.
  2. Riscrivere lo standard DVB-T2 all'indietro.

Il secondo compito richiede molto più codice, ma può essere risolto con perseveranza e può essere facilmente verificato utilizzando segnali di test.

I segnali di test sono disponibili sul server BBC ftp://ftp.kw.bbc.co.uk/t2refs/ con istruzioni dettagliate.

La soluzione al primo problema dipende fortemente dalle caratteristiche del dispositivo SDR e dalle sue capacità di controllo. L'utilizzo delle funzioni di controllo della frequenza consigliate, come si suol dire, non ha avuto successo, ma ha dato molta esperienza nella loro lettura. documentarsi, programmare, guardare serie tv, risolvere quesiti filosofici... insomma, non era possibile abbandonare il progetto.

La fede nei “DSP puri” non ha fatto altro che rafforzarsi.

Prendiamo il segnale così com'è, lo interpoliamo quasi su un analogico e ne estraiamo uno discreto, ma simile a quello reale.

Schema a blocchi di sincronizzazione:

Ricevitore SDR DVB-T2 in C++

Tutto qui è secondo il libro di testo. Il prossimo è un po’ più complicato. Le deviazioni devono essere calcolate. Esiste molta letteratura e articoli di ricerca che confrontano i vantaggi e gli svantaggi dei diversi metodi. Dai classici: questo è "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission - Part I and II." Ma non ho incontrato un solo ingegnere che possa e voglia contare, quindi è stato utilizzato un approccio ingegneristico. Utilizzando lo stesso metodo di sincronizzazione, nel segnale di prova è stata introdotta la dissintonizzazione. Confrontando diverse metriche con deviazioni note (le ha introdotte lui stesso), sono state selezionate le migliori per prestazioni e facilità di implementazione. La deviazione della frequenza di ricezione viene calcolata confrontando l'intervallo di guardia e la sua parte ripetitiva. La fase della frequenza di ricezione e la frequenza di campionamento vengono stimate dalla deviazione di fase dei segnali pilota e vengono utilizzate anche in un semplice equalizzatore lineare di un segnale OFDM.

Caratteristiche dell'equalizzatore:

Ricevitore SDR DVB-T2 in C++

E tutto questo funziona bene se sai quando inizia il frame DVB-T2. Per fare ciò, nel segnale viene trasmesso il simbolo di preambolo P1. Il metodo per rilevare e decodificare il simbolo P1 è descritto nella Specifica Tecnica ETSI TS 102 831 (ci sono anche molte raccomandazioni utili per la ricezione).

Autocorrelazione del segnale P1 (il punto più alto all'inizio del frame):

Ricevitore SDR DVB-T2 in C++

Prima immagine (mancano solo sei mesi all'immagine in movimento...):

Ricevitore SDR DVB-T2 in C++

Ed è qui che apprendiamo cosa sono lo squilibrio del QI, l'offset DC e la dispersione LO. Di norma, la compensazione di queste distorsioni specifiche della conversione diretta viene implementata nel driver del dispositivo SDR. Pertanto, ci è voluto molto tempo per capire: eliminare le stelle dalla costellazione amica QAM64 è opera delle funzioni di compensazione. Ho dovuto spegnere tutto e scrivere la mia bici.

E poi l'immagine si è spostata:

Ricevitore SDR DVB-T2 in C++

Modulazione QAM64 con rotazione specifica della costellazione nello standard DVB-T2:

Ricevitore SDR DVB-T2 in C++

In breve, questo è il risultato del passaggio della carne macinata attraverso il tritacarne. La norma prevede quattro tipologie di miscelazione:

  • un po' di interlacciamento
  • interlacciamento delle celle (mescolare le celle in un blocco di codifica)
  • interlacciamento temporale (è anche nel gruppo dei blocchi di codifica)
  • interlacciamento di frequenza (miscelazione di frequenze in un simbolo OFDM)

Di conseguenza, abbiamo in ingresso il seguente segnale:

Ricevitore SDR DVB-T2 in C++

Tutto ciò è una lotta per l'immunità al rumore del segnale codificato.

risultato

Ora possiamo vedere non solo il segnale stesso e la sua forma, ma anche le informazioni sul servizio.
Ci sono due multiplex in onda. Ciascuno ha due canali fisici (PLP).

È stata notata una stranezza nel primo multiplex: il primo PLP è etichettato "multiplo", il che è logico, poiché ce n'è più di uno nel multiplex, e il secondo PLP è etichettato "singolo" e questa è una domanda.
Ancora più interessante è la seconda stranezza nel secondo multiplex: tutti i programmi sono nel primo PLP, ma nel secondo PLP c'è un segnale di natura sconosciuta a bassa velocità. Almeno il lettore VLC, che comprende una cinquantina di formati video e la stessa quantità di audio, non lo riconosce.

Il progetto stesso può essere trovato qui.

Il progetto è stato creato con l'obiettivo di determinare la possibilità stessa di decodificare DVB-T2 utilizzando SdrPlay (e ora AirSpy.), quindi questa non è nemmeno una versione alpha.

PS Mentre scrivevo con difficoltà l'articolo, sono riuscito a integrare PlutoSDR nel progetto.

Qualcuno dirà subito che ci sono solo 6 Msps per il segnale IQ sull'uscita USB 2.0, ma servono almeno 9,2 Msps, ma questo è un argomento a parte.

Fonte: habr.com

Aggiungi un commento