Ricevitore SDR DVB-T2 in C++

La radio definita dal software (Software Defined Radio) è un metodo che sostituisce il lavoro metallico (che, in effetti, è utile per la salute) con il mal di testa della programmazione. Si prevede un grande futuro per la SDR e la principale caratteristica è la rimozione delle restrizioni nella realizzazione dei protocolli radio. Un esempio è il metodo di modulazione OFDM (Orthogonal frequency-division multiplexing), reso possibile solo tramite la SDR. Ma c'è anche un'altra possibilità puramente ingegneristica nella SDR, che è quella di controllare e visualizzare il segnale in qualsiasi punto arbitrario con il minimo sforzo.

Uno degli standard di comunicazione interessanti è la televisione terrestre DVB-T2.
Perché? Certo, si può semplicemente accendere la TV senza alzarsi, ma non c'è assolutamente nulla da vedere e questo non è solo la mia opinione, ma un fatto medico.

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

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

C'è esperienza nel ricevere la televisione digitale tramite il principio SDR. Lo standard DVB-T è presente nel noto progetto GNURadio. C'è un blocco gr-dvbs2rx per lo standard DVB-T2 (tutto per lo stesso GNURadio), ma richiede una sincronizzazione preliminare del segnale e questo è stimolante (un particolare ringraziamento a Ron Economos).

Cosa abbiamo.

C'è lo standard ETSI EN 302 755, che descrive in dettaglio la trasmissione, ma non la ricezione.

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

È consigliabile ricevere tali segnali con una frequenza di campionamento raddoppiata (per non perdere nulla) e a una frequenza intermedia superiore alla larghezza di banda (ricezione supereterodina), per liberarsi dalla deriva in continua (DC) e dalla "permeabilità" del generatore locale (LO) all'ingresso del ricevitore. I dispositivi che soddisfano queste condizioni sono troppo costosi per una semplice curiosità.

SdrPlay con 10Msps 10bit o AirSpy con caratteristiche simili sono di gran lunga più economici. Qui non si parla di frequenza di campionamento raddoppiata e la ricezione può avvenire solo con la trasformazione diretta (Zero IF). Pertanto (per motivi finanziari) ci spostiamo verso il lato degli adepti della SDR "pura" con il minimo di conversione hardware.

Era necessario risolvere due compiti:

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

Il secondo compito richiede molto più codice, ma è risolvibile con pazienza e si verifica facilmente attraverso i segnali di test.

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

La soluzione del primo compito dipende fortemente dalle caratteristiche del dispositivo SDR e dalle capacità di controllo. Utilizzare le funzioni di controllo della frequenza raccomandate, come si dice, non ha avuto successo, ma ha fornito molta esperienza nella lettura della documentazione tecnica, nella programmazione, nella visione di serie, nella soluzione di questioni filosofiche…, in altre parole, non è stata possibile abbandonare il progetto.

La fiducia nel "pure SDR" è solo aumentata.

Riceviamo il segnale così com'è, lo interpoliamo praticamente fino all'analogo e poi estraiamo già il campione discreto, ma simile al reale.

Schema di sincronizzazione:

Ricevitore SDR DVB-T2 in C++

Qui tutto è secondo il manuale. Proseguendo è un po' più complesso. È necessario calcolare le deviazioni. Ci sono molte letture e articoli di ricerca che confrontano i pregi e i difetti di diversi metodi. Dalla classica — "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission – Part I and II". Solo che non ho mai incontrato un ingegnere capace e desideroso di fare calcoli, quindi è stato adottato un approccio ingegneristico. Con lo stesso metodo di sincronizzazione sono stati introdotti disturbi nel segnale di test. Confrontando diverse metriche con deviazioni note (le ho introdotte io stesso) sono state scelte le migliori per prestazioni e semplicità di attuazione. La deviazione della frequenza di ricezione è calcolata confrontando l'intervallo di guardia e la sua parte ripetitiva. La fase della frequenza di ricezione e la frequenza di campionamento sono stimate in base alla deviazione delle fasi dei segnali pilota, e questa stessa viene utilizzata in un semplice equalizzatore lineare del segnale OFDM.

Caratteristica dell'equalizzatore:

Ricevitore SDR DVB-T2 in C++

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

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

Ricevitore SDR DVB-T2 in C++

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

Ricevitore SDR DVB-T2 in C++

È proprio qui che scopriamo cos'è il bilanciamento dell'IQ, l'offset DC e la fuga del LO. Di norma, la compensazione di queste distorsioni specifiche della conversione diretta è realizzata nel driver del dispositivo SDR. Pertanto, ci è voluto molto tempo per capire che estrarre le stelline dalla costellazione QAM64 è il lavoro delle funzioni di compensazione. È stato necessario disattivare tutto e scrivere il nostro algoritmo.

Ecco che l'immagine ha cominciato a muoversi:

Ricevitore SDR DVB-T2 in C++

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

Ricevitore SDR DVB-T2 in C++

In breve, si tratta del risultato di far passare il ripieno di nuovo attraverso il macinacarne. Lo standard prevede quattro tipi di mescolamento:

  • bit interleaving (mescolamento dei bit con arrotolamento delle colonne)
  • cell interleaving (mescolamento delle celle nel blocco di codifica)
  • time interleaving (anch'esso nel gruppo di blocchi di codifica)
  • frequency interleaving (mescolamento delle frequenze nel simbolo OFDM)

Alla fine, all'ingresso abbiamo un segnale di questo tipo:

Ricevitore SDR DVB-T2 in C++

Tutta questa è una lotta per la resistenza alle interferenze del segnale codificato.

Risultato

Ora possiamo vedere non solo il segnale stesso e la sua forma, ma anche le informazioni di servizio.
In onda ci sono due multiplex. Ognuno ha 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 è problematico.
Ancora più interessante è la seconda stranezza nel secondo multiplex: tutti i programmi sono nel primo PLP, mentre nel secondo PLP a bassa velocità è presente 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 lo scopo di determinare la possibilità di decodificare DVB-T2 utilizzando SdrPlay (e ora anche AirSpy), quindi questo è anche un alfabeto di versione.

P.S. Mentre l'articolo veniva redatto con difficoltà, sono riuscito a integrare nel progetto PlutoSDR.

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

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