Receptor SDR DVB-T2 în C++

Software Defined Radio este o metodă de înlocuire a metalurgiei (care este de fapt bună pentru sănătatea ta) cu durerea de cap a programării. SDR-urile prevăd un viitor mare și principalul avantaj este considerat a fi eliminarea restricțiilor în implementarea protocoalelor radio. Un exemplu este metoda de modulare OFDM (Orthogonal frequency-division multiplexing), care a devenit posibilă doar cu metoda SDR. Dar SDR are, de asemenea, o altă oportunitate, pur de inginerie - abilitatea de a controla și vizualiza un semnal în orice punct arbitrar cu cel mai mic efort.

Unul dintre standardele de comunicare interesante este televiziunea terestră DVB-T2.
Pentru ce? Desigur, poți pur și simplu să pornești televizorul fără să te ridici, dar nu e absolut nimic de urmărit acolo și asta nu mai este părerea mea, ci un fapt medical.

Serios, DVB-T2 este proiectat cu capabilități foarte largi, inclusiv:

  • aplicare în interior
  • modulație de la QPSK la 256QAM
  • lățime de bandă de la 1,7 MHz la 8 MHz

Am experiență în primirea televiziunii digitale folosind principiul SDR. Standardul DVB-T se află în binecunoscutul proiect GNURadio. Există un bloc gr-dvbs2rx pentru standardul DVB-T2 (totul pentru același GNURadio), dar necesită o sincronizare preliminară a semnalului și este inspirant (mulțumiri speciale lui Ron Economos).

Ce avem.

Există un standard ETSI EN 302 755 care detaliază transmisia, dar nu și recepția.

Semnalul este în aer cu o frecvență de eșantionare de 9,14285714285714285714 MHz, modulat de COFDM cu 32768 purtători, într-o bandă de 8 MHZ.

Este recomandat să primiți astfel de semnale cu frecvența de eșantionare dublă (pentru a nu pierde nimic) și la frecvența intermediară mai multă lățime de bandă (recepție superheterodină), pentru a scăpa de offset-ul de curent continuu (DC) și „scurgerea” 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 caracteristici similare este mult mai ieftin. Nu se pune problema de dublare a frecvenței de eșantionare aici și recepția se poate face doar cu conversie directă (Zero IF). Prin urmare (din motive financiare) trecem de partea adepților SDR-ului „pur” cu un minim de conversie hardware.

A fost necesar să se rezolve două probleme:

  1. Sincronizare. Aflați exact abaterea RF exactă la fază și abaterea frecvenței de eșantionare.
  2. Rescrieți standardul DVB-T2 înapoi.

A doua sarcină necesită mult mai mult cod, dar poate fi rezolvată cu perseverență și poate fi verificată cu ușurință folosind semnale de testare.

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

Soluția la prima problemă depinde în mare măsură de caracteristicile dispozitivului SDR și de capacitățile sale de control. Utilizarea funcțiilor recomandate de control al frecvenței, după cum se spune, nu a avut succes, dar a oferit multă experiență în citirea acestora. documentare, programare, vizionare seriale TV, rezolvare a întrebărilor filosofice..., pe scurt, nu s-a putut abandona proiectul.

Credința în „SDR pur” a devenit mai puternică.

Luăm semnalul așa cum este, îl interpolăm aproape la un analog și scoatem unul discret, dar similar cu cel real.

Diagrama bloc de sincronizare:

Receptor SDR DVB-T2 în C++

Totul aici este conform manualului. Următorul este puțin mai complicat. Abaterile trebuie calculate. Există o mulțime de literatură și articole de cercetare care compară avantajele și dezavantajele diferitelor metode. Dintre clasici - acesta este „Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Design optim de receptor pentru transmisie în bandă largă bazată pe OFDM – Partea I și II”. Dar nu am întâlnit un singur inginer care să poată și să dorească să numere, așa că a fost folosită o abordare inginerească. Folosind aceeași metodă de sincronizare, în semnalul de testare a fost introdus dezacordul. Comparând diferite metrici cu abateri cunoscute (el însuși le-a introdus), cele mai bune au fost selectate pentru performanță și ușurință de implementare. Abaterea frecvenței de recepție este calculată prin compararea intervalului de gardă și a părții sale repetate. Faza frecvenței de recepție și frecvența de eșantionare sunt estimate din deviația de fază a semnalelor pilot și aceasta este, de asemenea, utilizată într-un egalizator simplu, liniar al unui semnal OFDM.

Caracteristica egalizatorului:

Receptor SDR DVB-T2 în C++

Și toate acestea funcționează bine dacă știi când începe cadrul DVB-T2. Pentru a face acest lucru, simbolul de preambul P1 este transmis în semnal. Metoda de detectare și decodare a simbolului P1 este descrisă în Specificația tehnică ETSI TS 102 831 (există și multe recomandări utile pentru recepție).

Autocorelarea semnalului P1 (cel mai înalt punct de la începutul cadrului):

Receptor SDR DVB-T2 în C++

Prima imagine (mai sunt doar șase luni până la imaginea în mișcare...):

Receptor SDR DVB-T2 în C++

Și aici aflăm ce sunt dezechilibrul IQ, DC offset și LO leakage. De regulă, compensarea acestor distorsiuni specifice conversiei directe este implementată în driverul de dispozitiv SDR. Prin urmare, a durat mult pentru a înțelege: eliminarea stelelor din constelația prietenoasă QAM64 este opera funcțiilor de compensare. A trebuit să opresc totul și să-mi scriu bicicleta.

Și apoi imaginea s-a mutat:

Receptor SDR DVB-T2 în C++

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

Receptor SDR DVB-T2 în C++

Pe scurt, acesta este rezultatul trecerii cărnii tocate înapoi prin mașina de tocat carne. Standardul prevede patru tipuri de amestecare:

  • biți întrețesut
  • intercalarea celulelor (amestecarea celulelor într-un bloc de codare)
  • intercalare temporală (este și în grupul blocurilor de codificare)
  • intercalarea frecvenței (amestecarea frecvenței într-un simbol OFDM)

Ca rezultat, avem următorul semnal la intrare:

Receptor SDR DVB-T2 în C++

Toate acestea reprezintă o luptă pentru imunitatea la zgomot a semnalului codificat.

Total

Acum putem vedea nu numai semnalul în sine și forma acestuia, ci și informațiile de service.
Sunt două multiplexuri în aer. Fiecare are două canale fizice (PLP).

O ciudățenie a fost observată în primul multiplex - primul PLP este etichetat „multiplu”, ceea ce este logic, deoarece există mai mult de unul în multiplex, iar al doilea PLP este etichetat „singur” și aceasta este o întrebare.
Și mai interesantă este a doua ciudățenie din al doilea multiplex - toate programele sunt în primul PLP, dar în al doilea PLP există un semnal de natură necunoscută la o viteză mică. Cel puțin playerul VLC, care înțelege aproximativ cincizeci de formate video și aceeași cantitate de audio, nu îl recunoaște.

Proiectul în sine poate fi găsit aici.

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

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

Cineva va spune imediat că există doar 6Msps pentru semnalul IQ la ieșirea USB2.0, dar aveți nevoie de cel puțin 9,2Msps, dar acesta este un subiect separat.

Sursa: www.habr.com

Adauga un comentariu