Tutoriel : comprendre la RF virtuelle (vRF) par le biais de la démodulation d’Aqua à l’aide de GNU Radio

Dans le Tutoriel : Recevoir des données du satellite public Aqua par liaison descendante, les données du satellite Aqua de la NASA sont reçues par liaison descendante à l’aide d’un modem managé, ce qui signifie que le signal RF brut reçu du satellite Aqua par la station terrienne est transmis via un modem managé par Azure Orbital. La sortie de ce modem, qui se présente sous la forme d’octets, est ensuite diffusée sur la machine virtuelle de l’utilisateur. Dans le cadre de l’étape Configurer un profil de contact pour une mission de liaison descendante de satellite public, la configuration de la démodulation a été définie sur Aqua Direct Broadcast, ce qui a activé et configuré le modem managé pour démoduler/décoder le signal RF reçu d’Aqua. À l’aide du concept vRF, aucun modem managé n’est utilisé et le signal RF brut est envoyé à la machine virtuelle de l’utilisateur pour traitement. Ce concept peut s’appliquer à la fois à la liaison descendante et à la liaison montante, mais dans ce tutoriel, nous examinons le processus de liaison descendante. Nous créons une vRF, basée sur GNU Radio, qui traite le signal RF brut et agit comme le modem.

Dans ce guide, vous apprendrez comment :

  • Comprendre les limitations et les compromis liés à l’utilisation de vRF.
  • Configurer un profil de contact via vRF au lieu d’un modem managé.
  • Traiter les données descendantes d’Aqua (sous forme de RF brute) en utilisant GNU Radio comme modem, à l’aide d’une configuration hors connexion/développement et d’une configuration en temps réel.

Prérequis

Comprendre les limitations et les compromis liés à l’utilisation de vRF

Avant de plonger dans le tutoriel, il est important de comprendre le fonctionnement de vRF et comment il se compare à l’utilisation d’un modem managé. Avec un modem managé, l’ensemble de la couche physique (PHY) se produit dans Azure Orbital, ce qui signifie que le signal RF est immédiatement traité dans les ressources d’Azure Orbital et que l’utilisateur reçoit uniquement les octets d’informations produits par le modem. En choisissant vRF, il n’y a pas de modem managé et le signal RF brut est transmis à l’utilisateur à partir du numériseur de la station terrienne. Cette approche permet à l’utilisateur d’exécuter son propre modem ou de capturer le signal RF pour un traitement ultérieur.

Parmi les avantages de vRF, la possibilité d’utiliser des modems qu’Azure Orbital ne prend pas en charge et auxquels Azure Orbital n’a pas accès. vRF permet également d’exécuter le même signal RF via un modem tout en essayant des paramètres différents pour optimiser les performances. Cette approche peut être utilisée pour réduire le nombre de passes de satellite nécessaires pendant les tests et accélérer le développement. En raison de la nature des signaux RF bruts, la taille du paquet/fichier est généralement supérieure aux octets contenus dans ce signal RF ; généralement entre 2 et 10 fois plus grand. Plus de données signifie que le débit réseau entre la machine virtuelle et Azure Orbital peut potentiellement être un facteur limitant pour vRF.

Tout au long de ce tutoriel, vous allez apprendre de première main comment fonctionne vRF. À la fin de ce didacticiel, nous fournissons plusieurs détails spécifiques à RF et au numériseur qui intéressent un utilisateur vRF.

Rôle de DIFI dans vRF

Les stations terriennes d’Azure Orbital se composent de numériseurs qui utilisent DIFI pour envoyer et recevoir des signaux RF numérisés. Le protocole de paquets DIFI, techniquement appelé « IEEE-ISTO Std 4900-2021: Digital IF Interoperability Standard », définit une interface de plan de données destinée à transmettre et recevoir des données IF numérisées (telles que des échantillons IQ) et des métadonnées correspondantes sur des réseaux IP standard. Même si DIFI est une norme « IF », les échantillons IQ à bande de base peuvent également être diffusés en continu avec DIFI, comme avec Azure Orbital. Le principal cas d’usage des paquets DIFI est de créer une interface entre les numériseurs de stations terriennes satellites (émetteurs-récepteurs) et les modems logiciels, ce qui permet l’interopérabilité et lutte contre le verrouillage des fournisseurs qui mine l’industrie satellite.

Le protocole de paquets DIFI contient deux types de messages principaux : les paquets de données et de contexte. Pour des raisons matérielles héritées, il existe deux versions différentes des paquets de contexte. Les stations terriennes d’Azure Orbital utilisent les paquets de contexte à jour (DIFI v1.1) pour les signaux en bande X et le format hérité pour les signaux en bande S. Si vous utilisez le package gr-difi GNU Radio, assurez-vous de sélectionner le format de 108 octets pour la bande X et le format de 72 octets pour la bande S. Pour les vRF non GNU Radio, vous devez vous assurer que la version correcte de DIFI est utilisée pour les paquets de contexte. Vous pouvez trouver la version 1.1 ici et déduire la version héritée à partir de cette section de code. D’autres considérations sont incluses dans le Guide de référence vRF avec AOGS à la fin de ce tutoriel.

Étape 1 : Utiliser AOGS pour planifier un contact et collecter des données Aqua

Tout d’abord, nous supprimons le modem managé et nous capturons les données RF brutes dans un fichier pcap. Exécutez les étapes répertoriées dans Tutoriel : recevoir des données du satellite public Aqua de la NASA par liaison descendante, mais au cours de l’étape Configurer un profil de contact pour une mission de liaison descendante Aqua, laissez Demodulation Configuration (Configuration de démodulation) vide et choisissez UDP pour Protocol (Protocole). Enfin, vers la fin, au lieu de la commande socat (qui capture les paquets TCP), exécutez sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap pour capturer les paquets UDP dans un fichier pcap.

Notes

Les trois modifications suivantes sont nécessaires au Tutoriel : recevoir les données du satellite public Aqua de la NASA par liaison descendante :

  • Demodulation Configuration (Configuration de démodulation : laissez vide
  • Protocol (Protocole) : choisissez UDP
  • Étape 8 et 9 : à la place, utilisez la commande sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap

Après un passage satellite, vous devez disposer d’un fichier /tmp/aqua.pcap d’une taille de 10 à 20 Go (en fonction de l’élévation maximale). Ce fichier contient des paquets DIFI contenant le signal RF brut reçu par la station terrienne, sous forme d’échantillons IQ.

Étape 2 : extraire les échantillons IQ des paquets DIFI

Ensuite, nous extrayons les échantillons IQ et les enregistrons sous une forme plus traditionnelle ; un fichier IQ binaire. Les étapes suivantes peuvent être effectuées sur n’importe quelle machine virtuelle/ordinateur disposant d’une copie du fichier aqua.pcap que vous avez créé. Ces étapes impliquent l’utilisation d’un bref script Python géré par le consortium DIFI pour extraire les échantillons IQ des paquets UDP DIFI dans un fichier IQ.

  1. Téléchargez ou copiez le code suivant dans un nouveau script Python.
  2. Modifiez filename pour qu’il corresponde à l’emplacement où vous avez enregistré votre fichier pcap (/tmp/aqua.pcap).
  3. Exécutez le script Python à l’aide de python3 difi_to_binary_iq.py. Il devrait créer un fichier dans le même répertoire que votre fichier pcap, avec une extension .cs8. Ce fichier est le fichier IQ binaire, qui contient les échantillons RF numérisés sous forme d’entiers 8 bits et rien d’autre. Il faut un certain temps pour que le script s’exécute, et au fur et à mesure qu’il s’exécute, le fichier s’agrandit. Une fois le script terminé, le fichier est à peu près de la même taille que le fichier pcap. Vous pouvez arrêter le script avant son achèvement (à l’aide de Ctrl+C) et poursuivre le didacticiel ; la durée entière du contact n’est pas nécessaire pour le reste du didacticiel.
  4. (Facultatif) Si vous souhaitez visualiser le signal, installez Inspectrum à l’aide de https://github.com/miek/inspectrum/wiki/Build#building-on-debian-based-distros, puis exécutez Inspectrum à l’aide de inspectrum /tmp/aqua.pcap.cs8 (en utilisant le chemin d’accès vers votre nouveau fichier .cs8). Une fois dans l’interface graphique utilisateur Inspectrum, vous pouvez ajuster Power Max et Power Min de façon à afficher la plage dynamique complète du signal.

Si vous souhaitez également que les exemples IQ au format float32 au lieu d’int8 (certains logiciels vous permettent uniquement de charger le format float32), vous pouvez utiliser l’extrait de code Python suivant :

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

Nous allons utiliser la version float32 pour l’étape suivante, car elle simplifie le graphe de flux GNU Radio.

Étape 3 : démoduler le signal Aqua dans GNU Radio

Ensuite, nous créons le modem vRF réel, basé sur GNU Radio, utilisé pour démoduler le signal Aqua.

Logo for GNU Radio Free Software Project.

GNU Radio est un kit de développement logiciel gratuit et open source qui fournit des blocs de traitement du signal et de nombreux exemples d’applications de traitement du signal numérique (DSP, Digital Signal Processing). Il peut être utilisé avec du matériel RF à faible coût directement disponible pour créer des radios à définition logicielle, ou sans matériel dans un environnement de type simulation. GNU Radio est largement utilisé dans la recherche, l’industrie, le milieu universitaire, le gouvernement et les milieux amateurs pour soutenir la recherche sur les communications sans fil et les systèmes radio du monde réel. Dans ce tutoriel, nous utilisons GNU Radio pour démoduler Aqua (c’est-à-dire, GNU Radio agit en tant que modem).

Bien que la radio GNU puisse être utilisée en mode sans affichage, dans ce tutoriel, nous utilisons l’interface graphique utilisateur de GNU Radio (c’est-à-dire l’interface de bureau), vous devez donc copier /tmp/aqua.pcap.cf32 sur une machine virtuelle avec transfert X11 ou sur un ordinateur de bureau Ubuntu 20/22. La commande scp peut être utilisée pour copier le fichier d’une machine virtuelle sur Azure vers un ordinateur de développement local.

Installer GNU Radio

Si vous utilisez Ubuntu 22, exécutez sudo apt-get install gnuradio. Si au lieu de cela vous utilisez Ubuntu 20, utilisez les commandes suivantes pour installer GNU Radio :

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

Vérifiez que GNU Radio est correctement installé et que les graphiques fonctionnent à l’aide de gnuradio-companion ; une fenêtre doit apparaître comme suit :

Screenshot of the GNU Radio desktop GUI.

Si l’arborescence de blocs à droite n’est pas affichée, vous pouvez l’afficher à l’aide de l’icône de loupe en haut à droite.

Exécuter le graphe de flux Aqua

Une application GNU Radio est connue sous le nom de « graphe de flux » et elle traite ou génère généralement un signal RF. Le graphe de flux de démarrage à utiliser peut être téléchargé ici. Ouvrez ce fichier .grc dans GNU Radio et vous devez voir le graphe de flux suivant :

Screenshot of the GNU Radio Aqua flowgraph.

Remarque

Pour ceux qui ne sont pas intéressés par les détails du fonctionnement du graphe de flux/modem, vous pouvez ignorer le paragraphe suivant

Le graphe de flux commence par lire dans le fichier IQ, en le convertissant d’entiers 8 bits entrelacés en type de données complexes GNU Radio, puis il rééchantillonne le signal pour passer du 18,75 MHz d’origine à 15 MHz, soit un nombre entier d’échantillons par symbole. Ce rééchantillonnage peut être un peu déroutant, car dans le profil de contact, nous avions spécifié une bande passante de 15 MHz. Comme expliqué plus en détail à la fin de ce tutoriel, pour les signaux en bande X, le numériseur utilise un taux d’échantillonnage de 1,25 fois la bande passante spécifiée. Il s’avère que dans ce graphe de flux, nous voulons un taux d’échantillonnage de 15 MHz, de sorte que nous avons exactement deux échantillons par symbole; nous devons donc rééchantillonner de 18,75 MHz à 15 MHz. Ensuite, nous avons un bloc de contrôle de gain automatique (AGC, Automatic Gain Control) pour normaliser le niveau de puissance du signal. Le filtre de cosinus levé à la racine (RRC, Root Raised Cosine) fait office de filtre correspondant. La boucle Costas effectue la synchronisation de fréquence pour supprimer les petits décalages de fréquence causés par une erreur d’oscillateur ou une correction Doppler imparfaite. Les trois blocs suivants sont utilisés, car Aqua utilise OQPSK (offset QPSK) au lieu de QPSK standard. La synchronisation des symboles est ensuite effectuée afin que les symboles OQPSK soient échantillonnés à leurs pics. Nous pouvons visualiser cet échantillonnage de QPSK à l’aide du bloc Constellation Sink (Récepteur Constellation) (un exemple de sortie s’affiche). Le reste du graphe de flux entrelace les parties réelles et imaginaires, et les enregistre sous forme d’int8 (caractères/octets) qui représentent les symboles souples. Bien qu’il puisse convertir ces symboles souples en 1 et 0, le traitement ultérieur bénéficie des valeurs de symboles complètes.

Avant d’exécuter le graphe de flux, double-cliquez sur le bloc Source de fichier et mettez à jour le chemin d’accès pour qu’il corresponde à l’emplacement où vous avez enregistré /tmp/aqua.pcap.cf32. Cliquez sur le bouton de lecture en haut pour exécuter le graphe de flux. Si les étapes précédentes ont réussi et que votre contact Aqua a réussi, vous devriez voir la densité spectrale de puissance (PSD, Power Spectral Density) et le tracé IQ suivants :

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

Screenshot of the IQ plot of the Aqua signal.

Votre résultat peut varier en fonction de la force du signal reçu. Si aucune interface graphique utilisateur n’est affichée, vérifiez si des erreurs sont présentent dans la sortie de GNU Radio en bas à gauche. Si l’interface utilisateur graphique s’affiche, mais ressemble à une ligne de bruit horizontale (sans bosse), cela signifie que le contact n’a pas reçu le signal Aqua. Dans ce cas, vérifiez que le suivi automatique est activé dans votre profil de contact et que la fréquence centrale a été correctement entrée.

Le temps que prend GNU Radio dépend de la durée pendant laquelle vous laissez le script pcap_to_iq s’exécuter, ainsi que de la puissance du processeur de votre ordinateur/machine virtuelle. Au fur et à mesure que le graphe de flux s’exécute, il démodule le signal RF stocké dans /tmp/aqua.pcap.cf32 et crée le fichier /tmp/aqua_out.bin, qui contient la sortie du modem. N’hésitez pas à copier ce fichier .bin en dehors de la machine virtuelle.

Nous mettons fin à ce tutoriel ici. Si vous souhaitez décoder les octets en images, vous pouvez utiliser les outils de la NASA ou des outils open source tels que altillimity/X-Band-Decoders.

(Facultatif) Étape 4 : exécuter le flux de graphe GNU Radio en direct

À ce stade, ce didacticiel représente la partie conception/test de la création d’un vRF. Nous transformons ce flux de graphe GNU Radio pour qu’il puisse être exécuté en direct sur la machine virtuelle, ressemblant à un véritable modem vRF.

Gérer l’entrée

Auparavant, nous avons converti manuellement le paquet pcap DIFI en fichier IQ binaire, puis chargé ce fichier IQ binaire dans GNU Radio avec le bloc Fink Source. Nous pouvons simplifier notre graphe de flux à l’aide d’un bloc dans gr-difi (géré par Microsoft) conçu pour recevoir des paquets DIFI dans GNU Radio. Ce bloc ajouté nous oblige à installer un module hors arborescence (OOT, Out Of Tree) GNU Radio, qui est semblable à un plug-in pour 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

Après ces étapes, vous devez pouvoir rouvrir GNU Radio et voir les nouveaux blocs (source DIFI et récepteur DIFI) répertoriés dans l’arborescence des blocs. Dans le graphe de flux que vous avez utilisé dans la section précédente, procédez comme suit :

  1. Remplacez le bloc File Source (Source de fichier) par un bloc DIFI Source (Source DIFI)
  2. Double-cliquez sur le bloc DIFI Source (Source DIFI) pour modifier ses paramètres
  3. Source IP Address (Adresse IP source) doit être l’adresse IP de l’interface eth0 de votre machine virtuelle
  4. Le Port doit être 56001, comme nous l’avons utilisé à l’étape tcpdump
  5. Définissez DIFI Stream Number (Numéro de flux DIFI) sur 0. Vous pouvez laisser les valeurs par défaut pour tous les autres paramètres

Si vous souhaitez tester ce graphe de flux sur votre machine de développement, vous avez besoin d’un outil tel que udpreplay pour lire le pcap que nous avons enregistré. Sinon, vous pouvez attendre de tester cette partie jusqu’à ce que le graphe de flux soit utilisé en direct sur la machine virtuelle connectée à Azure Orbital. Cette limitation est l’une des raisons pour lesquelles elle permet d’enregistrer le signal pendant la phase de développement et de test vRF.

Gérer la sortie

Vous pouvez choisir de laisser le récepteur de fichiers à la fin et de récupérer le fichier enregistré à chaque passage, mais de nombreuses applications nécessitent de diffuser en continu les octets sortant du modem. L’une des options consiste à utiliser le TCP Sink Block (Bloc de Récepteur TCP) à la place du File Sink (Récepteur de fichiers). Le bloc TCP Sink peut être configuré en mode serveur ou client, selon le côté qui doit effectuer la connexion initiale. Définissez Input Type (Type d’entrée) sur Byte (Octet), et le récepteur TCP transmet les octets sur une charge utile TCP brute.

ZMQ PUB Sink (Récepteur PUB ZMQ) est une autre option. Il s’agit d’une bibliothèque de messagerie au-dessus de la communication TCP ou inter-processus (IPC), pour un comportement plus complexe comme PUB/SUB.

Si vous laissez le File Sink (Récepteur de fichiers), nous recommandons d’ajouter quelques lignes de Python à la fin du graphe de flux (une fois le flux terminé) qui copie le fichier créé dans un nouvel emplacement.

Exécuter le graphe de flux en mode sans affichage

Il y a de fortes chances que la machine virtuelle recevant le flux Azure Orbital ne prenne pas en charge un environnement de bureau, ce qui provoque le blocage de GNU Radio. Nous devons configurer ce graphe de flux pour éviter d’utiliser des interfaces graphiques utilisateur.

  1. Modifier le bloc Options en haut à gauche
  2. Sous Generate Options (Options de génération), choisissez No GUI (Aucune interface graphique utilisateur)
  3. Sous Run Options (Options d’exécution), choisissez Run to Completion (Exécuter jusqu’à l’achèvement)
  4. Appuyer sur OK

Ces étapes nous permettent d’exécuter le graphe de flux en tant que script Python sans interface graphique utilisateur, et lorsque le socket entrant se ferme, le graphe de flux doit se terminer automatiquement.

Screenshot of GNU Radio running in Headless Mode.

Exécuter le graphe de flux en direct

Une fois que le graphe de flux est configuré avec la source DIFI et en mode sans affichage, nous pouvons exécuter le graphe de flux en direct sur la machine virtuelle. Dans GNU Radio Companion (GRC), chaque fois que vous appuyez sur le bouton de lecture, un fichier .py est créé dans le même répertoire. Ce script Python doit être copié sur la machine virtuelle. Si GNU Radio et gr-difi ont été installés correctement, vous devez être en mesure d’exécuter le script Python à l’aide de python yourflowgraph.py et il attend que le flux DIFI à partir d’Azure Orbital démarre. Vous pouvez ajouter n’importe quel code Python souhaité à ce script Python, par exemple copier le fichier résultant dans un nouvel emplacement à chaque passe. Remarque : si vous régénérez le script Python dans GRC, ce nouveau code Python doit être ajouté manuellement une nouvelle fois.

Si les étapes ci-dessus ont fonctionné, vous avez correctement créé et déployé un vRF de liaison descendante, basé sur GNU Radio.

Guide de référence de vRF dans AOGS

Dans cette section, nous fournissons plusieurs détails spécifiques aux RF/au numériseur qui intéressent un utilisateur ou un concepteur vRF.

Du côté de la liaison descendante, un vRF reçoit un signal d’Azure Orbital. Un flux DIFI est envoyé à la machine virtuelle de l’utilisateur par Azure Orbital lors d’un contact satellite. L’utilisateur est censé capturer le flux en temps réel, soit en l’enregistrant ou en le traitant en direct. Par exemple, au moyen de tcpdump ou socat, ou directement ingéré dans un modem. Voici quelques spécifications relatives à la façon dont la station terrienne d’Azure Orbital reçoit et traite le signal :

  • La fréquence centrale est spécifiée dans le profil de contact
  • La bande passante du signal (BW) est définie dans le profil de contact, et le taux d’échantillonnage est 1.25*BW pour la bande X et 1.125*BW pour les contacts de la bande S
  • Le flux DIFI utilise une profondeur 8 bits (2 octets par échantillon IQ)
  • Le mode gain du numériseur est défini pour utiliser le contrôle de gain automatique (AGC, Automatic Gain Control) avec une cible de puissance de -10 dBFS
  • Aucune inversion spectrale n’est utilisée
  • Aucun décalage de fréquence n’est utilisé
  • La taille MTU de la machine virtuelle utilisateur doit être définie sur 3 650 pour la bande X et 1 500 pour la bande S, ce qui correspond à la taille maximale des paquets provenant d’Azure Orbital

Du côté de la liaison montante, l’utilisateur doit fournir un flux DIFI à Azure Orbital tout au long de la passe, pour qu’Azure Orbital transmette. Les notes suivantes peuvent intéresser un concepteur vRF de liaison montante :

  • La fréquence centrale est spécifiée dans Profil de contact
  • Le taux d’échantillonnage du signal est défini via le flux DIFI (même si une bande passante est fournie dans le cadre du profil de contact, il s’agit uniquement de la configuration réseau sous le capot)
  • La profondeur de bits est définie via le flux DIFI, mais Azure Orbital attend 8 bits
  • L’ID de flux DIFI doit être défini sur 0
  • Comme pour la liaison descendante, la taille du MTU doit être de 1500 pour la bande S et jusqu’à 3650 pour la bande X (selon votre préférence)
  • Aucune inversion spectrale n’est utilisée
  • Aucun décalage de fréquence n’est utilisé

Étapes suivantes

Pour déployer facilement les composants en aval requis pour réceptionner et traiter des données d’observation spatiale de la Terre à l’aide de la Station terrienne Azure Orbital, consultez :