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