Ricevitore SDR DVB-T2 in C++

La Radio Definita dal Software (SDR) è un metodo che sostituisce il lavoro metallico (che, in sostanza, è utile per la salute) con il mal di testa della programmazione. Si prevede un grande futuro per l'SDR, e la sua principale virtù è la rimozione delle restrizioni nella realizzazione dei protocolli radio. Un esempio è il metodo di modulazione OFDM (Orthogonal frequency-division multiplexing), che è diventato possibile solo attraverso l'SDR. Ma c'è un'altra possibilità puramente ingegneristica nell'SDR: la possibilità di controllare e visualizzare il segnale in qualsiasi punto arbitrario con il minimo sforzo.

Uno degli standard di comunicazione più interessanti è la televisione terrestre DVB-T2.
Perché? Naturalmente, si può semplicemente accendere la televisione senza alzarsi, ma non c'è assolutamente nulla da vedere lì; non è solo la mia opinione, è un fatto medico.

A essere seri, il DVB-T2 è stato sviluppato con possibilità molto ampie, tra cui:

  • utilizzo interno
  • modulazione da QPSK a 256QAM
  • larghezza di banda da 1,7MHz a 8MHz

Abbiamo esperienza nella ricezione della televisione digitale secondo il principio SDR. Lo standard DVB-T è presente nel noto progetto GNURadio. C'è un modulo gr-dvbs2rx per lo standard DVB-T2 (ancora per GNURadio), ma richiede una sincronizzazione del segnale in anticipo, ed è fonte d'ispirazione (grazie a Ron Economos).

Cosa abbiamo.

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

Il segnale in onda ha una frequenza di campionamento di 9,14285714285714285714 MHz, modulato COFDM con 32768 portanti, su una banda di 8 MHz.

Si raccomanda di ricevere tali segnali con una frequenza di campionamento raddoppiata (per non perdere nulla) e su una frequenza intermedia superiore alla larghezza di banda (ricezione supereterodina), per eliminare la deriva continua (DC) e il “passaggio” del generatore locale (LO) all'ingresso del ricevitore. I dispositivi che soddisfano queste condizioni sono troppo costosi per una mera curiosità.

SdrPlay con 10Msps 10bit o AirSpy con caratteristiche simili a un prezzo significativamente più basso. Qui non si parla di una frequenza di campionamento raddoppiata e la ricezione può avvenire solo con una conversione diretta (Zero IF). Perciò (per motivi finanziari) ci orientiamo verso i sostenitori del "pure" SDR con il minimo di conversione hardware.

Era necessario risolvere due problemi:

  1. Sincronizzazione. Determinare l'esatta deviazione della frequenza radio con precisione di fase e la deviazione della frequenza di campionamento.
  2. Riscrivere lo standard DVB-T2 al contrario.

Il secondo problema richiede molto più codice, ma è risolvibile con perseveranza e può essere facilmente verificato con segnali di prova.

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

La soluzione del primo problema dipende fortemente dalle caratteristiche del dispositivo SDR e dalle possibilità di controllo. Utilizzare le funzionalità di controllo della frequenza consigliate, a dir poco, non ha avuto successo, ma ha fornito molta esperienza nella lettura della documentazione tecnica, nella programmazione, nella visione di serie, nella risoluzione di questioni filosofiche… insomma, non è stato possibile abbandonare il progetto.

La fiducia nel "pure SDR" è solo aumentata.

Riceviamo il segnale così com'è, lo interpoliamo praticamente fino a ottenere un analogo e poi estraiamo un segnale discreto, ma simile al vero.

Diagramma di sincronizzazione:

Ricevitore SDR DVB-T2 in C++

Qui tutto segue il manuale. Poi diventa un po' più complicato. È necessario calcolare le deviazioni. Ci sono molti libri e articoli di ricerca che confrontano i pro e i contro dei diversi metodi. Tra i classici - "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission – Parts I and II". Tuttavia, non ho mai incontrato un ingegnere in grado e desideroso di fare i calcoli, quindi è stato applicato un approccio ingegneristico. Con lo stesso metodo di sincronizzazione sono state introdotte delle distorsioni nel segnale di prova. Confrontando diverse metriche con deviazioni note (che ho anch'io introdotto), sono state scelte le migliori per prestazioni e semplicità 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 sono valutate in base alle deviazioni di fase dei segnali pilota, che è utilizzata anch'essa in un semplice equalizzatore lineare per il segnale OFDM.

Caratteristiche dell'equalizzatore:

Ricevitore SDR DVB-T2 in C++

E tutto questo funziona bene se si sa quando inizia il fotogramma DVB-T2. A questo scopo, nel segnale viene trasmesso il simbolo di preambolo P1. Il metodo di rilevamento e decodifica del simbolo P1 è descritto nella Specifica Tecnica ETSI TS 102 831 (lì ci sono anche molti utili consigli per la ricezione).

Autocorrelazione del segnale P1 (il punto più alto inizia il fotogramma):

Ricevitore SDR DVB-T2 in C++

La prima immagine (mancano solo sei mesi all'immagine in movimento…):

Ricevitore SDR DVB-T2 in C++

Ed è qui che scopriamo che cos'è l'imbalance IQ, il DC offset e la fuga LO. In genere, la compensazione di queste distorsioni specifiche della conversione diretta è realizzata nel driver del dispositivo SDR. Ci è voluto molto tempo per capire che estrarre le stelle da una costellazione QAM64 è il lavoro delle funzioni di compensazione. Ho dovuto disattivare tutto e scrivere il mio 'bicicletta'.

Ecco che l'immagine ha iniziato a muoversi:

Ricevitore SDR DVB-T2 in C++

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

Ricevitore SDR DVB-T2 in C++

In breve, è il risultato di far passare la carne macinata di nuovo attraverso il tritacarne. Lo standard prevede quattro tipi di mescolamento:

  • bit interleaving (mescolamento dei bit con la rotazione delle colonne)
  • cell interleaving (mescolamento delle celle nel blocco di codifica)
  • interlacciamento nel tempo (ovvero nel gruppo di blocchi di codifica)
  • interlacciamento nella frequenza (mescolamento delle frequenze nel simbolo OFDM)

Alla fine abbiamo questo segnale in ingresso:

Ricevitore SDR DVB-T2 in C++

Tutto questo è una lotta per la robustezza del segnale codificato.

Risultato

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

Una stranezza è stata notata nel primo multiplex: il primo PLP ha l'etichetta «multiple», il che è logico, poiché non è solo nel multiplex, mentre il secondo PLP ha l'etichetta «single» e questo è un problema.
Ancora più interessante è la seconda stranezza nel secondo multiplex: tutti i programmi nel primo PLP, mentre nel secondo PLP a velocità ridotta c'è un segnale di natura sconosciuta. Almeno, il lettore VLC, che comprende circa cinquanta formati video e altrettanti audio, non lo riconosce.

Il progetto può essere trovato qui.

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

P.S. Mentre si scriveva faticosamente l'articolo, sono riuscito ad integrare nel progetto PlutoSDR.

Qualcuno dirà subito che ci sono solo 6Msps per il segnale IQ in uscita da USB2.0, mentre servirebbero almeno 9,2Msps, ma questo è già un tema a parte.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster