GNU Radio 流程图编程(基于 GNU Radio Companion 平台)
GNU Radio 流程图编程(基于 GNU Radio Companion 平台)
0x00. GNU Radio 介绍
GNU Radio Companion (GRC) 是一个用来产生信号流程图及流程图源代码的图形化工具,是基于模块的仿真实验工具,类似于 MATLAB 中的 SIMULINK。它提供信号运行和处理模块,可以在易制作的低成本的射频硬件和通用微处理器上实现 软件定义无线电。这套套件广泛用于业余爱好者、学术机构和商业机构研究与构建无线通信系统。GRC 目前是同 GNU Radio 源代码捆绑在一起的。如果所有的依赖关系得以满足,GRC 便会在 GNU Radio 安装的同时被安装。其基本使用方法就是先将需要的模块放到窗口,再设置各个模块的参数,然后连接各个模块,绘制信号流程图,之后生成流程图,仿真运行。
0x01. 打开 GNU Radio
首先,安装好 GNU Radio 后,在终端输入命令:gnuradio-companion
来打开GRC,如图所示:
0x02. 使用搜索功能寻找相应的模块
按下 Ctrl+F,会自动弹出一个搜索框,然后输入模块的关键字 sink,可以看到很多关于 sink 的模块,如图所示:
0x03. 添加一个新的模块
然后,选中其中的 QT GUI Time Sink 模块,并通过 双击或拖动 的方式将其添加到工作区域中:
添加的 QT GUI Time Sink 模块结构如图所示:
0x04. 修改模块的参数
工作区域中包含了各种信号处理模块和变量。双击打开模块,可以设置它的参数属性。将 Canvas Size 修改为 300,300,然后单击确定按钮,如图所示:
可以发现,整个工作区域的面积变小了,如图所示:
选择菜单栏中的 Documentation 一栏,可以查看模块的文档信息,如图所示:
文档说明了 ID 是用来确定 python 文件名字和相关类的名字,保存的 python 文件会以 (id名).py 来进行命名。
然后,删除 ID 值 top_block,可以看到最下面出现了报错信息。同时 ID 也变成了红色,这样就能够很方便地确定错误所在的位置,如图所示:
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,如图所示:
0x05. 建立信号流程图
现在,建立一个将信号输出到示波器的流程图,并添加 Throttle 模块,这个模块可以 确保流程图不会消耗 100% 的 CPU 周期。流程图如图所示:
在添加了 Throttle 模块的情况下,使用命令 htop 查看 CPU 的利用情况,可以看出,CPU 占用较小,基本保持在 10% 以下,如图所示:
然后,在流程图中删去 Throttle 模块,直接连接信号源与波形输出,如图所示:
这时,再次查看 CPU 状态,可以明显发现,流图的运行占用了 100% 的 CPU,如图所示:
因此,当流图既没有连接硬件也没有连接 Throttle 的时候,CPU 基本是 满负载 运行的。
不管有几个输入或输出,在一个流图中只需要 一个 Throttle 就可以了。它起到了限速的作用。设置高的速率,流图执行快;而设置低的速率,流图执行慢。
而当有硬件连接时,就无需添加 Throttle 模块了,因为硬件本身已经对速率进行了限制。
0x06. 对 GUI 进行设置
Generate Options 有两种常用的设置:QT GUI 和 WX GUI。最常见的错误就是实际使用的 GUI 与设置的 Generate Options 不匹配。
如果 Generate Options 设置的是 QT GUI,但是构造的流程图却是 WX GUI,如下图所示:
就会得到如下的报错信息,说明类型不匹配:
如果反过来的话,也会得到类似的报错信息。
0x07. 查看输出结果
点击 Execute 按钮启动程序后,弹出图形的窗口,然后可以看到如下波形图:
通过观察,能够明显看出,这是一个 复数 类型的波形。
然后,打开 Help 下的 Types 菜单,可以看到不同数据类型所代表的颜色图例,如图所示:
这里基本上可以找到所有的数据类型。可以看到,上面流程图的接口是蓝色的,说明这是 32 位浮点型组成的复数形式,因此上面的输出产生两个波形。Time Sink 输入一个复数,并输出它的实部和虚部图形。
接下来,选用其它数据类型来修改信号源。选择 Float 以将其修改为浮点型,然后可以看到它的接口变成了橘黄色。
但是在将信号源和 Throttle Block 连接时,会出现红色的报错图标。
点击工具栏上的红色报错图标,可以看到具体的报错信息,如图所示:
报错信息显示,数据长度不匹配。这是由于 GNU Radio 不允许不同的数据类型之间直接连接。
因此,需要把所有的模块都改成浮点类型,如图所示:
然后再次点击运行,可以看到如下的波形图:
现在可以看到,只有一个波形输出,因为所有的数据类型都变为了 Float,即只有一个 实部。
下面更改之前选择的 GUI。将 QT GUI Time Sink 模块变为 WX GUI Scope Sink 模块,并将 Options 模块设置为 WX GUI,如图所示:
然后重新运行流程图,会打开一个 Scope Plot 窗口,如图所示:
改变 Channel Options,将 Marker 改为 Dot Large,可以看到真实采样点的值,信号频率是 1KHz,采样频率是 32KHz,如图所示:
可以发现,在一个周期内,共有 32 个采样点。
然后关闭 Scope Plot,将采样频率降到 10KHz ,如图所示:
重新产生并执行流图。可以观察到一个周期内新的采样点数变为 10 点,如图所示:
逐渐降低采样频率,首先将采样率降低为 5000,如图所示:
重新产生并执行流图。可以观察到一个周期内新的采样点数变为 5 点,如图所示:
然后,再将采样率降为 2kHz,即一个周期内采样 2 点,由于原信号频率为 1kHz,因此 2kHz 的采样率是保证基本波形的 最低采样率。
采样所产生的波形如图所示:
由上图可以看出,显然 2kHz 是仅仅能够保证基本波形的最低采样率。
然后,再次减小采样率至 1.5kHz,执行流图如下所示:
由波形图可以看出,小于最低采样率 2kHz 的波形已经失真,不能恢复出原始信号的形式。
进一步地,再次减小采样率至 1kHz。显然,此波形已经 完全失真,无法表征出任何关于原始信号的信息。
0x08. 对不同采样率的验证
首先,创建一个 GRC 流图,以验证不同的采样率之间的区别,配置各个部件的参数如下:
- 为 QT GUI Chooser 模块设置3个采样速率,并将 ID 改为 samp_rate;
- 将所有 source 模块的 Sampling Rate 改为 samp_rate;
- 对 Variable 模块设置音频模块采样率为 48k;
- 将所有 sink 模块的 Sampling Rate 改为 audio_rate;
- 因为这里已经有了音频硬件,因此无需添加 Throttle 模块。
配置好参数的流图如下图所示:
点击运行,设置 sample rate 为 48k,可以听到熟悉的 电话拨号音,产生的时域波形如图所示:
再观察 fft 的频域波形图,确实分别为两个 440Hz 和 350Hz 的频段,如图所示:
尝试调节改变信号源的 sampling rate 至 24k,可以听到声音的 频率变高,变得较为尖锐,产生的时域波形如图所示:
再观察 fft 的频域波形图,变成了两个 880Hz 和 700Hz 的频段,如图所示:
再次改变 sampling rate 至 16k,发出的声音更加 尖锐,产生的时域波形如图所示:
再观察 fft 的频域波形图,变成了两个 1320Hz 和 1050Hz 的频段,如图所示:
再次尝试改变信号源的 sampling rate ,使其比 audio sampling 高。
将其调整至 100kHz,如图所示:
这时,声音消失,产生的时域波形如图所示:
继续观察 fft 的频域波形图,可以明显发现,产生了频谱混叠,因此无法恢复出原始信号,没有声音产生,如图所示:
0x09. 瀑布图的生成
利用 Signal Source、Add 组件和 Waterfall Sink 模块,按照下图所示新建一个信号流图:
点击运行,可以看到,生成了下图所示的瀑布图:
下面,将第一个 Signal Source 的波形改为 三角波,如图所示:
更改为三角波后,再次运行流程图,此时瀑布图的频率分布发生了变化,如图所示:
其中,瀑布图发生变化的原因是:
由于在第一个流图中,两个信号源均为正弦波,而 正弦波的频率为一个固定的常量,因此在第一个瀑布图中只在 1kHz 与 5kHz 的两个信号源对应的频率点处有较大的信号强度。
而在第二个流图中,由于其中的一个信号源变为了三角波,而结合信号的基本知识可以得知,周期性三角波的傅里叶变换是由离散的频谱点组成的,因此可以分解为许多不同频率的正(余)弦信号,所以在第二个瀑布图的显示中,可以看到许多不同频率的地方均显示较强的信号强度。