你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:通过使用 GNU Radio 进行 Aqua 卫星信号解调来了解虚拟 RF (vRF)

教程:来自公共卫星的下行链路数据中,来自 NASA Aqua 卫星的数据使用托管调制解调器向下链路,这意味着地面站从 Aqua 卫星接收的原始 RF 信号通过 Azure Orbital 管理的调制解调器进行传输。 然后,此调制解调器的输出(采用字节形式)流式传输到用户的虚拟机 (VM)。 在为公共卫星下行链路任务配置联络配置文件步骤中,“解调配置”设置为“Aqua 直接广播”,它会启用并配置托管调制解调器来解调/解码从 Aqua 接收的 RF 信号。 使用 vRF 概念时,不会使用托管的调制解调器,而是将原始 RF 信号发送到用户的 VM 进行处理。 此概念适用于下行链路和上行链路,但在本教程中,我们将探讨下行链路过程。 我们基于 GNU Radio 创建一个 vRF,GNU Radio 会处理原始 RF 信号并充当调制解调器。

本指南介绍如何:

  • 了解使用 vRF 的限制和权衡。
  • 通过 vRF 而不是托管的调制解调器来配置联络配置文件。
  • 使用 GNU Radio 充当调制解调器,在脱机/开发设置下实时地处理来自 Aqua 的下行链路数据(采用原始 RF 的形式)。

先决条件

了解使用 vRF 的限制和权衡

在深入学习本教程之前,请务必了解 vRF 的工作原理,并了解它与使用托管调制解调器的比较。 使用托管的调制解调器时,整个物理 (PHY) 层都发生在 Azure Orbital 中,这意味着会在 Azure Orbital 的资源中立即处理 RF 信号,并且用户仅接收调制解调器生成的信息字节。 选择 vRF 后,没有托管的调制解调器,原始 RF 信号从地面站数字转换器流式传输到用户。 通过此方法,用户可运行自己的调制解调器,或者捕获 RF 信号供以后处理。

vRF 的优点包括能够使用 Azure Orbital 不支持或无权访问的调制解调器。vRF 还允许通过调制解调器运行相同的 RF 信号,同时尝试不同的参数来优化性能。 可使用此方法来减少测试期间所需的卫星通过次数并加快开发速度。 由于原始 RF 信号的性质,数据包/文件大小通常大于该 RF 信号中包含的字节数,通常大 2-10 倍之间。 数据更多意味着 VM 和 Azure Orbital 之间的网络吞吐量可能是 vRF 的限制因素。

在本教程中,你将亲自了解 vRF 的工作原理。 在本教程的最后,提供了 vRF 用户感兴趣的许多特定于 RF 和数字转换器的详细信息。

DIFI 在 vRF 中的作用

Azure Orbital 的地面站由使用 DIFI 发送和接收数字化 RF 信号的数字转换器组成。 DIFI 数据包协议在技术上称为“IEEE-ISTO Std 4900-2021:数字 IF 互操作性标准”,它定义了一个数据平面接口,用于通过标准 IP 网络发送和接收数字化的 IF 数据(例如 IQ 样本)和相应的元数据。 尽管 DIFI 是一种“IF”标准,基带的 IQ 样本也可使用 DIFI 进行流式传输,就像使用 Azure Orbital 一样。 DIFI 数据包的主要用例是在卫星地面站数字转换器(收发器)和软件调制解调器之间创建接口,从而实现互操作性,并应对困扰卫星行业的供应商锁定情况。

DIFI 数据包协议包含两种主要的消息类型:数据包和上下文数据包。 由于旧硬件的原因,上下文数据包有两个不同的版本。 Azure Orbital 的地面站对 X 波段信号使用最新的 (DIFI v1.1) 上下文数据包,对 S 波段信号使用旧格式。 如果使用 gr-difi GNU Radio 包,需要确保为 X 波段选择 108 字节格式,为 S 波段选择 72 字节格式。 对于非 GNU Radio vRF,需要确保对上下文数据包使用正确版本的 DIFI,可在此处找到 v1.1,可从此代码部分推断出旧版本。 在本教程的最后,AOGS 中的 vRF 参考信息提供了更多注意事项。

步骤 1:使用 AOGS 安排联络点并收集 Aqua 数据

首先,移除托管的调制解调器,并将原始 RF 数据捕获到 pcap 文件中。 执行教程:来自 NASA Aqua 公共卫星的下行链路数据中列出的步骤,但是在为 Aqua 下行链路任务配置联络配置文件步骤中,将“解调配置”留空,并选择 UDP 作为协议。 最后,在快要结束时,运行 sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap 来将 UDP 数据包捕获到 pcap 文件中,而不是使用 socat 命令(该命令捕获 TCP 数据包)。

注意

教程:来自 NASA Aqua 公共卫星的下行链路数据要求进行下面三项修改:

  • 解调配置:留空
  • 协议:选择 UDP
  • 步骤 8 和 9:改为使用命令 sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap

卫星通过后,应该会有一个大小 10-20 GB 的文件 /tmp/aqua.pcap(大小取决于最大高度)。 此文件包含 DIFI 数据包,其中包括地面站接收的 IQ 样本形式的原始 RF 信号。

步骤 2:从 DIFI 数据包中提取 IQ 样本

接下来,提取 IQ 样本并用更传统的形式(二进制 IQ 文件形式)保存它们。 可在具有你创建的 aqua.pcap 文件的副本的任何 VM/计算机上执行以下步骤。 这些步骤涉及到使用 DIFI Consortium 维护的短 Python 脚本将 IQ 样本从 UDP DIFI 数据包提取到 IQ 文件中。

  1. 以下代码下载或复制到新的 Python 脚本。
  2. 编辑 filename 以匹配你保存 pcap 的任何位置 (/tmp/aqua.pcap)。
  3. 使用 python3 difi_to_binary_iq.py 运行 Python 脚本,它应使用 .cs8 扩展在 pcap 所在的相同目录中创建一个新文件。 此文件是二进制 IQ 文件,其中包含数字化 RF 样本作为 8 位整数,没有其他任何内容。 脚本需要一些时间才能运行,并且随着它的运行,文件会变大。 脚本完成时,该文件的大小与 pcap 文件大致相同。 可在完成之前停止脚本(使用 Ctrl-C),然后继续学习教程;在教程的其余部分,不需要在整个时间保持联系。
  4. (可选)如果要可视化信号,请使用 https://github.com/miek/inspectrum/wiki/Build#building-on-debian-based-distros 安装 Inspectrum,然后使用 inspectrum /tmp/aqua.pcap.cs8 运行 Inspectrum(使用新 .cs8 文件的路径)。 进入 Inspectrum GUI 后,可以调整 Power MaxPower Min 来查看信号的完整动态范围。

如果还希望 IQ 样本采用 float32 格式而不是 int8(某些软件仅支持加载 float32 格式),可使用以下 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')

我们将在下一步中使用 float32 版本,因为它简化了 GNU Radio 流程图。

步骤 3:在 GNU Radio 中解调 Aqua 卫星信号

接下来,基于 GNU Radio 创建实际的 vRF 调制解调器,用来解调 Aqua 卫星信号。

Logo for GNU Radio Free Software Project.

GNU Radio 是一个免费的开源软件开发工具包,它提供了信号处理块和许多示例数字信号处理 (DSP) 应用程序。 它可与现成的低成本 RF 硬件一起使用来创建软件定义的无线电,或者在类似模拟的环境中在没有硬件的情况下使用。 GNU Radio 广泛用于研究、工业、学术界、政府和业余爱好者环境,以支持无线通信研究和实际无线电系统。 在本教程中,我们使用 GNU Radio 来解调 Aqua 卫星信号(也就是说,GNU Radio 充当调制解调器)。

尽管可在无外设模式下使用 GNU Radio,但在本教程中,我们使用 GNU Radio 的 GUI(即桌面接口),因此必须将 /tmp/aqua.pcap.cf32 复制到具有 X11 转发的 VM 或具有 Ubuntu 20/22 桌面的计算机。 可使用 scp 命令将文件从 Azure 上的 VM 复制到本地开发计算机。

安装 GNU Radio

如果使用的是 Ubuntu 22,请运行 sudo apt-get install gnuradio。 如果使用的是 Ubuntu 20,则使用以下命令安装 GNU Radio:

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

验证 GNU Radio 是否正确安装且图形是否正在使用 gnuradio-companion;应该会弹出如下所示的窗口:

Screenshot of the GNU Radio desktop GUI.

如果未显示右侧的块树,可使用右上角的放大镜图标显示它。

运行 Aqua 流程图

GNU Radio 应用程序称为“流程图”,它通常处理或生成 RF 信号。 可在此处下载要使用的入门级流程图。 在 GNU Radio 中打开此 .grc 文件,应该会看到以下流程图:

Screenshot of the GNU Radio Aqua flowgraph.

注意

对于那些对流程图/调制解调器工作原理的细节不感兴趣的用户,可跳过以下段落

流程图首先读取 IQ 文件,将其从交错的 8 位整数转换为 GNU Radio 的复杂数据类型,然后重新采样信号,使其从原始 18.75 MHz 转换为 15 MHz(即每个符号的样本整数)。 这里的重新采样可能有点令人困惑,因为在联络配置文件中,我们指定了 15 MHz 的带宽。 正如本教程末尾所讨论的,对于 X 波段信号,数字转换器使用的采样率是指定带宽的 1.25 倍。 事实证明,在此流程图中,我们需要 15 MHz 的采样率,以便每个符号正好有两个样本;因此,我们必须从 18.75 MHz 重新采样到 15 MHz。 接下来,我们有一个自动增益控制 (AGC) 块,用来规范化信号功率电平。 根升余弦 (RRC) 筛选器充当匹配的筛选器。 Costas 环执行频率同步,以消除由振荡器误差或不完美的多普勒校正引起的任何较小的频率偏移。 使用接下来的三个块,因为 Aqua 使用偏移 QPSK (OQPSK) 而不是常规 QPSK。 然后执行符号同步,以便在其峰值时对 OQPSK 符号进行采样。 我们可使用星座图 (Constellation Sink) 块可视化此 QPSK 采样(显示了示例输出)。 流程图的其余部分将实部和虚部交替排列,并将它们保存为 int8(字符/字节)来表示软符号。 虽然它可以将这些软符号转换为 1 和 0,但具有完整符号值有利于后期处理。

在运行流程图之前,请双击文件源块,并更新路径以匹配保存 /tmp/aqua.pcap.cf32 的任何位置。 单击顶部的播放按钮以运行流程图。 如果前面的步骤成功,并且 Aqua 联络成功,应该会看到以下功率谱密度 (PSD) 和 IQ 图:

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

Screenshot of the IQ plot of the Aqua signal.

根据接收到的信号强度,你的内容可能有所不同。 如果未显示任何 GUI,请在左下角检查 GNU Radio 的输出来查看错误。 如果显示了 GUI,但它类似于水平噪声线(没有驼峰),则表示联络实际上未收到 Aqua 信号。 在这种情况下,请仔细检查在联络配置文件中已启用自动跟踪并正确输入了中心频率。

GNU Radio 完成所需的时间取决于你让 pcap_to_iq 脚本运行的时间和计算机/VM CPU 功率。 流程图运行时,它会解调 /tmp/aqua.pcap.cf32 中存储的 RF 信号并创建 /tmp/aqua_out.bin 文件,其中包含调制解调器的输出。 随时都可从 VM 中复制此 .bin 文件。

本教程到此为止。 如果有兴趣将字节解码为图像,可使用 NASA 的工具altillimity/X-Band-Decoders 等开源工具。

(可选)步骤 4:实时运行 GNU Radio 流程图

到目前为止,本教程代表了有关创建 vRF 的设计/测试部分。 我们转换此 GNU Radio 流程图,以便它可在 VM 上实时运行,这与真正的 vRF 调制解调器相同。

处理输入

之前,我们手动地将 DIFI 数据包 pcap 转换为了二进制 IQ 文件,然后使用 Fink 源块将该二进制 IQ 文件加载到 GNU Radio 中。 我们可以使用 gr-difi 中的块来简化流程图;gr-difi 由 Microsoft 进行维护,旨在将 DIFI 数据包接收到 GNU Radio! 添加的这个块确实要求我们安装 GNU Radio 树外 (OOT) 模块,这类似于 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

完成这些步骤后,你应该能够重新打开 GNU Radio,并看到块树中列出的新块(DIFI 源和 DIFI 接收器)。 在上一部分使用的流程图中,执行以下步骤:

  1. 将“文件源”块替换为“DIFI 源”块
  2. 双击“DIFI 源”块以编辑其参数
  3. 源 IP 地址应为 VM 的 eth0 接口的 IP
  4. 端口应为 56001,就像我们在 tcpdump 步骤中使用的一样
  5. 将“DIFI 流编号”设置为 0。 其他所有参数可保留默认值

如果要在开发计算机上测试此流程图,需要 udpreplay 之类的工具来播放我们记录的 pcap。 否则,可等待测试此部分,直到在连接到 Azure Orbital 的 VM 上实时使用流程图。 这个限制是它有助于在 vRF 开发和测试阶段记录信号的原因之一。

处理输出

可以选择在最后保留文件接收器,并检索每次卫星通过时记录的文件,但许多应用程序需要从调制解调器流式传输字节。 一种方法是使用 TCP 接收器块代替文件接收器。 TCP 接收器块可配置在服务器或客户端模式下,具体取决于哪个端应建立初始连接。 将“输入类型”设置为“字节”,TCP 接收器通过原始 TCP 有效负载流式传输字节。

还可使用 ZMQ PUB 接收器,它是一个消息传递库,位于 TCP 或进程间通信 (IPC) 之上,适用于 PUB/SUB 等更复杂的行为。

如果将其保留为文件接收器,建议在流程图的末尾(流程图完成后)添加几行 Python 来将创建的文件复制到新位置。

在无外设模式下运行流程图

接收 Azure Orbital 流的 VM 很可能不支持桌面环境,这会导致 GNU Radio 崩溃。 我们必须配置此流程图来避免使用 GUI。

  1. 编辑左上角的选项块
  2. 在“生成选项”下,选择“无 GUI”
  3. 在“运行选项”下,选择“运行直到完成”
  4. 点击“确定”

通过这些步骤,可在没有 GUI 的情况下将流程图作为 Python 脚本运行,当传入套接字关闭时,流程图应自动结束。

Screenshot of GNU Radio running in Headless Mode.

实时运行流程图

使用 DIFI 源在无外设模式下配置流程图后,就可在 VM 上实时运行流程图。 在 GNU Radio Companion (GRC) 中,每次点击播放按钮时,都会在同一目录中创建一个 .py 文件。 需要将此 Python 脚本复制到 VM 上。 如果正确安装了 GNU Radio 和 gr-difi,你应该能够使用 python yourflowgraph.py 运行 Python 脚本,并等待 Azure Orbital 中的 DIFI 流启动。 可随意将所需的任何 Python 代码添加到此 Python 脚本,例如每次卫星通过时将生成的文件复制到新位置。 注意:如果在 GRC 中重新生成 Python 脚本,则必须再次手动添加这个新的 Python 代码。

如果上述步骤成功,则表示你已基于 GNU Radio 成功创建和部署了下行链路 vRF!

AOGS 中的 vRF 参考信息

在本部分中,我们提供了 vRF 用户或设计人员感兴趣的许多特定于 RF/数字转换器的详细信息。

在下行链路端,vRF 接收来自 Azure Orbital 的信号。 在卫星联系期间,Azure Orbital 会将 DIFI 流发送到用户的 VM。 用户需要实时捕获流,要么就记录它,要么实时处理它。 示例包括使用 tcpdump、socat 或直接引入到调制解调器。 接下来是与 Azure Orbital 地面站如何接收和处理信号相关的一些规范:

  • 中心频率在联络配置文件中指定
  • 信号带宽 (BW) 在联络配置文件中设置,X 波段的采样率为 1.25*BW,S 波段联络的采样率为 1.125*BW
  • DIFI 流使用 8 位深度(每个 IQ 样本 2 个字节)
  • 数字转换器的增益模式设置为使用自动增益控制 (AGC),功率目标为 -10 dBFS
  • 不使用频谱反转
  • 不使用频率偏移
  • X 波段的用户 VM MTU 应设置为 3650,S 波段的应设置为 1500,这是来自 Azure Orbital 的最大数据包大小

在上行链路端,用户必须在整个卫星通过期间向 Azure Orbital 提供一个 DIFI 流,以便 Azure Orbital 进行传输。 上行链路 vRF 设计者可能对下面的说明感兴趣:

  • 中心频率在联络配置文件中指定
  • 信号采样率通过 DIFI 流设置(即使带宽作为联络配置文件的一部分提供,它也纯粹用于后台的网络配置)
  • 位深度通过 DIFI 流设置,但 Azure Orbital 需要 8 位深度
  • DIFI 流 ID 应设置为 0
  • 与下行链路类似,S 波段的 MTU 大小应为 1500,X 波段(所选项)的 MTU 大小最大应为 3650
  • 不使用频谱反转
  • 不使用频率偏移

后续步骤

若要使用 Azure Orbital 地面站轻松部署接收和处理星载地球观测数据所需的下游组件,请参阅: