Zelfstudie: Virtuele RF (vRF) begrijpen door demodulatie van Aqua met behulp van GNU Radio

In zelfstudie: Downlinkgegevens van een openbare satelliet, worden gegevens van nasa's Aqua-satelliet downlinked met behulp van een beheerde modem, wat betekent dat het onbewerkte RF-signaal dat is ontvangen van de Aqua-satelliet door het grondstation wordt doorgegeven via een modem die wordt beheerd door Azure Orbital. De uitvoer van deze modem, in de vorm van bytes, wordt vervolgens gestreamd naar de vm van de gebruiker. Als onderdeel van de stap Een contactprofiel configureren voor een openbare satelliet downlink missie de Demodulation Configuration is ingesteld op Aqua Direct Broadcast, wat de beheerde modem heeft ingeschakeld en geconfigureerd om het RF-signaal dat is ontvangen van Aqua te demodulate/decoderen. Met behulp van het vRF-concept wordt geen beheerde modem gebruikt en in plaats daarvan wordt het onbewerkte RF-signaal verzonden naar de VM van de gebruiker voor verwerking. Dit concept kan van toepassing zijn op zowel de downlink als uplink, maar in deze zelfstudie onderzoeken we het downlinkproces. We maken een vRF, gebaseerd op GNU Radio, dat het onbewerkte RF-signaal verwerkt en fungeert als de modem.

In deze handleiding leert u het volgende:

  • Meer informatie over de beperkingen en compromissen van het gebruik van vRF.
  • Configureer een contactprofiel via vRF in plaats van een beheerde modem.
  • Verwerk downlinked gegevens van Aqua (in de vorm van onbewerkte RF) met GNU Radio als modem, met behulp van zowel een offline-/ontwikkelingsinstallatie als een realtime-installatie.

Vereisten

Inzicht in de beperkingen en compromissen van het gebruik van vRF

Voordat we in de zelfstudie gaan, is het belangrijk om te begrijpen hoe vRF werkt en hoe deze zich verhoudt tot het gebruik van een beheerde modem. Met een beheerde modem vindt de volledige fysieke laag (PHY) plaats in Azure Orbital, wat betekent dat het RF-signaal onmiddellijk wordt verwerkt binnen de resources van Azure Orbital en de gebruiker alleen de informatiebytes ontvangt die door de modem worden geproduceerd. Door vRF te kiezen, is er geen beheerde modem en wordt het onbewerkte RF-signaal gestreamd naar de gebruiker vanaf de ground station digitaler. Met deze methode kan de gebruiker een eigen modem uitvoeren of het RF-signaal vastleggen voor latere verwerking.

Voordelen van vRF zijn de mogelijkheid om modems te gebruiken die azure Orbital niet ondersteunt of waartoe azure Orbital geen toegang heeft. Met vRF kunt u ook hetzelfde RF-signaal via een modem uitvoeren terwijl u verschillende parameters probeert uit te voeren om de prestaties te optimaliseren. Deze aanpak kan worden gebruikt om het aantal satellietpassen te verminderen dat nodig is tijdens het testen en versnellen van de ontwikkeling. Vanwege de aard van onbewerkte RF-signalen is het pakket/de bestandsgrootte doorgaans groter dan de bytes in dat RF-signaal; meestal tussen 2 en 10x groter. Meer gegevens betekent dat de netwerkdoorvoer tussen de VM en Azure Orbital mogelijk een beperkingsfactor voor vRF kan zijn.

In deze zelfstudie leert u eerst hoe vRF werkt. Aan het einde van deze zelfstudie bevatten we verschillende RF- en digitaliserende details die interessant zijn voor een vRF-gebruiker.

Rol van DIFI binnen vRF

De grondstations van Azure Orbital bestaan uit digitaliserende stations die gebruikmaken van DIFI voor het verzenden en ontvangen van gedigitaliseerde RF-signalen. Het DIFI Packet Protocol, technisch aangeduid als 'IEEE-ISTO Std 4900-2021: Digital IF Interoperability Standard', definieert een gegevensvlakinterface die is bedoeld voor het verzenden en ontvangen van gedigitaliseerde IF-gegevens (zoals IQ-voorbeelden) en bijbehorende metagegevens via standaard-IP-netwerken. Hoewel DIFI een IF-standaard is, kunnen IQ-voorbeelden bij baseband ook worden gestreamd met DIFI, net als bij Azure Orbital. Het primaire gebruiksscenario van DIFI-pakketten is het creëren van een interface tussen satelliet-grondstationdigiters (transceivers) en softwaremodems, waardoor interoperabiliteit en bestrijding van de vergrendeling van leveranciers die de satellietindustrie plaagt.

Het DIFI-pakketprotocol bevat twee primaire berichttypen: gegevenspakketten en contextpakketten. Vanwege verouderde hardwareredenen zijn er twee verschillende versies van contextpakketten. De grondstations van Azure Orbital gebruiken de actuele contextpakketten (DIFI v1.1) voor X-Band-signalen en de verouderde indeling voor S-Band-signalen. Als u het gr-difi GNU Radio-pakket gebruikt, moet u ervoor zorgen dat u de 108-byte-indeling voor X-Band en de 72-byte-indeling voor S-band selecteert. Voor niet-GNU Radio vRFs moet u ervoor zorgen dat de juiste versie van DIFI wordt gebruikt voor contextpakketten, v1.1 vindt u hier en de verouderde versie kan worden afgeleid uit deze sectie van code. Aan het einde van deze zelfstudie zijn meer overwegingen opgenomen in de vRF in AOGS Reference .

Stap 1: AOGS gebruiken om een contactpersoon te plannen en Aqua-gegevens te verzamelen

Eerst verwijderen we de beheerde modem en leggen we de onbewerkte RF-gegevens vast in een pcap-bestand. Voer de stappen uit die worden vermeld in zelfstudie: Downlinkgegevens van nasa's openbare Aqua-satelliet , maar tijdens stap Een contactprofiel configureren voor een Aqua downlink-missie laat de Demodulation Configuration leeg en kies UDP for Protocol. Ten slotte, naar het einde, in plaats van de socat opdracht (die TCP-pakketten vastlegt), worden uitgevoerd sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap om de UDP-pakketten vast te leggen in een pcap-bestand.

Notitie

De volgende drie wijzigingen zijn nodig voor Tutorial: Downlink data from NASA's Aqua public satellite:

  • Configuratie van demodulatie: leeg laten
  • Protocol: kies UDP
  • Stap 8 en 9: gebruik in plaats daarvan de opdracht sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap

Na een satellietpas moet u een bestand /tmp/aqua.pcap van 10-20 GB hebben (afhankelijk van de maximale uitbreiding). Dit bestand bevat DIFI-pakketten die het onbewerkte RF-signaal bevatten dat door het grondstation is ontvangen, in de vorm van IQ-monsters.

Stap 2: Pak de IQ-voorbeelden uit de DIFI-pakketten

Vervolgens halen we de IQ-monsters uit en slaan ze op in een meer traditionele vorm; een binair IQ-bestand. De volgende stappen kunnen worden uitgevoerd op elke VM/computer met een kopie van het aqua.pcap-bestand dat u hebt gemaakt. Deze stappen omvatten het gebruik van een kort Python-script dat wordt onderhouden door het DIFI-consortium om de IQ-voorbeelden uit de UDP DIFI-pakketten te extraheren in een IQ-bestand.

  1. Download of kopieer de volgende code naar een nieuw Python-script.
  2. Bewerken filename zodat deze overeenkomt met waar u uw pcap (/tmp/aqua.pcap) hebt opgeslagen.
  3. Voer het Python-script uit met behulp van python3 difi_to_binary_iq.pyen maak een nieuw bestand in dezelfde map als uw pcap, met een .cs8 extensie. Dit bestand is het binaire IQ-bestand, dat de gedigitaliseerde RF-voorbeelden bevat als 8-bits gehele getallen en niets anders. Het script heeft enige tijd nodig om het uit te voeren en naarmate het bestand wordt uitgevoerd, wordt het groter. Wanneer het script is voltooid, heeft het bestand ongeveer dezelfde grootte als het pcap-bestand. U kunt het script stoppen voordat het is voltooid (met control-C) en doorgaan met de zelfstudie; de volledige duur van de contactpersoon is niet nodig voor de rest van de zelfstudie.
  4. (Optioneel) Als u het signaal wilt visualiseren, installeert u Inspectrum met behulp van https://github.com/miek/inspectrum/wiki/Build#building-on-debian-based-distros Inspectrum en voert u Inspectrum uit met behulp inspectrum /tmp/aqua.pcap.cs8 van het pad naar uw nieuwe .cs8 bestand. Eenmaal in de Gui van Inspectrum kunt u het volledige dynamische bereik van het signaal aanpassen Power Max en Power Min zien.

Als u ook de IQ-voorbeelden in float32-indeling wilt gebruiken in plaats van int8 (met sommige software kunt u float32-indeling alleen laden), kunt u het volgende Python-fragment gebruiken:

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')

We gebruiken de float32-versie voor de volgende stap, omdat het de GNU Radio-stroomgraaf vereenvoudigt.

Stap 3: Het Aqua-signaal demodulate in GNU Radio

Vervolgens maken we de werkelijke vRF-modem, gebaseerd op GNU Radio, die wordt gebruikt om het Aqua-signaal te degraderen.

Logo for GNU Radio Free Software Project.

GNU Radio is een gratis en opensource-toolkit voor softwareontwikkeling die signaalverwerkingsblokken en vele voorbeeldtoepassingen voor digitale signaalverwerking (DSP) biedt. Het kan worden gebruikt met gemakkelijk beschikbare goedkope RF-hardware om softwaregedefinieerde radio's te maken, of zonder hardware in een simulatieachtige omgeving. GNU Radio wordt veel gebruikt in onderzoek, industrie, academische, overheid en hobbyistische omgevingen ter ondersteuning van zowel draadloze communicatieonderzoek als echte radiosystemen. In deze zelfstudie gebruiken we GNU Radio om Aqua te demodulate (dat wil gezegd GNU Radio fungeert als de modem).

Hoewel GNU Radio kan worden gebruikt in headless modus, in deze zelfstudie gebruiken we1 GNU Radio's GUI (dat wil gezegd, desktopinterface), dus u moet kopiëren /tmp/aqua.pcap.cf32 naar een virtuele machine met X11 doorsturen of computer met Ubuntu 20/22 desktop. De opdracht scp kan worden gebruikt om het bestand van een VIRTUELE machine in Azure te kopiëren naar een lokale ontwikkelcomputer.

GNU Radio installeren

Als u Ubuntu 22 gebruikt, voert u het volgende uit sudo apt-get install gnuradio. Als u zich in plaats daarvan in Ubuntu 20 bevindt, gebruikt u de volgende opdrachten om GNU Radio te installeren:

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

Controleer of GNU Radio correct is geïnstalleerd en of afbeeldingen werken; gnuradio-companioner wordt een venster weergegeven dat er als volgt uitziet:

Screenshot of the GNU Radio desktop GUI.

Als de blokstructuur aan de rechterkant niet wordt weergegeven, kunt u deze weergeven met behulp van het vergrootglaspictogram rechtsboven.

De Aqua-stroomgraaf uitvoeren

Een GNU Radio-toepassing wordt een "flowgraph" genoemd en het proces verwerkt of genereert een RF-signaal. De te gebruiken startersstroomgraaf kan hier worden gedownload. Open dit .grc bestand in GNU Radio en u ziet de volgende stroomgraaf:

Screenshot of the GNU Radio Aqua flowgraph.

Notitie

Voor degenen die niet geïnteresseerd zijn in de details van de werking van de stroomgraaf/modem, kunt u de volgende alinea overslaan

De stroomgraaf begint met lezen in het IQ-bestand en converteert het van interleaved 8-bits gehele getallen naar het complexe gegevenstype van GNU Radio en vervolgens wordt het signaal opnieuw gesamppt van de oorspronkelijke 18,75 MHz naar 15 MHz, wat een geheel getal is van monsters per symbool. Deze resample kan een beetje verwarrend zijn omdat we in het contactprofiel een bandbreedte van 15 MHz hebben opgegeven. Zoals besproken aan het einde van deze zelfstudie, voor X-Band-signalen gebruikt de digitaler een steekproeffrequentie die 1,25 keer de opgegeven bandbreedte is. Het blijkt dat we in deze stroomgraaf een samplefrequentie van 15 MHz willen, zodat we precies twee steekproeven per symbool hebben; daarom moeten we van 18,75 MHz naar 15 MHz opnieuwsampleen. Vervolgens hebben we een AGC-blok (Automatic Gain Control) om het signaalvermogensniveau te normaliseren. Het hoofd-cosinusfilter (RRC) fungeert als het overeenkomende filter. De Costas-lus voert frequentiesynchronisatie uit om eventuele kleine frequentieverschuivingen te verwijderen die worden veroorzaakt door een oscillatorfout of onvolmaakte Doppler-correctie. De volgende drie blokken worden gebruikt omdat Aqua gebruikmaakt van offset QPSK (OQPSK) in plaats van gewone QPSK. Symboolsynchronisatie wordt vervolgens uitgevoerd, zodat de OQPSK-symbolen worden gemonsterd op hun pieken. We kunnen deze steekproeven van QPSK visualiseren met behulp van het Sink-blok van de constellatie (een voorbeelduitvoer wordt weergegeven). De rest van de stroomgraaf interleaseert de echte en imaginaire delen en slaat ze op als int8's (tekens/bytes) die de zachte symbolen vertegenwoordigen. Hoewel deze zachte symbolen kunnen worden geconverteerd naar 1 en 0's, profiteert de verwerking later van het gebruik van de volledige symboolwaarden.

Voordat u de stroomgraaf uitvoert, dubbelklikt u op het blok Bestandsbron en werkt u het pad bij zodat het overeenkomt met de locatie die u hebt opgeslagen /tmp/aqua.pcap.cf32. Klik op de afspeelknop bovenaan om de stroomgraaf uit te voeren. Als de vorige stappen zijn geslaagd en uw Aqua-contact een succes was, ziet u de volgende power spectrale dichtheid (PSD) en IQ-plot weergegeven:

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

Screenshot of the IQ plot of the Aqua signal.

De jouwe kan variëren, afhankelijk van de sterkte die het signaal heeft ontvangen. Als er geen GUI verschijnt, controleert u de uitvoer van GNU Radio linksonder op fouten. Als de GUI wordt weergegeven maar lijkt op een horizontale ruislijn (zonder bult), betekent dit dat de contactpersoon het Aqua-signaal niet daadwerkelijk heeft ontvangen. Controleer in dit geval of autotrack is ingeschakeld in uw contactprofiel en of de middenfrequentie correct is ingevoerd.

De tijd die GNU Radio nodig heeft om te voltooien, is gebaseerd op hoe lang u het pcap_to_iq script laat uitvoeren, gecombineerd met de CPU-kracht van uw computer/VM. Terwijl de stroomgraaf wordt uitgevoerd, wordt het RF-signaal gededueerd dat is opgeslagen in /tmp/aqua.pcap.cf32 en het maken van het bestand /tmp/aqua_out.bin, dat de uitvoer van de modem bevat. U kunt dit .bin bestand van de virtuele machine kopiëren.

We beëindigen deze zelfstudie hier. Als u geïnteresseerd bent in het decoderen van de bytes in afbeeldingen, kunt u de hulpprogramma's van NASA of opensource-hulpprogramma's zoals altillimity/X-Band-Decoders gebruiken.

(Optioneel) Stap 4: De GNU Radio flowgraph live uitvoeren

Deze zelfstudie tot aan dit punt vertegenwoordigt het ontwerp-/testgedeelte van het maken van een vRF. We transformeren deze GNU Radio-stroomgraaf zodat deze live op de VM kan worden uitgevoerd, alsof het lijkt op een echte vRF-modem.

De invoer verwerken

Voorheen hebben we het DIFI-pakket pcap handmatig geconverteerd naar een binair IQ-bestand en vervolgens dat binaire IQ-bestand in GNU Radio geladen met het Fink Source-blok. We kunnen onze stroomgraaf vereenvoudigen met behulp van een blok binnen gr-difi (onderhouden door Microsoft) ontworpen om DIFI-pakketten te ontvangen in GNU Radio! Voor dit toegevoegde blok moeten we een GNU Radio out-of-tree-module (OOT) installeren, die vergelijkbaar is met een plugin voor 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

Na deze stappen moet u GNU Radio opnieuw kunnen openen en de nieuwe blokken (DIFI Source en DIFI Sink) in de blokstructuur kunnen zien. Voer in de stroomgraaf die u in de vorige sectie hebt gebruikt de volgende stappen uit:

  1. Het blok Bestandsbron vervangen door een DIFI-bronblok
  2. Dubbelklik op het DIFI-bronblok om de parameters te bewerken
  3. Het bron-IP-adres moet het IP-adres zijn van de eth0-interface van uw VM
  4. Poort moet 56001 zijn, net zoals we in de tcpdump-stap hebben gebruikt
  5. Stel DIFI Stream Number in op 0. Alle andere parameters kunnen standaard worden ingesteld

Als u deze stroomgraaf op uw ontwikkelcomputer wilt testen, hebt u een hulpprogramma nodig, zoals udpreplay om de pcap af te spelen die we hebben opgenomen. Anders kunt u wachten om dit deel te testen totdat de stroomgraaf live wordt gebruikt op de VM die is verbonden met Azure Orbital. Deze beperking is een van de redenen waarom het helpt om een opname van het signaal te maken tijdens de ontwikkel- en testfase van vRF.

De uitvoer verwerken

U kunt ervoor kiezen om de Bestandssink aan het einde te laten en het opgenomen bestand elke pass op te halen, maar veel toepassingen vereisen het streamen van de bytes uit de modem. Een optie is om het TCP-sinkblok te gebruiken in plaats van de bestandssink. Het TCP Sink-blok kan worden geconfigureerd in een server- of clientmodus, afhankelijk van welke kant de eerste verbinding moet maken. Stel het invoertype in op Byte en de TCP-sink streamt de bytes via een onbewerkte TCP-nettolading.

ZMQ PUB Sink is een andere optie, een berichtenbibliotheek die zich boven op TCP of IPC bevindt, voor complexer gedrag, zoals PUB/SUB.

Als u deze als bestandssink laat staan, raden we u aan een paar regels python toe te voegen aan het einde van de stroomgraaf (nadat het is voltooid) waarmee het gemaakte bestand naar een nieuwe locatie wordt gekopieerd.

De stroomgraaf uitvoeren in de headless-modus

Er is een goede kans dat de VM die de Azure Orbital-stroom ontvangt, geen ondersteuning biedt voor een bureaubladomgeving, waardoor GNU Radio vastloopt. We moeten deze stroomgraaf configureren om het gebruik van GUI's te voorkomen.

  1. Het blok Opties in de linkerbovenhoek bewerken
  2. Kies onder Opties genereren geen GUI
  3. Kies Uitvoeren tot voltooiing onder Uitvoeringsopties
  4. Klik op OK

Met deze stappen kunnen we de stroomgraaf uitvoeren als een Python-script zonder GUI en wanneer de binnenkomende socket de stroomgraaf sluit, wordt deze automatisch beëindigd.

Screenshot of GNU Radio running in Headless Mode.

De stroomgraaf live uitvoeren

Zodra de stroomgraaf is geconfigureerd met de DIFI-bron en in de modus zonder hoofd, kunnen we de stroomgraaf live uitvoeren op de virtuele machine. In GNU Radio Companion (GRC) wordt telkens wanneer u op de afspeelknop klikt een .py bestand gemaakt in dezelfde map. Dit Python-script moet worden gekopieerd naar de VIRTUELE machine. Als GNU Radio en gr-difi correct zijn geïnstalleerd, moet u het Python-script kunnen uitvoeren met behulp van python yourflowgraph.py en wacht tot de DIFI-stream van Azure Orbital is gestart. U kunt alle Python-code die u wilt toevoegen aan dit Python-script, zoals het kopiëren van het resulterende bestand naar een nieuwe locatie die elke pass wordt doorgegeven. Opmerking: als u het Python-script in GRC opnieuw genereert, moet deze nieuwe Python-code handmatig opnieuw worden toegevoegd.

Als de bovenstaande stappen hebben gewerkt, hebt u een downlink vRF gemaakt en geïmplementeerd op basis van GNU Radio!

vRF binnen AOGS-verwijzing

In deze sectie bieden we verschillende RF/digitaler-specifieke details die interessant zijn voor een vRF-gebruiker of ontwerper.

Aan de downlinkzijde ontvangt een vRF een signaal van Azure Orbital. Tijdens een satellietcontact wordt een DIFI-stream verzonden naar de VM van de gebruiker door Azure Orbital. De gebruiker zal de stream naar verwachting in realtime vastleggen door deze op te nemen of live te verwerken. Voorbeelden hiervan zijn het gebruik van tcpdump, socat of rechtstreeks opgenomen in een modem. Hierna volgen enkele specificaties met betrekking tot de wijze waarop het grondstation van Azure Orbital het signaal ontvangt en verwerkt:

  • De middelste frequentie wordt opgegeven in het contactprofiel
  • De signaalbandbreedte (BW) wordt ingesteld in het contactprofiel en de samplefrequentie is 1.25*BW voor X-Band en 1.125*BW voor S-Band-contacten
  • De DIFI-stroom maakt gebruik van 8-bits diepte (2 bytes per IQ-voorbeeld)
  • De gain-modus van de digitaliter is ingesteld op het gebruik van automatische versterkingsbesturing (AGC) met een energiedoel van -10 dBFS
  • Er wordt geen spectrale inversie gebruikt
  • Er wordt geen frequentieverschil gebruikt
  • De MTU-grootte van de gebruiker-VM moet worden ingesteld op 3650 voor X-Band en 1500 voor S-Band. Dit is de maximale pakketgrootte die afkomstig is van Azure Orbital

Aan de uplinkzijde moet de gebruiker gedurende de hele pass een DIFI-stroom naar Azure Orbital opgeven, zodat Azure Orbital deze kan verzenden. De volgende opmerkingen zijn mogelijk interessant voor een uplink vRF-ontwerper:

  • De middelpuntfrequentie wordt opgegeven in het profiel van de contactpersoon
  • De frequentie van het signaalvoorbeeld wordt ingesteld via de DIFI-stroom (hoewel er een bandbreedte wordt geleverd als onderdeel van het contactprofiel, is dit uitsluitend bedoeld voor de netwerkconfiguratie onder de schermen)
  • De bitdiepte wordt ingesteld via de DIFI-stream, maar Azure Orbital verwacht 8 bits
  • De DIFI-stream-id moet worden ingesteld op 0
  • Net als bij de downlink moet de MTU-grootte 1500 zijn voor S-Band en maximaal 3650 voor X-Band (uw keuze)
  • Er wordt geen spectrale inversie gebruikt
  • Er wordt geen frequentieverschil gebruikt

Volgende stappen

Als u eenvoudig downstreamonderdelen wilt implementeren die nodig zijn voor het ontvangen en verwerken van aardobservatiegegevens met behulp van Azure Orbital Ground Station, raadpleegt u: