初级教程(1)介绍 GNU Radio
1.什么是 GNU 无线电?

GNU Radio 是一个免费的开源软件开发工具包,它提供信号处理块来实现软件无线电。它可以与现有的低成本 RF 外设硬件一起使用来创建软件定义的无线电,或者仿真使用不需要硬件。它广泛用于研究、工业、学术界、政府和业余爱好者环境,以支持无线通信研究和现实世界的无线电系统。
下面显示了 GNU Radio Companion 可视化编辑器中的示例流程图:

GNU Radio 是一个框架,使用户能够设计、仿真和部署功能强大的现实无线电系统。它是一个高度模块化、面向“流程图”的框架,带有一个综合的处理模块库,可以很容易地组合起来制作复杂的信号处理应用程序。GNU Radio 已被用于大量现实世界的无线电应用,包括音频处理、移动通信、跟踪卫星、雷达系统、GSM 网络、Digital Radio Mondiale 等等——所有这些都实现在计算机软件中。它本身并不是针对任何特定硬件的解决方案。它也不为特定无线电通信标准(例如 802.11、ZigBee、LTE 等)提供开箱即用的应用程序,
为什么我需要 GNU Radio?
以前,在开发无线电通信设备时,工程师必须开发专门电路用于检测特定信号类型,设计能够解码或编码特定传输的专用集成电路,并使用昂贵的设备进行调试。
软件无线电 (SDR) 采集模拟信号,在物理和经济可行的范围内转移到通用计算设备处理,使用软件算法在计算机上处理无线电信号。
当然,您可以从头编写计算机与无线电设备互联的程序,各个算法需要将数据移入移出。但这很快就会变得麻烦:为什么要重新实现标准滤波器?为什么你必须关心数据如何在不同的处理块之间移动?使用高度优化和同行审核的实现,而不是自己编写东西不是更好吗?你如何让你的程序在多核架构上很好地扩展,同时在功耗只有几瓦的嵌入式设备上也能很好地运行?您真的要自己编写所有 GUI 吗?
使用 GNU Radio:一个专用于为商用计算机编写信号处理应用程序的框架。GNU Radio 将功能包装在易于使用的可重用块中,提供出色的可扩展性,提供广泛的标准算法库,并针对各种通用平台进行了大量优化。它还附带了大量示例,可帮助您入门。
本页的其余部分简要介绍了 DSP,如果您已经熟悉 DSP,请随时跳到下一个教程。
数字信号处理
作为一个软件框架,GNU Radio 使用通用计算机处理数字化信号以生成通信功能。
一点信号理论
在软件中进行信号处理需要信号是数字的。但什么是数字信号?
为了更好地理解,让我们看一个常见的“信号”场景:使用手机录制语音进行传输。
一个人说话会产生声音信号——在这种情况下,该信号由人的声带产生的不同气压波组成。信号是随时间变化的物理量,例如气压。

当波到达麦克风时,它会将变化的压力转换为电信号,即可变电压:

既然信号是电信号,我们就可以使用它了。此时的音频信号是模拟的——计算机还不能处理它;对于计算处理,信号必须是数字的,这意味着两件事:
它只能是有限数量的值之一。
信号会随时间变化,但对于每一瞬间,它只取一个值——而且该值不是来自某个“连续体”(比如[−1.5;+1.5],但来自一些有限集(如{−1.50,−1.49,……,+1.49,+1.50}).

因此,该数字信号可以用样本的数字序列表示。样本之间的固定时间间隔是信号采样率。
获取物理量(电压)并将其转换为数字样本的过程由模数转换器(ADC) 完成。互补设备是数模转换器(DAC),它从数字计算机获取数字并将其转换为模拟信号。
现在我们有了一个数字序列,我们的计算机可以用它做任何事情。例如,它可能会应用数字滤波器、对其进行压缩、识别语音或使用数字链路传输信号。
将数字信号处理应用于无线电传输
与声音相同的原理可以应用于无线电波:
可以使用天线将信号(此处为电磁波)转换为变化的电压。

然后,该电信号位于载波频率上,通常为几兆赫甚至千兆赫兹。
不同类型的接收器(例如超外差接收器、直接转换接收器、低中频接收器)可以作为专用软件无线电外围设备,可以通过商业渠道购买。用户可以使用(例如连接到声卡的业余无线电接收器)或者可以购买电视棒(臭名昭著的RTL-SDR项目)。
一种模块化的、基于流程图的数字信号处理方法
要处理数字信号,可以直接将各个处理阶段(滤波、校正、分析、检测…)视为处理块,可以使用简单的流向指示箭头将其连接起来:

在构建信号处理应用程序时,将构建一个完整的块图。这样的图在 GNU Radio 中称为流程图。

GNU Radio 是一个框架,用于开发这些处理块并创建流程图,其中包括无线电处理应用程序。
作为 GNU Radio 用户,您可以将现有的块组合成一个高级流程图,它可以执行与接收数字调制信号一样复杂的事情,GNU Radio 将自动在这些块之间移动信号数据,并在数据准备好处理时进行处理.
GNU Radio 带有大量现有的模块。所有这些的索引都可以在Block Docs中找到。仅向您提供标准安装中可用内容的一小部分,以下是一些最流行的块(Block)类别及其一些成员:
- 波形发生器
- 恒源
- 噪声源
- 信号源(例如正弦波、方波、锯齿波)
- 调制器
- 调幅解调器
- 连续相位调制
- PSK调制/解调
- GFSK调制/解调
- GMSK 调制/解调
- QAM 调制/解调
- WBFM 接收
- NBFM接收
- 仪器(即 GUI)
- 星座Sink
- 频率Sink
- 直方图Sink
- 号码Sink
- 时间栅格Sink
- 时间Sink
- 瀑布Sink
- 数学运算符
- 绝对值
- 加
- 复共轭
- 除
- 积分
- Log10
- 乘
- RMS
- 减
- 信道模型
- 信道模型
- 衰减信道模型
- 动态信道模型
- 频率选择性衰减信道模型
- 滤波器
- 带通/抑制滤波器
- 低通/高通滤波器
- IIR滤波器
- 通用滤波器组
- 希尔伯特
- 抽取 FIR 滤波器
- 根升余弦滤波器
- FFT滤波器
- 傅立叶分析
- 快速傅里叶变换
- 对数功率 FFT
- Goertzel(重采样器)
- 分数重采样器
- 多相任意重采样器
- 理性重采样器(同步器)
- 时钟恢复MM
- 关联和同步
- 科斯塔斯环路
- FLL 带边
- PLL 频率检测
- PN相关器
- 多相时钟同步
使用这些块(Block),只需将适当的块(Block)连接到信号处理流程图,即可完成许多标准任务,例如标准化信号、同步、测量和可视化。
此外,您可以编写自己的块(Block),将现有块(Block)与一些智能结合起来以提供新功能和一些逻辑,或者您可以开发自己的块(Block)来处理输入数据和输出数据。
因此,GNU Radio 主要是一个用于开发信号处理模块及其交互的框架。它带有一个广泛的块标准库,并且有许多可用的系统可供开发人员构建。然而,GNU Radio 本身并不是准备好执行特定操作的软件——尽管它已经附带了许多有用的工作示例,但用户的工作是从中构建有用的东西。将其视为一组构建块(Block)。
2.安装 GNU Radio
快速入门
Ubuntu 22.04 | sudo apt-get install gnuradio | v3.10.1.1 |
---|---|---|
Ubuntu 20.04 | sudo add-apt-repository ppa:gnuradio/gnuradio-releases sudo apt-get update sudo apt-get install gnuradio python3-packaging | v3.10.5.1 |
Windows | Install the latest Radioconda installer Launch “GNU Radio Companion” from the Start menu | v3.10.5.1 |
macOS | Install Homebrewbrew install gnuradio | v3.10.5.1 |
其他安装方法
特定于平台的指南
跨平台指南
- Conda install guide
- PyBOMBS – 注意:我们不再将 PyBOMBS 作为安装 GNU Radio 的推荐方法,除非您想使用旧版本(例如 GR 3.7、3.8 和匹配版本的 OOT)
VMs 和 Live Images
多年来,已经创建了许多 Live Images 和 VM。目前没有官方版本,但这里有一些当前选项:
- Instant GNU Radio一个可定制的、以编程方式生成的 VM 和 GNU Radio 的实时环境。
- UbuntuVM带有 GNU Radio 3.8.2.0、Fosphor、GQRX 和其他几个有用软件的 Ubuntu 20.04 虚拟机映像。(使用 Instant GNU Radio 创建)
好的,它已经安装好了,现在呢?
3.你的第一个流程图
本教程描述了如何在 GNU Radio 中创建和运行您的第一个流程图。
本指南假定已安装 GNU Radio。GNU Radio 安装结构在这里:安装 GNU Radio。下一个教程GRC 中的 Python 变量描述了如何在 GNU Radio Companion (GRC) 中使用 Python 数据类型。
启动 GNU Radio Companion
GNU Radio Companion (GRC) 是一个用于创建和运行流程图的可视化编辑器。GRC 使用.grc文件,然后将其转换为 Python .py流程图。
按CTRL + ALT + T或右键单击桌面并选择Open in Terminal打开终端:

在终端中输入:
$ gnuradio 伴侣 &
GRC 窗口打开:

双击Options块并通过编辑Id和Title命名流程图:

Id是 Python 流图的文件名。将其命名为sineWaveFlowgraph。标题是流程图的描述。单击“确定”保存更改。
单击文件:保存以保存 GRC 流程图。

输入sineWaveGRC.grc作为.grc文件的名称,以区别于 Id。

GRC 文件被命名并保存。
添加块
添加块以创建第一个流程图。GNU Radio 带有一个信号处理模块库。可以使用右侧的箭头浏览块。也可以使用CTRL + F或选择放大镜(以红色突出显示)来搜索块:

搜索信号源块,然后将其拖放到 GRC 工作区中:

现在搜索Throttle、QT GUI Frequency Sink和QT GUI Time Sink。将每个块拖放到工作区中。流程图应如下所示:

Signal Source块将创建一个复数的正弦信号,QT GUI Frequency Sink将显示频谱的幅度,QT GUI Time Sink将显示时域。Throttle块用于在没有无线电硬件的情况下进行流量控制 。
块需要连接。首先单击Signal Source的输出(以红色突出显示),然后单击Throttle的输入(以橙色突出显示)。

Signal Source块文本从红色变为黑色。红色文本表示块仍有输入或输出需要连接才能运行流程图。将油门输出连接到频率接收器和时间接收器:

运行流程图
按播放按钮(以红色突出显示)运行流程图:

一个新窗口显示时域和频域中的信号:

成功!流程图正在运行。
打开文件浏览器。有两个文件。第一个文件是sineWaveGRC.grc,包含在 GRC 中显示流程图的信息。第二个文件是sineWaveFlowgraph.py,包含实际的 Python 流程图代码。Options 块中的Id确定.py文件的名称。

继续学习下一个教程GRC 中的 Python 变量,它描述了如何在 GRC 中使用 Python 数据类型。