Receiver SDR DVB-T2 pe C++

Radio Definita de Software (radio definit prin software) este o metodă de înlocuire a lucrului cu metalul (ceea ce este, în esență, benefic pentru sănătate) cu dureri de cap de programare. SDR-ului i se prezice un viitor strălucit, iar principalul său avantaj este eliminarea restricțiilor în implementarea protocoalelor radio. Un exemplu este metoda de modulare OFDM (multiplexare prin diviziune ortogonală a frecvenței), care a devenit posibilă doar prin metoda SDR. Dar SDR mai oferă o altă capacitate pur inginerescă — de a controla și vizualiza semnalul în orice punct arbitrar cu cele mai mici eforturi.

Unul dintre standardele de comunicație interesante este televiziunea terestră DVB-T2.
De ce? Desigur, poți pur și simplu să aprinzi televizorul fără a te ridica, dar nu este absolut nimic de vizionat și aceasta nu este doar părerea mea, ci un fapt medical.

Serios acum, DVB-T2 a fost dezvoltat cu capacități foarte largi, inclusiv:

  • aplicații în interior
  • modularea de la QPSK la 256QAM
  • lățimea de bandă de la 1,7MHz la 8MHz

Există experiență în recepția televiziunii digitale prin principiul SDR. Standardul DVB-T există în cunoscutul proiect GNURadio. Există blocul gr-dvbs2rx pentru standardul DVB-T2 (tot în GNURadio), dar care necesită sincronizare prealabilă a semnalului și este inspirator (mulțumiri separate lui Ron Economos).

Ce avem.

Există standardul ETSI EN 302 755, care descrie în detaliu transmisia, dar nu recepția.

Semnalul în eter cu o frecvență de eșantionare de 9,14285714285714285714 MHz, modulat COFDM cu 32768 purtători, în banda de 8 MHZ.

Este recomandat să recepționezi astfel de semnale cu o frecvență de eșantionare dublată (pentru a nu pierde nimic) și la o frecvență intermediară mai mare decât lățimea de bandă (recepție superheterodinică), pentru a scăpa de deviația de curent continuu (DC) și de „trecerea” oscilatorului local (LO) la intrarea receptorului. Dispozitivele care îndeplinesc aceste condiții sunt prea scumpe pentru simpla curiozitate.

SdrPlay cu 10Msps 10bit sau AirSpy cu specificații similare sunt cu mult mai ieftine. Aici nu este vorba despre o frecvență de eșantionare dublată și recepția poate fi realizată doar cu o conversie directă (Zero IF). Așadar, (din motive financiare) trecem de partea adepților SDR-ului „curat” cu un minim de conversie hardware.

A fost necesar să rezolvăm două probleme:

  1. Sincronizare. A afla deviația exactă a frecvenței radio cu precizie până la fază și deviația frecvenței de eșantionare.
  2. Rescrie standardul DVB-T2 în ordine inversă.

A doua sarcină necesită mult mai mult cod, dar este realizabilă prin perseverență și poate fi verificată ușor prin semnale de test.

Semnalele de test sunt disponibile pe serverul BBC ftp://ftp.kw.bbc.co.uk/t2refs/ cu instrucțiuni detaliate.

Soluția primei sarcini depinde foarte mult de caracteristicile dispozitivului SDR și de capabilitățile de control. Utilizarea funcțiilor recomandate de control al frecvenței, așa cum se spune, nu a dat rezultate, dar a oferit multă experiență în citirea documentației tehnice, programare, vizionarea serialelor, rezolvarea întrebărilor filosofice... în concluzie, nu am reușit să abandonez proiectul.

Credința în „pure SDR” s-a întărit doar.

Am primit semnalul așa cum este, l-am interpolat practic până la un analog și am extras deja un semnal discret, dar similar cu cel real.

Schema de sincronizare:

Receiver SDR DVB-T2 pe C++

Aici totul este conform manualului. Apoi devine un pic mai complicat. Este necesar să se calculeze deviațiile. Există multe literaturi și articole de cercetare care compară avantajele și dezavantajele diferitelor metode. Din clasică - este „Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission – Partea I și II”. Numai că nu am întâlnit niciun inginer care să fie capabil și dornic să calculeze, așa că s-a aplicat o abordare inginerescă. Prin aceeași metodă de sincronizare au fost introduce deranjamente în semnalul de test. Prin compararea diferitelor metrici cu deviații cunoscute (le-am introdus chiar eu), au fost selectate cele mai bune pentru performanță și simplitate de implementare. Deviația frecvenței de primire este calculată prin compararea intervalului de protecție și a părții sale repetitive. Faza frecvenței de primire și frecvența de eșantionare sunt evaluate pe baza deviației fazelor semnalelor pilot și aceeași este utilizată într-un egalizator linear simplu pentru semnalul OFDM.

Caracteristica egalizatorului:

Receiver SDR DVB-T2 pe C++

Și toate acestea funcționează bine dacă știi când începe cadru DVB-T2. Pentru aceasta, în semnal se transmite simbolul de preambul P1. Metoda de detectare și decodificare a simbolului P1 este descrisă în Specificația Tehnică ETSI TS 102 831 (de asemenea, sunt multe recomandări utile pentru recepție).

Autocorelația semnalului P1 (cel mai înalt punct la începutul cadrului):

Receiver SDR DVB-T2 pe C++

Prima imagine (au mai rămas doar șase luni până la imaginile în mișcare...):

Receiver SDR DVB-T2 pe C++

Și aici aflăm ce este un dezechilibru IQ, offset DC și scurgerea LO. De obicei, compensația acestor distorsiuni specifice conversiei directe este implementată în driverul dispozitivului SDR. Așa că a durat mult timp să înțelegem: obținerea stelelor din constelația familiară QAM64 este munca funcțiilor de compensație. A trebuit să dezactivez totul și să scriu bicicleta mea.

Și iată că imaginea a început să se miște:

Receiver SDR DVB-T2 pe C++

Modulația QAM64 cu o rotație specifică a constelației în standardul DVB-T2:

Receiver SDR DVB-T2 pe C++

Pe scurt, aceasta este rezultatul trecerii cărnii prin mașina de tocat din nou. Standardul prevede patru tipuri de amestecare:

  • bit interleaving (amestecare a biților cu învârtirea coloanelor)
  • cell interleaving (amestecare a celulelor în blocul de codare)
  • time interleaving (de asemenea, în grupul de blocuri de codare)
  • frequency interleaving (amestecare a frecvențelor în simbolul OFDM)

În final, la intrare avem următorul semnal:

Receiver SDR DVB-T2 pe C++

Toate acestea sunt o luptă pentru rezistența semnalului codificat la interferențe.

Rezultatul

Acum putem vedea nu doar semnalul propriu-zis și forma lui, dar și informațiile auxiliare.
Pe eter sunt două multiplexuri. Fiecare are două canale fizice (PLP).

O ciudățenie a fost observată în primul multiplex - primul PLP are eticheta „multiple”, ceea ce este logic, deoarece nu este singur în multiplex, iar al doilea PLP are eticheta „single” și aceasta este o problemă.
Mai interesant este al doilea paradox în al doilea multiplex - toate programele sunt în primul PLP, iar în al doilea PLP, la o viteză mică, există un semnal de natură necunoscută. Cel puțin, playerul VLC, care înțelege aproximativ o jumătate de sută de formate video și tot atâtea audio, nu-l recunoaște.

Proiectul poate fi găsit aici.

Proiectul a fost creat cu scopul de a determina posibiltatea de a decoda DVB-T2 folosind SdrPlay (iar acum și AirSpy), deci aceasta nu este nici măcar o versiune alfa.

P.S. În timp ce scriam cu dificultate articolul, am reușit să integrez PlutoSDR în proiect.

Unii vor spune imediat că are doar 6Msps pentru semnalul IQ la ieșirea USB2.0, iar este necesar cel puțin 9,2Msps, dar aceasta este deja o temă separată.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster