SDR DVB-T2 mottaker i C++

Software Defined Radio er en metode for å erstatte metallarbeid (som faktisk er bra for helsen din) med hodepine ved programmering. SDR-er spår en stor fremtid, og hovedfordelen anses å være fjerning av restriksjoner i implementeringen av radioprotokoller. Et eksempel er OFDM (Orthogonal frequency-division multiplexing) modulasjonsmetoden, som bare er muliggjort av SDR-metoden. Men SDR har også en annen, rent ingeniørmulighet - muligheten til å kontrollere og visualisere et signal på et hvilket som helst vilkårlig punkt med minst mulig innsats.

En av de interessante kommunikasjonsstandardene er bakkenett TV DVB-T2.
For hva? Selvfølgelig kan du ganske enkelt slå på TV-en uten å reise deg, men det er absolutt ingenting å se der, og dette er ikke lenger min mening, men et medisinsk faktum.

Seriøst, DVB-T2 er designet med svært brede muligheter, inkludert:

  • innendørs applikasjon
  • modulasjon fra QPSK til 256QAM
  • båndbredde fra 1,7MHz til 8MHz

Jeg har erfaring med å motta digital-TV ved bruk av SDR-prinsippet. DVB-T-standarden er i det velkjente GNURadio-prosjektet. Det er en gr-dvbs2rx-blokk for DVB-T2-standarden (alle for samme GNURadio), men den krever foreløpig signalsynkronisering og den er inspirerende (spesiell takk til Ron Economos).

Hva vi har.

Det er en ETSI EN 302 755-standard som beskriver overføring, men ikke mottak.

Signalet er på luft med en samplingsfrekvens på 9,14285714285714285714 MHz, modulert av COFDM med 32768 bærebølger, i et bånd på 8 MHz.

Det anbefales å motta slike signaler med dobbel samplingsfrekvens (for ikke å miste noe) og ved mellomfrekvensen mer båndbredde (superheterodynmottak), for å bli kvitt likestrøm (DC) offset og "lekkasje" av lokaloscillatoren (LO) til mottakerinngangen. Enheter som tilfredsstiller disse betingelsene er for dyre for ren nysgjerrighet.

SdrPlay med 10Msps 10bit eller AirSpy med lignende egenskaper er mye billigere. Det er ikke snakk om dobbel samplingsfrekvens her og mottak kan kun gjøres med direkte konvertering (Zero IF). Derfor (av økonomiske årsaker) bytter vi til siden av tilhengerne av "ren" SDR med et minimum av maskinvarekonvertering.

Det var nødvendig å løse to problemer:

  1. Synkronisering. Finn ut det nøyaktige fasenøyaktige RF-avviket og samplingsfrekvensavviket.
  2. Omskriv DVB-T2-standarden bakover.

Den andre oppgaven krever mye mer kode, men kan løses med utholdenhet og kan enkelt verifiseres ved hjelp av testsignaler.

Testsignaler er tilgjengelige på BBC-serveren ftp://ftp.kw.bbc.co.uk/t2refs/ med detaljerte instruksjoner.

Løsningen på det første problemet er svært avhengig av egenskapene til SDR-enheten og dens kontrollfunksjoner. Å bruke de anbefalte frekvenskontrollfunksjonene, som de sier, var ikke vellykket, men ga mye erfaring med å lese disse. dokumentasjon, programmering, se TV-serier, løse filosofiske spørsmål..., kort sagt, det var ikke mulig å forlate prosjektet.

Troen på "ren SDR" har bare blitt sterkere.

Vi tar signalet som det er, interpolerer det nesten til en analog og tar ut et diskret, men likt det virkelige.

Synkroniseringsblokkdiagram:

SDR DVB-T2 mottaker i C++

Alt her er i henhold til læreboka. Neste er litt mer komplisert. Avvik må beregnes. Det finnes mye litteratur og forskningsartikler som sammenligner fordeler og ulemper ved ulike metoder. Fra klassikerne - dette er "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission - Part I and II." Men jeg har ikke møtt en eneste ingeniør som kan og vil telle, så en ingeniørtilnærming ble brukt. Ved å bruke samme synkroniseringsmetode ble avstemming introdusert i testsignalet. Ved å sammenligne ulike beregninger med kjente avvik (han introduserte dem selv), ble de beste valgt for ytelse og enkel implementering. Mottaksfrekvensavviket beregnes ved å sammenligne vaktintervallet og dets repeterende del. Fasen til mottaksfrekvensen og samplingsfrekvensen estimeres fra faseavviket til pilotsignalene og dette brukes også i en enkel, lineær utjevner av et OFDM-signal.

Equalizer-karakteristikk:

SDR DVB-T2 mottaker i C++

Og alt dette fungerer bra hvis du vet når DVB-T2-rammen starter. For å gjøre dette sendes ingresssymbolet P1 i signalet. Metoden for å oppdage og dekode P1-symbolet er beskrevet i teknisk spesifikasjon ETSI TS 102 831 (det er også mange nyttige anbefalinger for mottak).

Autokorrelasjon av P1-signalet (det høyeste punktet på begynnelsen av bildet):

SDR DVB-T2 mottaker i C++

Første bilde (bare seks måneder igjen til det bevegelige bildet...):

SDR DVB-T2 mottaker i C++

Og det er her vi lærer hva IQ-ubalanse, DC-offset og LO-lekkasje er. Som regel er kompensasjon for disse forvrengningene spesifikke for direkte konvertering implementert i SDR-enhetsdriveren. Derfor tok det lang tid å forstå: Å slå ut stjerner fra den vennlige QAM64-konstellasjonen er kompensasjonsfunksjonenes arbeid. Jeg måtte skru av alt og skrive sykkelen min.

Og så beveget bildet seg:

SDR DVB-T2 mottaker i C++

QAM64-modulasjon med spesifikk konstellasjonsrotasjon i DVB-T2-standarden:

SDR DVB-T2 mottaker i C++

Kort fortalt er dette resultatet av å føre kjøttdeigen tilbake gjennom kjøttkvernen. Standarden gir fire typer blanding:

  • litt interleaving
  • celleinterleaving (blanding av celler i en kodeblokk)
  • tidsinterleaving (det er også i gruppen av kodingsblokker)
  • frekvensinterleaving (frekvensblanding i et OFDM-symbol)

Som et resultat har vi følgende signal ved inngangen:

SDR DVB-T2 mottaker i C++

Alt dette er en kamp for støyimmunitet til det kodede signalet.

Total

Nå kan vi ikke bare se selve signalet og dets form, men også serviceinformasjon.
Det er to multiplekser i luften. Hver har to fysiske kanaler (PLP).

En merkelighet ble lagt merke til i den første multipleksen - den første PLP er merket "multiple", som er logisk, siden det er mer enn én i multipleksen, og den andre PLP er merket "single", og dette er et spørsmål.
Enda mer interessant er den andre rariteten i den andre multipleksen - alle programmene er i den første PLP, men i den andre PLP er det et signal av ukjent karakter ved lav hastighet. VLC-spilleren, som forstår rundt femti videoformater og like mye lyd, gjenkjenner den i hvert fall ikke.

Selve prosjektet finner du her.

Prosjektet ble opprettet med mål om å bestemme selve muligheten for å dekode DVB-T2 ved hjelp av SdrPlay (og nå AirSpy.), så dette er ikke engang en alfaversjon.

PS Mens jeg skrev artikkelen med vanskeligheter, klarte jeg å integrere PlutoSDR i prosjektet.

Noen vil umiddelbart si at det bare er 6Msps for IQ-signalet ved USB2.0-utgangen, men du trenger minst 9,2Msps, men dette er et eget emne.

Kilde: www.habr.com

Legg til en kommentar