SDR DVB-T2-mottagare i C++

Software Defined Radio är en metod för att ersätta metallarbete (som faktiskt är bra för din hälsa) med huvudvärk av programmering. SDR förutspår en stor framtid och den största fördelen anses vara borttagandet av restriktioner i implementeringen av radioprotokoll. Ett exempel är OFDM (Orthogonal frequency-division multiplexing) moduleringsmetoden, som är möjlig endast genom SDR-metoden. Men SDR har också ytterligare en, rent teknisk möjlighet - förmågan att kontrollera och visualisera en signal vid vilken godtycklig punkt som helst med minsta ansträngning.

En av de intressanta kommunikationsstandarderna är marksänd marksänd TV DVB-T2.
För vad? Naturligtvis kan du helt enkelt slå på TV:n utan att gå upp, men det finns absolut inget att titta på där och detta är inte längre min åsikt, utan ett medicinskt faktum.

Allvarligt talat, DVB-T2 är designad med mycket breda funktioner, inklusive:

  • inomhusapplikation
  • modulering från QPSK till 256QAM
  • bandbredd från 1,7MHz till 8MHz

Jag har erfarenhet av att ta emot digital-tv enligt SDR-principen. DVB-T-standarden finns i det välkända GNURadio-projektet. Det finns ett gr-dvbs2rx-block för DVB-T2-standarden (alla för samma GNURadio), men det kräver preliminär signalsynkronisering och det är inspirerande (särskilt tack till Ron Economos).

Det vi har.

Det finns en ETSI EN 302 755-standard som beskriver överföring, men inte mottagning.

Signalen är i luften med en samplingsfrekvens på 9,14285714285714285714 MHz, modulerad av COFDM med 32768 bärvågor, i ett band på 8 MHz.

Det rekommenderas att ta emot sådana signaler med dubbla samplingsfrekvensen (för att inte förlora något) och vid mellanfrekvensen mer bandbredd (superheterodynmottagning), för att bli av med likströmsförskjutning (DC) och "läckage" från lokaloscillatorn (LO) till mottagarens ingång. Enheter som uppfyller dessa villkor är för dyra för ren nyfikenhet.

SdrPlay med 10Msps 10bit eller AirSpy med liknande egenskaper är mycket billigare. Det är inte fråga om dubbla samplingsfrekvensen här och mottagning kan endast ske med direktkonvertering (Noll IF). Därför (av ekonomiska skäl) byter vi till sidan av anhängarna av "ren" SDR med ett minimum av hårdvarukonvertering.

Det var nödvändigt att lösa två problem:

  1. Synkronisering. Ta reda på den exakta fasnoggranna RF-avvikelsen och samplingsfrekvensavvikelsen.
  2. Skriv om DVB-T2-standarden bakåt.

Den andra uppgiften kräver mycket mer kod, men kan lösas med uthållighet och kan enkelt verifieras med hjälp av testsignaler.

Testsignaler finns tillgängliga på BBC-servern ftp://ftp.kw.bbc.co.uk/t2refs/ med detaljerade instruktioner.

Lösningen på det första problemet är i hög grad beroende av egenskaperna hos SDR-enheten och dess kontrollmöjligheter. Att använda de rekommenderade frekvenskontrollfunktionerna, som de säger, var inte framgångsrikt, men gav mycket erfarenhet av att läsa dessa. dokumentation, programmering, se på tv-serier, lösa filosofiska frågor..., kort sagt, det gick inte att överge projektet.

Tron på "rena SDR" har bara blivit starkare.

Vi tar signalen som den är, interpolerar den nästan till en analog och tar ut en diskret, men liknar den verkliga.

Synkroniseringsblockdiagram:

SDR DVB-T2-mottagare i C++

Allt här är enligt läroboken. Nästa är lite mer komplicerat. Avvikelser måste beräknas. Det finns mycket litteratur och forskningsartiklar som jämför för- och nackdelar med olika metoder. Från klassikerna - det här är "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission - Part I and II." Men jag har inte träffat en enda ingenjör som kan och vill räkna, så ett ingenjörsgrepp användes. Med samma synkroniseringsmetod infördes avstämning i testsignalen. Genom att jämföra olika mått med kända avvikelser (han introducerade dem själv) valdes de bästa ut för prestanda och enkel implementering. Mottagningsfrekvensavvikelsen beräknas genom att jämföra skyddsintervallet och dess repeterande del. Fasen för mottagningsfrekvensen och samplingsfrekvensen uppskattas från pilotsignalernas fasavvikelse och detta används också i en enkel, linjär utjämnare av en OFDM-signal.

Equalizer-egenskaper:

SDR DVB-T2-mottagare i C++

Och allt detta fungerar bra om du vet när DVB-T2-ramen startar. För att göra detta sänds inledningssymbolen P1 i signalen. Metoden för att detektera och avkoda P1-symbolen beskrivs i teknisk specifikation ETSI TS 102 831 (det finns också många användbara rekommendationer för mottagning).

Autokorrelation av P1-signalen (den högsta punkten i början av bilden):

SDR DVB-T2-mottagare i C++

Första bilden (bara sex månader kvar till den rörliga bilden...):

SDR DVB-T2-mottagare i C++

Och det är här vi lär oss vad IQ-obalans, DC-offset och LO-läckage är. Som regel implementeras kompensation för dessa förvrängningar som är specifika för direktkonvertering i SDR-enhetsdrivrutinen. Därför tog det lång tid att förstå: att slå ut stjärnor från den vänliga QAM64-konstellationen är kompensationsfunktionernas arbete. Jag var tvungen att stänga av allt och skriva min cykel.

Och så flyttade bilden:

SDR DVB-T2-mottagare i C++

QAM64-modulering med specifik konstellationsrotation i DVB-T2-standarden:

SDR DVB-T2-mottagare i C++

Kort sagt är detta resultatet av att köttfärsen förs tillbaka genom köttkvarnen. Standarden ger fyra typer av blandning:

  • lite interfoliering
  • cellinterleaving (blandning av celler i ett kodningsblock)
  • tidsinterleaving (den är också i gruppen av kodningsblock)
  • frekvensinterleaving (frekvensblandning i en OFDM-symbol)

Som ett resultat har vi följande signal vid ingången:

SDR DVB-T2-mottagare i C++

Allt detta är en kamp för brusimmunitet hos den kodade signalen.

Totalt

Nu kan vi se inte bara själva signalen och dess form, utan även serviceinformation.
Det finns två multiplexer på luft. Var och en har två fysiska kanaler (PLP).

En märklighet märktes i den första multiplexen - den första PLP är märkt "multipel", vilket är logiskt, eftersom det finns mer än en i multiplexet, och den andra PLP är märkt "singel" och detta är en fråga.
Ännu mer intressant är den andra märkligheten i den andra multiplexen - alla program finns i den första PLP, men i den andra PLP finns en signal av okänd karaktär vid låg hastighet. Åtminstone känner inte VLC-spelaren, som förstår ett femtiotal videoformat och lika mycket ljud, igen det.

Själva projektet hittar du här.

Projektet skapades med målet att bestämma själva möjligheten att avkoda DVB-T2 med SdrPlay (och nu AirSpy.), så detta är inte ens en alfaversion.

PS Medan jag skrev artikeln med svårighet lyckades jag integrera PlutoSDR i projektet.

Någon kommer genast att säga att det bara finns 6Msps för IQ-signalen vid USB2.0-utgången, men du behöver minst 9,2Msps, men det här är ett separat ämne.

Källa: will.com

Lägg en kommentar