一、介绍GNU radio
3.你的第一个流程图(Flowgraph)
3.1开始GNU Radio图形化界面GRC
GRC是一个创建流程图的可视化编辑器(visual editor),GRC中形成.grc文件,该文件随后被翻译为python文件。
通过CRTL+ALT+T或者在桌面右击鼠标打开终端。
在终端输入:gnuradio-companion
双击Options块并通过编辑Id和Title来命名流程图:
Id是 Python 流程图的文件名。将其命名为sineWaveFlowgraph.py。Title是对流程图的描述。单击确定以保存更改。
单击文件:保存GRC 流程图。
输入sineWaveGRC.grc作为.grc文件的名称,以将其与.py流程图区分开来。
信号源块文本从红色变为黑色。红色文本表示一个块仍有一个输入或输出需要连接,然后才能运行流程图。
打开文件浏览器。有两个文件。第一个文件是sineWaveGRC.grc,包含在 GRC 中显示流程图的信息。第二个文件是sineWaveFlowgraph.py,包含实际的 Python 流程图代码。
要点:
1. Options块并通过编辑Id和Title来命名流程图,ID是python文件名称,title描述该流程图特点。
2. 信号源模块文本从红色变为黑色。红色文本表示一个块仍有一个输入或输出需要连接,然后才能运行流程图。
3.run之后保存有两个文件.grc文件描述GRC里的流程图信息;.py文件是实际运行的python代码。
二、流程图基础
1.GRC中的python变量
本节描述了如何在GRC中使用python数据类型,和这些如何显示。
1.1CRC中的浮点数和整数
GRC使用python数据类型表示数字,在python中数字可以被表示为整数或浮点数:
整数可以被转换为浮点数通过float();同理,浮点数也可以被转换为整数int()。
GRC中数据类型转换可以在variable块中完成:
数字被转换为整数:
GRC 显示数字的方式与 Python 不同。例如,将samp_rate块添加到新流程图中。
samp_rate的值为32000但GRC 显示的值为32k。GRC 将所有数字转换为 SI 单位(国际单位制)。请注意,GRC可能以不同于 Python 中表示的格式显示数字。
再举一个例子,将一个新变量拖放到工作区中。双击编辑属性:
1.2GRC中的字符串
Python 使用单引号 ' 和双引号 " 来包含字符串:
1.3GRC中的列表和元组:
GRC 中的变量可以使用 Python 列表:
GRC 中的变量可以使用 Python 元组:
1.3list comprehension
list comprehension可以被用来在variable块中写函数,list comprehension用来遍历一个list。
1.4GRC中块的属性颜色
在编辑一个块的属性时GRC使用一个颜色方案来代表不同的数据类型,QT Frequency Sink块的属性如下:
属性中有橙色,绿色和紫色,每个颜色代表一种数据类型:
浮点数:橙色
整数:绿色
字符串:紫色
变量块的属性中没有颜色,因为它们可以代表任何一种数据类型。
2.流程图中的变量
要点:1.块的属性设置时可以设置为variable块,
2.variable块的value可以是变量表达式;
总的来说,GRC中的块是一个函数,且GRC中块的value的选取服从python语法规则。
3.GRC运行时更新变量的值
3.1QT GUI Range
Gnu radio模块库中附带QT GUI组件,这些组件允许在GRC流图运行时进行变量的修改,QT GUI Range创建一个银条用来拖动去更新一个变量
QT GUI Range像一个变量块一样工作,需要设置QT GUI Range的默认参数。双击QT GUI Range块以编辑属性。QT GUI Range块将替换频率变量,因此首先将Id字段更改为frequency。
默认值是流程图启动时的值。将默认值设置为 0。开始和停止是滑块的开始和停止值。输入-samp_rate/2作为起始值,输入 samp_rate/ 2作为停止值。Step值是滑块的分辨率。在本例中,步长设置为 100 Hz:
3.2 QT GUI Chooser
QT GUI选择器为变量创建一个选项下拉菜单。导航块库:Core、GUI Widgets、QT ,然后将QT GUI Chooser拖放到工作区中。
4.信号数据类型
要点:1.每个模块的输入输出端口都有特点的颜色标记,不同的颜色表示不同的数据类型,可以通过点击GRC工具栏中的help-types来查看每种颜色代表的数据类型;
2.复数:以32位复浮点数为例,用32比特浮点数表示实部,32比特浮点数表示虚部
sign1实部,sign2虚部
3.整个数据流的数据类型需要一致(如果不同需要加入转换模块);
5.数据类型转换
要点:1.char\byte数据类型是另一种常用的,byte用紫色表示,并标记为integer 8
2.convert模块支持数据类型转换。
6.比特打包
6.1
将bit打包为byte数据在表示二进制数据或一些场景下很常用,比如星座调制,GFSK调制以及OFDM发射器
点击随机信号源模块,按up或down键可以选择输出数据类型,当输出颜色位紫色时,为byte数据类型。
随机信号源输出的最小数为Minimum,最大值为Maximum-1,所以此例中输出0,1。
Pack k bits用来将数据平行化或者比特打包为单个byte表示更大的二进制数字。
6.2解释packing K bits Block
随机源输出byte类型数据,且有效值为0和1所以有效位为最低位LSB,pack k bits模块按输入的先后顺序(从最低有效位开始)存储并打包,因为该模块输出类型为byte且打包4位,所以最高4位补零,低四位是有效位。
6.3解包
解包过程为反过程。
将QT GUI直方图的输入数据数量改为2
可以看到两个数据完全重合。
7.streams和vectors
GNU Radio 中的块可以使用流或向量连接。一个流为每个时间点携带 1 个样本。流产生序列化数据。流必须具有数据类型,例如Float 32或Byte。
向量在每个时间点中携带多个样本。并行表示数据的向量。流表示每个时间实例的标量。一个向量表示每个时间实例的一个数组。
GRC 使用较浅的颜色来表示流,使用较深的颜色来表示向量输出:
流转换为向量:
向量转换为流:
注意块的名称,streams 、stream
8.hier 块和参数
本节介绍如何创建封装块hier blocks(或者说,层次块hierarchical block)
8.1创建最初的流图
更新QT GUI RANGE 和低通滤波器的属性;
8.2创建封装块(频移块)
点击并选中上述两个模块且包括连线;
在选择的区域单击右键选择more-creat hier
然后便会自动创建一个新GRC界面
双击options块编辑属性:
类别是可以在 GRC 右侧的模块库中找到块的位置。hier 块将位于GRC Hier Blocks下,而不是其余 GNU Radio 块所在的 Core 。
8.3参数VS变量
变量是函数内部的值,参数用以接收传入函数的值;以hier块为例,变量只存在于函数内部,可在函数内部修改其值,参数用于接受外部源的数据。
在这个例子中,只有将samp_rate由变量转换为参数才能够在别的GRC流程图中调用这个模块时改变输入参数值。
8.4输入输出端口
Pad被用来指定hier模块的输入输出端口,所以在流程图中需要添加一个pad source和一个pad sink用来指定输入输出端口。
8.5生成hier模块代码
做完上述的工作之后就可以生成hier模块代码了,点击generate the flow graph来生成代码;
对于 GNU Radio v3.8,将在您的主目录中生成一个 Python .py文件和 YAML .yml文件:
对于 GNU Radio v3.10,文件将在保存.grc文件的目录中创建。请创建.grc_gnuradio目录并在那里复制.py和.yml文件:
8.6使用hier模块
现在可以在流程图中使用hier块。返回起始流程图并删除Signal Source和Multiply块:
将移频器模块添加到工作区并将其连接到流程图的其余部分:
8.7删除hier块