Självstudie: Förstå virtuell RF (vRF) genom demodulering av Aqua med GNU Radio

I Självstudie: Nedlänksdata från en offentlig satellit är data från NASA:s Aqua-satellit nedlänkade med hjälp av ett hanterat modem, vilket innebär att den råa RF-signalen som tas emot från Aqua-satelliten av markstationen skickas via ett modem som hanteras av Azure Orbital. Utdata från det här modemet, som är i form av byte, strömmas sedan till användarens virtuella dator. Som en del av steget Konfigurera en kontaktprofil för ett offentligt satellitnedlänksuppdrag var demoduleringskonfigurationen inställd på Aqua Direct Broadcast, vilket är det som aktiverade och konfigurerade det hanterade modemet för att demodulera/avkoda RF-signalen som togs emot från Aqua. Med vRF-konceptet används inget hanterat modem och i stället skickas den råa RF-signalen till användarens virtuella dator för bearbetning. Det här konceptet kan gälla både nedlänken och överordnad länk, men i den här självstudien undersöker vi nedlänksprocessen. Vi skapar en vRF, baserad på GNU Radio, som bearbetar den råa RF-signalen och fungerar som modem.

I den här guiden får du lära du dig att:

  • Förstå begränsningarna och kompromisserna med att använda vRF.
  • Konfigurera en kontaktprofil via vRF i stället för ett hanterat modem.
  • Bearbeta nedlänkade data från Aqua (i form av rå RF) med GNU Radio som modem, med hjälp av både en offline-/utvecklingskonfiguration och en realtidskonfiguration.

Förutsättningar

Förstå begränsningarna och kompromisserna med att använda vRF

Innan vi går in på självstudien är det viktigt att förstå hur vRF fungerar och hur det kan jämföras med att använda ett hanterat modem. Med ett hanterat modem sker hela det fysiska lagret (PHY) i Azure Orbital, vilket innebär att RF-signalen omedelbart bearbetas inom Azure Orbitals resurser och användaren får bara de informationsbyte som produceras av modemet. Genom att välja vRF finns det inget hanterat modem och den råa RF-signalen strömmas till användaren från markstationens digitaliserare. Med den här metoden kan användaren köra sitt eget modem eller avbilda RF-signalen för senare bearbetning.

Fördelarna med vRF är möjligheten att använda modem som Azure Orbital inte stöder eller har åtkomst till. vRF tillåter också att samma RF-signal körs via ett modem samtidigt som olika parametrar används för att optimera prestanda. Den här metoden kan användas för att minska antalet satellitpass som behövs under testningen och påskynda utvecklingen. På grund av typen av råa RF-signaler är paket-/filstorleken vanligtvis större än byteen som ingår i den RF-signalen. vanligtvis mellan 2-10x större. Mer data innebär att nätverkets dataflöde mellan den virtuella datorn och Azure Orbital potentiellt kan vara en begränsande faktor för vRF.

I den här självstudien får du lära dig hur vRF fungerar. I slutet av den här självstudien innehåller vi flera RF- och digitaliserarspecifika uppgifter som är av intresse för en vRF-användare.

DIFI:s roll i vRF

Azure Orbitals markstationer består av digitaliserare som använder DIFI för att skicka och ta emot digitaliserade RF-signaler. DIFI-paketprotokollet, som tekniskt kallas "IEEE-ISTO Std 4900-2021: Digital IF Interoperability Standard", definierar ett dataplansgränssnitt som är avsett för att överföra och ta emot digitaliserade IF-data (till exempel IQ-exempel) och motsvarande metadata över standard-IP-nätverk. Även om DIFI är en "IF"-standard kan IQ-exempel på baseband också strömmas med DIFI, som med Azure Orbital. Det primära användningsfallet för DIFI-paket är att skapa ett gränssnitt mellan satellit-markstationss digitaliserare (transceivers) och programvarumodem, vilket möjliggör samverkan och bekämpar leverantörslåsning som plågar satellitindustrin.

DIFI-paketprotokollet innehåller två primära meddelandetyper: datapaket och kontextpaket. På grund av äldre maskinvaruskäl finns det två olika versioner av kontextpaket. Azure Orbitals markstationer använder uppdaterade (DIFI v1.1) kontextpaket för X-Band-signaler och det äldre formatet för S-Band-signaler. Om du använder gnu-radiopaketet gr-difi vill du se till att välja formatet 108 byte för X-Band och 72-bytesformatet för S-band. För icke-GNU Radio vRFs måste du se till att rätt version av DIFI används för kontextpaket, v1.1 finns här och den äldre versionen kan härledas från det här kodavsnittet. Fler överväganden ingår i vRF i AOGS-referensen i slutet av den här självstudien.

Steg 1: Använd AOGS för att schemalägga en kontakt och samla in Aqua-data

Först tar vi bort det hanterade modemet och samlar in rf-rådata i en pcap-fil. Kör stegen som anges i Självstudie: Nedlänka data från NASA:s offentliga Aqua-satellit, men under steget Konfigurera en kontaktprofil för ett Aqua-nedlänksuppdrag lämnar du demoduleringskonfigurationen tom och väljer UDP för protokoll. Slutligen kör du mot slutet i stället för socat kommandot (som samlar in TCP-paket) sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap för att samla in UDP-paketen till en pcap-fil.

Kommentar

Följande tre ändringar krävs i Självstudie: Nedlänkade data från NASA:s offentliga Aqua-satellit:

  • Demoduleringskonfiguration: lämna tomt
  • Protokoll: välj UDP
  • Steg 8 och 9: Använd i stället kommandot sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap

Efter ett satellitpass bör du ha en fil /tmp/aqua.pcap med storleken 10–20 GB (beroende på den maximala höjningen). Den här filen innehåller DIFI-paket som innehåller den råa RF-signal som tas emot av markstationen, i form av IQ-exempel.

Steg 2: Extrahera IQ-exemplen från DIFI-paketen

Sedan extraherar vi IQ-exemplen och sparar dem i ett mer traditionellt format. en binär IQ-fil. Följande steg kan utföras på valfri virtuell dator/dator som har en kopia av filen aqua.pcap som du skapade. De här stegen omfattar att använda ett kort Python-skript som underhålls av DIFI Consortium för att extrahera IQ-exemplen från UDP DIFI-paketen till en IQ-fil.

  1. Ladda ned eller kopiera följande kod till ett nytt Python-skript.
  2. Redigera filename för att matcha var du än sparade din pcap (/tmp/aqua.pcap).
  3. Kör Python-skriptet med och python3 difi_to_binary_iq.pyskapa en ny fil i samma katalog som din pcap med ett .cs8 tillägg. Den här filen är den binära IQ-filen som innehåller de digitaliserade RF-exemplen som 8-bitars heltal och inget annat. Skriptet tar lite tid att köra och när det körs blir filen större. När skriptet är klart är filen ungefär lika stor som pcap-filen. Du kan stoppa skriptet innan det är klart (med control-C) och fortsätta självstudien. hela varaktigheten för kontakten är inte nödvändig för resten av självstudien.
  4. (Valfritt) Om du vill visualisera signalen installerar du Inspectrum med och https://github.com/miek/inspectrum/wiki/Build#building-on-debian-based-distros kör sedan Inspectrum med ( inspectrum /tmp/aqua.pcap.cs8 med sökvägen till den nya .cs8 filen). En gång i Inspectrum GUI kan du justera Power Max och Power Min se signalens fullständiga dynamiska omfång.

Om du också vill ha IQ-exempel i float32-format i stället för int8 (vissa program låter dig bara läsa in float32-format) kan du använda följande Python-kodfragment:

import numpy as np
samples = np.fromfile('/tmp/aqua.pcap.cs8', np.int8) / 127.0
samples = samples.astype(np.float32)
samples.tofile('/tmp/aqua.pcap.cf32')

Vi använder float32-versionen för nästa steg, eftersom det förenklar GNU Radio-flödesgrafen.

Steg 3: Demodulera aquasignalen i GNU Radio

Sedan skapar vi det faktiska vRF-modemet, baserat på GNU Radio, som används för att demodulera Aqua-signalen.

Logo for GNU Radio Free Software Project.

GNU Radio är ett kostnadsfritt programutvecklingsverktyg med öppen källkod som tillhandahåller signalbearbetningsblock och många exempel på DSP-program (Digital Signal Processing). Den kan användas med lättillgänglig rf-maskinvara till låg kostnad för att skapa programvarudefinierade radioapparater eller utan maskinvara i en simuleringsliknande miljö. GNU Radio används ofta i forsknings-, industri-, akademi-, myndighets- och hobbymiljöer för att stödja både trådlös kommunikationsforskning och verkliga radiosystem. I den här självstudien använder vi GNU Radio för att demodulera Aqua (dvs. GNU Radio fungerar som modem).

Även om GNU Radio kan användas i huvudlöst läge använder vi i den här självstudien GNU Radios GUI (dvs. skrivbordsgränssnitt), så du måste kopiera /tmp/aqua.pcap.cf32 till en virtuell dator med X11-vidarebefordran eller dator med Ubuntu 20/22 desktop. Kommandot scp kan användas för att kopiera filen från en virtuell dator på Azure till en lokal utvecklingsdator.

Installera GNU Radio

Om du använder Ubuntu 22 kör du sudo apt-get install gnuradio. Om du i stället använder Ubuntu 20 använder du följande kommandon för att installera GNU Radio:

sudo add-apt-repository ppa:gnuradio/gnuradio-releases
sudo apt-get update
sudo apt-get install gnuradio python3-packaging

Kontrollera att GNU Radio har installerats korrekt och att grafiken fungerar med gnuradio-companion. Ett fönster bör visas som ser ut så här:

Screenshot of the GNU Radio desktop GUI.

Om blockträdet till höger inte visas kan du visa det med förstoringsglasikonen längst upp till höger.

Kör Aqua-flödesgrafen

Ett GNU Radio-program kallas för en "flödesgraf", och det bearbetar eller genererar vanligtvis en RF-signal. Startflödesgrafen som ska användas kan laddas ned här. Öppna den här .grc filen i GNU Radio så bör du se följande flödesgraf:

Screenshot of the GNU Radio Aqua flowgraph.

Kommentar

För dem som inte är intresserade av information om hur flödesgrafen/modemet fungerar kan du hoppa över följande stycke

Flödesgrafen börjar med att läsa i IQ-filen, konvertera den från interleaverade 8-bitars heltal till GNU Radios komplexa datatyp, sedan omsamplar den signalen för att gå från den ursprungliga 18,75 MHz till 15 MHz, vilket är ett heltalsantal prover per symbol. Den här omsamplingen kan vara lite förvirrande eftersom vi i kontaktprofilen angav en bandbredd på 15 MHz. Som beskrivs mer i slutet av den här självstudien använder digitaliseraren för X-Band-signaler en exempelfrekvens som är 1,25 gånger den angivna bandbredden. Det visar sig att vi i den här flödesgrafen vill ha en 15 MHz-exempelfrekvens, så att vi har exakt två exempel per symbol. Därför måste vi sampla om från 18,75 MHz till 15 MHz. Sedan har vi ett AGC-block (automatic gain control) för att normalisera signaleffektnivån. RRC-filtret (root raised cosine) fungerar som det matchade filtret. Costas-loopen utför frekvenssynkronisering för att ta bort eventuella små frekvensförskjutningar som orsakas av oscillatorfel eller ofullständig Doppler-korrigering. De kommande tre blocken används eftersom Aqua använder QPSK-förskjutning (OQPSK) i stället för vanlig QPSK. Symbolsynkronisering utförs sedan så att OQPSK-symbolerna samplas när de är som störst. Vi kan visualisera den här samplingen av QPSK med hjälp av blocket Constellation Sink (ett exempel på utdata visas). Resten av flödesgrafen mellanläser de verkliga och imaginära delarna och sparar dem som int8:s (tecken/byte) som representerar de mjuka symbolerna. Även om de här mjuka symbolerna kan konverteras till 1:e och 0:e, kan senare bearbetning dra nytta av att ha de fullständiga symbolvärdena.

Innan du kör flödesgrafen dubbelklickar du på filkällblocket och uppdaterar sökvägen så att den matchar var du än sparade /tmp/aqua.pcap.cf32. Klicka på uppspelningsknappen längst upp för att köra flödesgrafen. Om de föregående stegen lyckades och din Aqua-kontakt lyckades bör du se följande PSD-diagram (Power spectral Density) och IQ:s diagram:

Screenshot of the GNU Radio Aqua Power Spectral Density (PSD).

Screenshot of the IQ plot of the Aqua signal.

Din kan variera beroende på vilken styrka signalen togs emot. Om inget GUI visas kontrollerar du GNU Radios utdata längst ned till vänster om det finns fel. Om GUI dyker upp men liknar en horisontell bullrig linje (utan puckel), betyder det att kontakten faktiskt inte fick Aqua-signalen. I det här fallet kontrollerar du att autotrack är aktiverat i din kontaktprofil och att centerfrekvensen har angetts korrekt.

Den tid det tar för GNU Radio att slutföras baseras på hur länge du låter pcap_to_iq skript köras, kombinerat med datorns/den virtuella datorns processorkraft. När flödesgrafen körs demodulerar den RF-signal som lagras i /tmp/aqua.pcap.cf32 och skapar filen /tmp/aqua_out.bin, som innehåller modemets utdata. Kopiera gärna den här .bin filen från den virtuella datorn.

Vi avslutar den här självstudien här. Om du är intresserad av att avkoda byte till bilder kan du antingen använda NASA:s verktyg eller öppen källkod verktyg som altillimity/X-Band-Decoders.

(Valfritt) Steg 4: Kör GNU Radioflödesgrafen live

Den här självstudien representerar fram till nu design-/testningsdelen för att skapa en vRF. Vi transformerar denna GNU Radio-flödesgraf så att den kan köras live på den virtuella datorn, som liknar ett äkta vRF-modem.

Hantera indata

Tidigare konverterade vi DIFI-paketpcapen manuellt till en binär IQ-fil och läste sedan in den binära IQ-filen i GNU Radio med Fink Source-blocket. Vi kan förenkla vår flödesgraf med hjälp av ett block inom gr-difi (underhålls av Microsoft) som är utformat för att ta emot DIFI-paket till GNU Radio! Det här tillagda blocket kräver att vi installerar en OOT-modul (GNU Radio out-of-tree), som är som ett plugin-program för GNU Radio:

sudo apt-get install python3-pip cmake liborc-dev doxygen
sudo pip install pytest pybind11
cd ~
git clone https://github.com/DIFI-Consortium/gr-difi
cd gr-difi
mkdir build
cd build
cmake -DCMAKE_FIND_ROOT_PATH=/usr ..
make -j4
sudo make install
sudo ldconfig

Efter de här stegen bör du kunna öppna GNU Radio igen och se de nya blocken (DIFI-källa och DIFI-mottagare) som anges i blockträdet. Utför följande steg i flödesgrafen som du använde under föregående avsnitt:

  1. Ersätt filkällblocket med ett DIFI-källblock
  2. Dubbelklicka på DIFI-källblocket för att redigera dess parametrar
  3. Käll-IP-adressen ska vara IP-adressen för den virtuella datorns eth0-gränssnitt
  4. Porten ska vara 56001, precis som vi använde i tcpdump-steget
  5. Ange DIFI Stream Number till 0. Alla andra parametrar kan lämnas som standard

Om du vill testa den här flödesgrafen på utvecklingsdatorn behöver du ett verktyg som udpreplay för att spela upp den pcap vi spelade in. Annars kan du vänta med att testa den här delen tills flödesgrafen används live på den virtuella datorn som är ansluten till Azure Orbital. Denna begränsning är en anledning till att den hjälper till att göra en inspelning av signalen under vRF-utvecklings- och testfasen.

Hantera utdata

Du kan välja att lämna filmottagaren i slutet och hämta den inspelade filen varje pass, men många program kräver att byte strömmas från modemet. Ett alternativ är att använda TCP-mottagarblocket i stället för filmottagaren. TCP-mottagarblocket kan konfigureras i antingen server- eller klientläge, beroende på vilken sida som ska upprätta den inledande anslutningen. Ange indatatypen till Byte och TCP-mottagaren strömmar byte över en rå TCP-nyttolast.

ZMQ PUB Sink är ett annat alternativ, som är ett meddelandebibliotek som ligger ovanpå TCP eller kommunikation mellan processer (IPC), för mer komplext beteende som PUB/SUB.

Om du lämnar den som filmottagare rekommenderar vi att du lägger till några rader Python i slutet av flödesgrafen (när den är klar) som kopierar den skapade filen till en ny plats.

Kör flödesgrafen i huvudlöst läge

Det finns en god chans att den virtuella datorn som tar emot Azure Orbital-strömmen inte stöder en skrivbordsmiljö, vilket gör att GNU Radio kraschar. Vi måste konfigurera den här flödesgrafen för att undvika att använda GUIs.

  1. Redigera blocket Alternativ längst upp till vänster
  2. Under Generera alternativ väljer du Inget GUI
  3. Under Kör alternativ väljer du Kör till slutförande
  4. Tryck på OK

Med de här stegen kan vi köra flödesgrafen som ett Python-skript utan GUI, och när den inkommande socketen stängs bör flödesgrafen automatiskt avslutas.

Screenshot of GNU Radio running in Headless Mode.

Kör flödesgrafen live

När flödesgrafen har konfigurerats med DIFI-källan och i huvudlöst läge kan vi köra flödesgrafen live på den virtuella datorn. Varje gång du trycker på uppspelningsknappen i GNU Radio Companion (GRC) skapas en .py fil i samma katalog. Det här Python-skriptet måste kopieras till den virtuella datorn. Om GNU Radio och gr-difi har installerats korrekt bör du kunna köra Python-skriptet med och python yourflowgraph.py det väntar på att DIFI-strömmen från Azure Orbital ska starta. Du kan lägga till valfri Python-kod som du vill i det här Python-skriptet, till exempel kopiera den resulterande filen till en ny plats varje pass. Obs! Om du återskapar Python-skriptet i GRC måste den nya Python-koden läggas till manuellt igen.

Om ovanstående steg fungerade har du skapat och distribuerat en vRF med nedlänk, baserat på GNU Radio!

vRF i AOGS-referens

I det här avsnittet tillhandahåller vi flera RF/digitizer-specifika detaljer som är av intresse för en vRF-användare eller designer.

På nedlänkssidan tar en vRF emot en signal från Azure Orbital. En DIFI-ström skickas till användarens virtuella dator av Azure Orbital under en satellitkontakt. Användaren förväntas samla in strömmen i realtid, antingen genom att spela in den eller bearbeta den live. Exempel är att använda tcpdump, socat eller matas in direkt i ett modem. Härnäst följer några specifikationer som rör hur Azure Orbitals markstation tar emot och bearbetar signalen:

  • Centerfrekvensen anges i kontaktprofilen
  • Signalbandbredden (BW) anges i kontaktprofilen och exempelfrekvensen är 1.25*BW för X-Band och 1.125*BW för S-Band-kontakter
  • DIFI-strömmen använder 8-bitars djup (2 byte per IQ-exempel)
  • Digitaliserarens gain-läge är inställt på att använda AGC (Automatic Gain Control) med ett energimål på -10 dBFS
  • Ingen spektral inversion används
  • Ingen frekvensförskjutning används
  • MTU-storleken för den virtuella användarens virtuella dator ska vara inställd på 3650 för X-Band och 1 500 för S-Band, vilket är den maximala paketstorleken som kommer från Azure Orbital

På överordnad länk måste användaren tillhandahålla en DIFI-ström till Azure Orbital under hela passet för att Azure Orbital ska kunna överföras. Följande anteckningar kan vara av intresse för en vRF-designer med överordnad länk:

  • Centerfrekvensen anges i Kontaktprofil
  • Signalexempelfrekvensen anges via DIFI-strömmen (även om en bandbredd tillhandahålls som en del av kontaktprofilen är den enbart för nätverkskonfiguration under huven)
  • Bitdjupet anges via DIFI-strömmen, men Azure Orbital förväntar sig 8 bitar
  • DIFI-ström-ID:t ska vara inställt på 0
  • På samma sätt som nedlänken bör MTU-storleken vara 1500 för S-Band och upp till 3650 för X-Band (valfritt)
  • Ingen spektral inversion används
  • Ingen frekvensförskjutning används

Nästa steg

Information om hur du enkelt distribuerar underordnade komponenter som behövs för att ta emot och bearbeta rymdburna jordobservationsdata med Azure Orbital Ground Station finns i: