GNU Radio 流程图编程(基于 GNU Radio Companion 平台)

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)

  • 0x00. GNU Radio 介绍
  • 0x01. 打开 GNU Radio
  • 0x02. 使用搜索功能寻找相应的模块
  • 0x03. 添加一个新的模块
  • 0x04. 修改模块的参数
  • 0x05. 建立信号流程图
  • 0x06. 对 GUI 进行设置
  • 0x07. 查看输出结果
  • 0x08. 对不同采样率的验证
  • 0x09. 瀑布图的生成

0x00. GNU Radio 介绍

GNU Radio Companion (GRC) 是一个用来产生信号流程图及流程图源代码的图形化工具,是基于模块的仿真实验工具,类似于 MATLAB 中的 SIMULINK。它提供信号运行和处理模块,可以在易制作的低成本的射频硬件和通用微处理器上实现 软件定义无线电。这套套件广泛用于业余爱好者、学术机构和商业机构研究与构建无线通信系统。GRC 目前是同 GNU Radio 源代码捆绑在一起的。如果所有的依赖关系得以满足,GRC 便会在 GNU Radio 安装的同时被安装。其基本使用方法就是先将需要的模块放到窗口,再设置各个模块的参数,然后连接各个模块,绘制信号流程图,之后生成流程图,仿真运行。

0x01. 打开 GNU Radio

首先,安装好 GNU Radio 后,在终端输入命令:gnuradio-companion 来打开GRC,如图所示:
GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第1张图片

0x02. 使用搜索功能寻找相应的模块

按下 Ctrl+F,会自动弹出一个搜索框,然后输入模块的关键字 sink,可以看到很多关于 sink 的模块,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第2张图片

0x03. 添加一个新的模块

然后,选中其中的 QT GUI Time Sink 模块,并通过 双击或拖动 的方式将其添加到工作区域中:
GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第3张图片
添加的 QT GUI Time Sink 模块结构如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第4张图片

0x04. 修改模块的参数

工作区域中包含了各种信号处理模块和变量。双击打开模块,可以设置它的参数属性。将 Canvas Size 修改为 300,300,然后单击确定按钮,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第5张图片
可以发现,整个工作区域的面积变小了,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第6张图片
选择菜单栏中的 Documentation 一栏,可以查看模块的文档信息,如图所示:

在这里插入图片描述
文档说明了 ID 是用来确定 python 文件名字和相关类的名字,保存的 python 文件会以 (id名).py 来进行命名。

然后,删除 ID 值 top_block,可以看到最下面出现了报错信息。同时 ID 也变成了红色,这样就能够很方便地确定错误所在的位置,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第7张图片
GRC 是一个图形化的界面,它是基于 python 环境的。所以在执行一个流程图时,实际上运行的是一个 python 程序。其中的 ID 用来命名 python 文件,与 GRC 文件保存在同样的路径下。默认情况下,ID 是top_block,所以它创建了一个名为 top_block.py 的文件。更改 ID 就可以更改保存的文件名,以更好地进行文件管理。

GRC 与 python 的连接还可以通过 python 来控制 GRC 的参数属性。所有的输入属性或变量在使用时都会被解释为 python。因此,可以通过调用 python 来设置属性。

接下来,取 ID 名为tutorial_two_1。同时,因为采用的是 QT GUI sink,而不是 WX GUI sink,因此还要将 Generate Options 改成 QT GUI,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第8张图片

0x05. 建立信号流程图

现在,建立一个将信号输出到示波器的流程图,并添加 Throttle 模块,这个模块可以 确保流程图不会消耗 100% 的 CPU 周期。流程图如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第9张图片
在添加了 Throttle 模块的情况下,使用命令 htop 查看 CPU 的利用情况,可以看出,CPU 占用较小,基本保持在 10% 以下,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第10张图片
然后,在流程图中删去 Throttle 模块,直接连接信号源与波形输出,如图所示:
GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第11张图片
这时,再次查看 CPU 状态,可以明显发现,流图的运行占用了 100% 的 CPU,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第12张图片
因此,当流图既没有连接硬件也没有连接 Throttle 的时候,CPU 基本是 满负载 运行的。

不管有几个输入或输出,在一个流图中只需要 一个 Throttle 就可以了。它起到了限速的作用。设置高的速率,流图执行快;而设置低的速率,流图执行慢。

而当有硬件连接时,就无需添加 Throttle 模块了,因为硬件本身已经对速率进行了限制。

0x06. 对 GUI 进行设置

Generate Options 有两种常用的设置:QT GUI 和 WX GUI。最常见的错误就是实际使用的 GUI 与设置的 Generate Options 不匹配

如果 Generate Options 设置的是 QT GUI,但是构造的流程图却是 WX GUI,如下图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第13张图片
就会得到如下的报错信息,说明类型不匹配:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第14张图片
如果反过来的话,也会得到类似的报错信息。

0x07. 查看输出结果

点击 Execute 按钮启动程序后,弹出图形的窗口,然后可以看到如下波形图:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第15张图片
通过观察,能够明显看出,这是一个 复数 类型的波形。

然后,打开 Help 下的 Types 菜单,可以看到不同数据类型所代表的颜色图例,如图所示:
GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第16张图片
这里基本上可以找到所有的数据类型。可以看到,上面流程图的接口是蓝色的,说明这是 32 位浮点型组成的复数形式,因此上面的输出产生两个波形。Time Sink 输入一个复数,并输出它的实部和虚部图形

接下来,选用其它数据类型来修改信号源。选择 Float 以将其修改为浮点型,然后可以看到它的接口变成了橘黄色。

但是在将信号源和 Throttle Block 连接时,会出现红色的报错图标。

点击工具栏上的红色报错图标,可以看到具体的报错信息,如图所示:
GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第17张图片
报错信息显示,数据长度不匹配。这是由于 GNU Radio 不允许不同的数据类型之间直接连接

因此,需要把所有的模块都改成浮点类型,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第18张图片
然后再次点击运行,可以看到如下的波形图:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第19张图片
现在可以看到,只有一个波形输出,因为所有的数据类型都变为了 Float,即只有一个 实部

下面更改之前选择的 GUI。将 QT GUI Time Sink 模块变为 WX GUI Scope Sink 模块,并将 Options 模块设置为 WX GUI,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第20张图片
然后重新运行流程图,会打开一个 Scope Plot 窗口,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第21张图片
改变 Channel Options,将 Marker 改为 Dot Large,可以看到真实采样点的值,信号频率是 1KHz,采样频率是 32KHz,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第22张图片
可以发现,在一个周期内,共有 32 个采样点。

然后关闭 Scope Plot,将采样频率降到 10KHz ,如图所示:

在这里插入图片描述
重新产生并执行流图。可以观察到一个周期内新的采样点数变为 10 点,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第23张图片
逐渐降低采样频率,首先将采样率降低为 5000,如图所示:

在这里插入图片描述
重新产生并执行流图。可以观察到一个周期内新的采样点数变为 5 点,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第24张图片
然后,再将采样率降为 2kHz,即一个周期内采样 2 点,由于原信号频率为 1kHz,因此 2kHz 的采样率是保证基本波形的 最低采样率

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第25张图片
采样所产生的波形如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第26张图片
由上图可以看出,显然 2kHz 是仅仅能够保证基本波形的最低采样率。

然后,再次减小采样率至 1.5kHz,执行流图如下所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第27张图片
由波形图可以看出,小于最低采样率 2kHz 的波形已经失真,不能恢复出原始信号的形式

进一步地,再次减小采样率至 1kHz。显然,此波形已经 完全失真,无法表征出任何关于原始信号的信息。

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第28张图片

0x08. 对不同采样率的验证

首先,创建一个 GRC 流图,以验证不同的采样率之间的区别,配置各个部件的参数如下:

  1. 为 QT GUI Chooser 模块设置3个采样速率,并将 ID 改为 samp_rate;
  2. 将所有 source 模块的 Sampling Rate 改为 samp_rate;
  3. 对 Variable 模块设置音频模块采样率为 48k;
  4. 将所有 sink 模块的 Sampling Rate 改为 audio_rate;
  5. 因为这里已经有了音频硬件,因此无需添加 Throttle 模块

配置好参数的流图如下图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第29张图片
点击运行,设置 sample rate 为 48k,可以听到熟悉的 电话拨号音,产生的时域波形如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第30张图片
再观察 fft 的频域波形图,确实分别为两个 440Hz 和 350Hz 的频段,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第31张图片
尝试调节改变信号源的 sampling rate 至 24k,可以听到声音的 频率变高,变得较为尖锐,产生的时域波形如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第32张图片
再观察 fft 的频域波形图,变成了两个 880Hz 和 700Hz 的频段,如图所示:
GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第33张图片
再次改变 sampling rate 至 16k,发出的声音更加 尖锐,产生的时域波形如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第34张图片
再观察 fft 的频域波形图,变成了两个 1320Hz 和 1050Hz 的频段,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第35张图片
再次尝试改变信号源的 sampling rate ,使其比 audio sampling 高。

将其调整至 100kHz,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第36张图片
这时,声音消失,产生的时域波形如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第37张图片
继续观察 fft 的频域波形图,可以明显发现,产生了频谱混叠,因此无法恢复出原始信号,没有声音产生,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第38张图片

0x09. 瀑布图的生成

利用 Signal Source、Add 组件和 Waterfall Sink 模块,按照下图所示新建一个信号流图:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第39张图片
点击运行,可以看到,生成了下图所示的瀑布图:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第40张图片
下面,将第一个 Signal Source 的波形改为 三角波,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第41张图片
更改为三角波后,再次运行流程图,此时瀑布图的频率分布发生了变化,如图所示:

GNU Radio 流程图编程(基于 GNU Radio Companion 平台)_第42张图片
其中,瀑布图发生变化的原因是:

由于在第一个流图中,两个信号源均为正弦波,而 正弦波的频率为一个固定的常量,因此在第一个瀑布图中只在 1kHz 与 5kHz 的两个信号源对应的频率点处有较大的信号强度。

而在第二个流图中,由于其中的一个信号源变为了三角波,而结合信号的基本知识可以得知,周期性三角波的傅里叶变换是由离散的频谱点组成的,因此可以分解为许多不同频率的正(余)弦信号,所以在第二个瀑布图的显示中,可以看到许多不同频率的地方均显示较强的信号强度。

你可能感兴趣的:(GNU,Radio,Companion,通信原理)