Compartir a través de


Tutorial: Comprender la RF virtual (vRF) a través de la demodulación de Aqua mediante GNU Radio

En Tutorial: vínculo descendente de datos de un satélite público, los datos del satélite Aqua de la NASA se vinculan de manera descendente mediante un módem administrado, lo que significa que la señal de RF sin procesar recibida del satélite Aqua por la estación terrestre pasa a través de un módem administrado por Azure Orbital. A continuación, la salida de este módem, que tiene el formato de bytes, se transmite a la máquina virtual del usuario. Como parte del paso Configurar un perfil de contacto para una misión de vínculo descendente por satélite público, la Configuración de demodulación se estableció en Aqua Direct Broadcast, que es lo que habilitó y configuró el módem administrado para demodular/decodificar la señal RF recibida de Aqua. Con el concepto vRF, no se usa ningún módem administrado y, en su lugar, la señal RF sin procesar se envía a la VM del usuario para su procesamiento. Este concepto puede aplicarse tanto al enlace descendente como al ascendente, pero en este tutorial examinaremos el proceso del enlace descendente. Creamos un vRF, basado en GNU Radio, que procesa la señal RF bruta y actúa como módem.

En esta guía, aprenderá a:

  • Comprender las limitaciones y ventajas de usar vRF.
  • Configure un perfil de contacto a través de vRF en lugar de un módem administrado.
  • Procesar los datos bajados desde Aqua (en forma de RF sin procesar) mediante GNU Radio como módem, utilizando tanto una configuración sin conexión o de desarrollo como una configuración en tiempo real.

Requisitos previos

Comprender las limitaciones y ventajas de usar vRF.

Antes de profundizar en el tutorial, es importante entender cómo funciona vRF y cómo se compara con el uso de un módem administrado. Con un módem administrado, toda la capa física (PHY) se produce dentro de Azure Orbital, lo que significa que la señal de RF se procesa inmediatamente dentro de los recursos de Azure Orbital y el usuario solo recibe los bytes de información producidos por el módem. Al elegir vRF, no hay ningún módem administrado, y la señal de RF sin procesar se transmite al usuario desde el digitalizador de la estación terrestre. Este enfoque permite al usuario usar su propio módem o capturar la señal de RF para su posterior procesamiento.

Entre las ventajas de vRF se incluye la capacidad de usar módems a los que Azure Orbital no admite ni tiene acceso. vRF también permite ejecutar la misma señal RF a través de un módem al intentar diferentes parámetros para optimizar el rendimiento. Este enfoque puede usarse para reducir el número de pases de satélite necesarios durante las pruebas y acelerar el desarrollo. Debido a la naturaleza de las señales RF en bruto, el tamaño del paquete/archivo suele ser mayor que los bytes contenidos en esa señal RF; normalmente entre 2 y 10 veces mayor. Más datos significa que el rendimiento de red entre la máquina virtual y Azure Orbital puede ser un factor de limitación para vRF.

A lo largo de este tutorial, aprenderá de primera mano cómo funciona vRF. Al final de este tutorial, se incluyen varios detalles específicos de RF y digitalizador que son de interés para un usuario de vRF.

Rol de DIFI dentro de vRF

Las estaciones terrestres de Azure Orbital constan de digitalizadores que usan DIFI para enviar y recibir señales de RF digitalizadas. El protocolo de paquetes DIFI, técnicamente denominado "IEEE-ISTO Std 4900-2021: Digital IF Interoperability Standard", define una interfaz de plano de datos destinada a transmitir y recibir datos de FI digitalizados (como muestras IQ) y los metadatos correspondientes a través de redes IP estándar. Aunque DIFI es un estándar "IF", las muestras de IQ en banda base también se pueden transmitir con DIFI, como ocurre con Azure Orbital. El caso de uso principal de los paquetes DIFI es crear una interfaz entre digitalizadores de estación terrestre satélite (transceptores) y módems de software, lo que permite la interoperabilidad y combatir el bloqueo del proveedor que afecta a la industria satélite.

El protocolo de paquetes DIFI contiene dos tipos de mensajes principales: paquetes de datos y paquetes de contexto. Debido a motivos de hardware heredados, hay dos versiones diferentes de paquetes de contexto. Las estaciones terrestres de Azure Orbital usan los paquetes de contexto actualizados (DIFI v1.1) para las señales de banda X, y el formato heredado para las señales de banda S. Si usa el paquete gr-difi GNU Radio, deberá asegurarse de seleccionar el formato de 108 bytes para la banda X y el formato de 72 bytes para la banda S. Para vRF que no sean GNU Radio necesitará asegurarse de que se usa la versión correcta de DIFI para los paquetes de contexto, la v1.1 puede encontrarse aquí y la versión heredada puede deducirse de esta sección de código. Más consideraciones se incluyen en vRF dentro de AOGS Reference al final de este tutorial.

Paso 1: Usar AOGS para programar un contacto y recopilar datos de Aqua

Primero quitamos el módem administrado, y capturamos los datos RF sin procesar en un archivo pcap. Ejecute los pasos listados en Tutorial: Descargar datos del satélite público Aqua de la NASA pero durante el paso Configurar un perfil de contacto para una misión de descarga de Aqua dejar en blanco Configuración de demodulación y elegir UDP para Protocolo. Por último, hacia el final, en lugar del comando socat (que captura los paquetes TCP), ejecute sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap para capturar los paquetes UDP en un archivo pcap.

Nota

Las siguientes tres modificaciones son necesarias para Tutorial: Descargar datos del satélite público Aqua de la NASA:

  • Configuración de la demodulación: dejar en blanco
  • Protocolo: elegir UDP
  • Pasos 8 y 9: en su lugar use el comando sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap

Después de un pase de satélite, debería tener un archivo /tmp/aqua.pcap de tamaño 10-20 GB (dependiendo de la elevación máxima). Este archivo contiene paquetes DIFI que contienen la señal RF sin procesar recibida por la estación terrestre, en forma de muestras IQ.

Paso 2: Extraer las muestras IQ de los paquetes DIFI

A continuación extraemos las muestras IQ y las guardamos en una forma más tradicional; un archivo binario IQ. Los siguientes pasos se pueden realizar en cualquier VM/ordenador que tenga una copia del archivo aqua.pcap que creó. Estos pasos implican el uso de un script de Python corto mantenido por DIFI Consortium para extraer los ejemplos de IQ de los paquetes DIFI UDP en un archivo IQ.

  1. Descargue o copie el código siguiente en un nuevo script de Python.
  2. Edite filename para que coincida donde haya guardado su pcap (/tmp/aqua.pcap).
  3. Ejecute el script de Python mediante python3 difi_to_binary_iq.pyy debe crear un nuevo archivo en el mismo directorio que el pcap, con una .cs8 extensión. Este archivo es el archivo IQ binario, que contiene los ejemplos de RF digitalizado como enteros de 8 bits y nada más. El script tarda algún tiempo en ejecutarse y, a medida que ejecuta el archivo, es mayor. Una vez completado el script, el archivo tiene aproximadamente el mismo tamaño que el archivo pcap. Puede detener el script antes de la finalización (con control-C) y continuar con el tutorial; la duración completa del contacto no es necesaria para el resto del tutorial.
  4. (Opcional) Si desea visualizar la señal, instale Inspectrum mediante https://github.com/miek/inspectrum/wiki/Build#building-on-debian-based-distros, a continuación, ejecute Inspectrum mediante inspectrum /tmp/aqua.pcap.cs8 (mediante la ruta de acceso al nuevo .cs8 archivo). Una vez en la GUI de Inspectrum, puede ajustar Power Max y Power Min ver el rango dinámico completo de la señal.

Si también desea que los ejemplos de IQ en formato float32 en lugar de int8 (algún software solo le permite cargar el formato float32), puede usar el siguiente fragmento de código de Python:

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

Usaremos la versión float32 para el siguiente paso, ya que simplifica el diagrama de radio GNU.

Paso 3: Demodular la señal Aqua en GNU Radio

A continuación creamos el módem vRF real, basado en GNU Radio, que se usa para demodular la señal Aqua.

Logo del proyecto de software libre GNU Radio.

GNU Radio es un conjunto de herramientas de desarrollo de software libre y de código abierto que proporciona bloques de procesamiento de señales y muchos ejemplos de aplicaciones de procesamiento digital de señales (DSP). Se puede usar con hardware de radiofrecuencia de bajo costo para crear radios definidas por software, o sin hardware en un entorno de simulación. GNU Radio es ampliamente utilizado en entornos de investigación, industria, academia, gobierno y aficionados para apoyar tanto la investigación de comunicaciones inalámbricas como los sistemas de radio del mundo real. En este tutorial, usamos GNU Radio para demodular Aqua (es decir, GNU Radio actúa como módem).

Aunque GNU Radio se puede usar en modo headless, en este tutorial1 usamos la GUI (es decir, la interfaz de escritorio) de GNU Radio, por lo que debes copiar /tmp/aqua.pcap.cf32 a una VM con X11 forwarding u ordenador con escritorio Ubuntu 20/22. El comando scp se puede usar para copiar el archivo desde una VM en Azure a una máquina de desarrollo local.

Install GNU Radio

Si usa Ubuntu 22, ejecuta sudo apt-get install gnuradio. Si en cambio usa Ubuntu 20, use los siguientes comandos para instalar GNU Radio:

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

Compruebe que GNU Radio se instaló correctamente y que los gráficos funcionan usando gnuradio-companion; debería aparecer una ventana parecida a esta:

Captura de pantalla de la GUI del escritorio de GNU Radio.

Si no se muestra el árbol de bloques de la derecha, puede mostrarlo con el icono de la lupa situado en la parte superior derecha.

Ejecución del diagrama de flujo Aqua

Una aplicación GNU Radio se denomina "flowgraph", y normalmente procesa o genera una señal RF. El diagrama de flujo inicial que se puede usar lo encontrará aquí. Abra este archivo .grc en GNU Radio y verá el siguiente diagrama de flujo:

Captura de pantalla del diagrama de flujo de GNU Radio Aqua.

Nota

Para aquellos que no estén interesados en los detalles de cómo funciona el diagrama de flujo/módem, pueden saltarse el siguiente párrafo

El diagrama de flujo comienza con la lectura del archivo IQ, convirtiéndolo de enteros intercalados de 8 bits al tipo de datos complejo de GNU Radio, luego remuestrea la señal para pasar de los 18,75 MHz originales a 15 MHz, que es un número entero de muestras por símbolo. Este remuestreo puede ser un poco confuso porque en el Perfil de Contacto especificamos un ancho de banda de 15 MHz. Como se explica al final de este tutorial, para las señales de banda X el digitalizador usa una frecuencia de muestreo que es 1.25 veces el ancho de banda especificado. Resulta que en este gráfico de flujo queremos una frecuencia de muestreo de 15 MHz, de forma que tengamos exactamente dos muestras por símbolo; por lo tanto debemos remuestrear de 18.75 MHz a 15 MHz. A continuación tenemos un bloque de control automático de ganancia (AGC), para normalizar el nivel de potencia de la señal. El filtro RRC (root raised cosine) actúa como filtro de adaptación. El bucle Costas realiza la sincronización de frecuencia para eliminar cualquier pequeña desviación de frecuencia causada por un error del oscilador o una corrección Doppler imperfecta. Los tres bloques siguientes se usan porque Aqua utiliza QPSK offset (OQPSK) en lugar de QPSK normal. A continuación, se realiza la sincronización de símbolos para que los símbolos OQPSK se muestreen en sus picos. Podemos visualizar este muestreo de QPSK con el bloque Constellation Sink (se muestra un ejemplo de salida). El resto del diagrama de flujo entrelaza las porciones real e imaginaria, y las guarda como int8's (chars/bytes) que representan los símbolos suaves. Aunque podría convertir estos símbolos blandos a 1's y 0's, el procesamiento posterior se beneficia de tener los valores completos de los símbolos.

Antes de ejecutar el flowgraph, haga doble clic en el bloque Origen de archivo y actualice la ruta de acceso para que coincida dondequiera que haya guardado /tmp/aqua.pcap.cf32. Haga clic en el botón de reproducción de la parte superior para ejecutar el diagrama de flujo. Si los pasos anteriores fueron exitosos, y su contacto Aqua fue un éxito, debería ver la siguiente densidad espectral de potencia (PSD) y el gráfico IQ:

Captura de pantalla de la densidad espectral de potencia (PSD) de GNU Radio Aqua.

Captura de pantalla del gráfico IQ de la señal Aqua.

El tuyo podría variar, en función de la intensidad que recibió la señal. Si no aparece ninguna GUI, compruebe la salida de GNU Radio en la parte inferior izquierda para ver si hay errores. Si la GUI aparece pero se parece a una línea ruidosa horizontal (sin hump), significa que el contacto no recibió realmente la señal Aqua. En este caso, compruebe que el seguimiento automático está habilitado en el perfil de contacto y que la frecuencia central se especificó correctamente.

El tiempo que tarda GNU Radio en finalizar se basa en cuánto tiempo se deja que se ejecute el script de pcap_to_iq, combinado con la potencia de CPU de la máquina virtual o el equipo. A medida que se ejecuta el flowgraph, se degrada la señal RF almacenada en /tmp/aqua.pcap.cf32 y la creación del archivo /tmp/aqua_out.bin, que contiene la salida del módem. No dude en copiar este archivo .bin fuera de la máquina virtual.

Con esto terminamos este tutorial. Si le interesa decodificar los bytes en imágenes, puede usar herramientas de la NASA o herramientas de código abierto como altillimity/X-Band-Decoders.

(Opcional) Paso 4: Ejecutar el flowgraph de GNU Radio en directo

Este tutorial hasta este punto representa la parte de diseño y prueba de la creación de un vRF. Transformamos este flowgraph de GNU Radio para que pueda ejecutarse en vivo en la VM, simulando un verdadero módem vRF.

Controlar la entrada

Anteriormente, convertíamos manualmente el paquete DIFI pcap a un archivo binario IQ, y luego cargábamos ese archivo binario IQ en GNU Radio con el bloque Fink Source. Podemos simplificar nuestro diagrama de flujo con un bloque dentro de gr-difi (mantenido por Microsoft) diseñado para recibir paquetes DIFI en GNU Radio. Este bloque adicional requiere que instalemos un módulo GNU Radio out-of-tree (OOT), que es como un complemento para 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

Después de estos pasos, podrá volver a abrir GNU Radio y ver los nuevos bloques (origen DIFI y receptor DIFI) en el árbol de bloques. En el diagrama de flujo que usó en la sección anterior, siga estos pasos:

  1. Reemplace el bloque Origen de archivo por un bloque Origen de DIFI.
  2. Haga doble clic en el bloque Origen DFI para editar sus parámetros.
  3. La Dirección IP de Origen debe ser la IP de la interfaz eth0 de su VM
  4. El Puerto debe ser 56001, igual que el que usamos en el paso tcpdump
  5. Establezca DIFI Stream Number en 0. Todos los demás parámetros pueden dejarse predeterminados

Si quiere probar este flowgraph en su máquina de desarrollo, necesita una herramienta como udpreplay para reproducir el pcap que grabamos. De lo contrario, puede esperar para probar esta parte hasta que el flowgraph se usa en directo en la VM conectada a Azure Orbital. Esta limitación es una de las razones por las que ayuda hacer una grabación de la señal durante la fase de desarrollo y pruebas del vRF.

Control de la salida

Puede optar por dejar el receptor de archivo al final, y recuperar el archivo grabado en cada pasada, pero muchas aplicaciones requieren transmitir los bytes fuera del módem. Una opción es usar bloque de receptor TCP en lugar del receptor de archivos. El bloque receptor TCP puede configurarse en modo servidor o cliente, en función del lado que deba realizar la conexión inicial. Establezca el Tipo de Entrada como Byte, y el Receptor TCP transmitirá los bytes a través de una carga útil TCP sin procesar.

ZMQ PUB Sink es otra opción, que es una biblioteca de mensajería que se asienta sobre TCP o la comunicación entre procesos (IPC), para un comportamiento más complejo como PUB/SUB.

Si lo deja como receptor de archivos, se recomienda agregar algunas líneas de Python al final del flowgraph (una vez finalizado) que copie el archivo creado en una nueva ubicación.

Ejecución del diagrama de flujo en modo sin encabezado

Hay una buena oportunidad de que la máquina virtual que recibe la secuencia de Azure Orbital no admita un entorno de escritorio, lo que hace que GNU Radio se bloquee. Debemos configurar este diagrama de flujo para evitar el uso de GUI.

  1. Edite el bloque Opciones en la parte superior izquierda
  2. En Opciones de Generación seleccione Sin GUI
  3. En Opciones de ejecución seleccione Ejecutar hasta el final
  4. Presione Aceptar

Estos pasos nos permiten ejecutar el diagrama de flujo como un script de Python sin GUI, y cuando el socket entrante se cierra, el diagrama de flujo debería finalizar automáticamente.

Captura de pantalla de GNU Radio ejecutándose en modo Headless.

Ejecución del diagrama de flujo en directo

Una vez configurado el diagrama de flujo con el origen DIFI y en modo sin encabezados, podemos ejecutar el diagrama de flujo en vivo en la máquina virtual. En GNU Radio Companion (GRC), cada vez que presionas el botón de reproducción, se crea un archivo .py en el mismo directorio. Este script de Python debe copiarse en la máquina virtual. Si GNU Radio y gr-difi se instalaron correctamente, se debería poder ejecutar el script Python mediante python yourflowgraph.py y éste esperará a que se inicie el flujo DIFI desde Azure Orbital. Puede agregar cualquier código de Python que desee a este script de Python, como copiar el archivo resultante en una nueva ubicación cada paso. Nota: si regenera el script Python dentro de GRC, este nuevo código Python se tiene que agregar manualmente de nuevo.

Si los pasos anteriores funcionaron, habrá creado e implementado correctamente un vRF de enlace descendente, basado en GNU Radio

vRF dentro de la referencia AOGS

En esta sección, proporcionamos varios detalles específicos de rf/digitalizador que son de interés para un usuario o diseñador de vRF.

En el lado de vínculo descendente, una vRF recibe una señal de Azure Orbital. Azure Orbital envía una secuencia DIFI a la máquina virtual del usuario durante un contacto satélite. Se espera que el usuario capture la secuencia en tiempo real, ya sea grabándola o procesandola en directo. Los ejemplos incluyen el uso de tcpdump, socat, o directamente ingerido en un módem. A continuación se muestran algunas especificaciones relacionadas con cómo la estación terrestre de Azure Orbital recibe y procesa la señal:

  • La frecuencia central se especifica en el perfil de contacto.
  • El ancho de banda de la señal (BW) se establece en el perfil de contacto, y la frecuencia de muestreo es 1.25*BW para la banda X y 1.125*BW para los contactos de banda S.
  • El flujo DIFI usa una profundidad de 8 bits (2 bytes por muestra IQ)
  • El modo de ganancia del digitalizador está configurado para usar el control automático de ganancia (AGC) con un objetivo de potencia de -10 dBFS
  • No se usa ninguna inversión espectral
  • No se usa ningún desplazamiento de frecuencia
  • El tamaño de la MTU de la VM de usuario debe establecerse en 3650 para la banda X y 1500 para la banda S, que es el tamaño máximo de paquete procedente de Azure Orbital.

En el enlace ascendente, el usuario debe proporcionar un flujo DIFI a Azure Orbital durante todo el paso, para que Azure Orbital transmita. Las notas siguientes pueden ser de interés para un diseñador vRF de vínculo superior:

  • La frecuencia central se especifica en Perfil de contacto
  • La frecuencia de muestreo de señal se establece a través del flujo DIFI (aunque se proporciona un ancho de banda como parte del perfil de contacto, es exclusivamente para la configuración de red en segundo plano).
  • La profundidad de bits se establece a través del flujo DIFI, pero Azure Orbital espera 8 bits.
  • El identificador del flujo DIFI debe ser 0.
  • De forma similar al vínculo de descarga, el tamaño de MTU debe ser 1 500 para S-Band y hasta 3 650 para X-Band (como prefiera)
  • No se usa ninguna inversión espectral
  • No se usa ningún desplazamiento de frecuencia

Pasos siguientes

Para implementar fácilmente los componentes de nivel inferior necesarios para recibir y procesar datos de observación de la tierra desde el espacio mediante Azure Orbital Ground Station, consulte: