我们已经知道GNU Radio是一个各种信号处理模块的“容器”。在这里,我们将从一个简单的例子讲起,展示如何使用GNU Radio Companion(GRC).我们需要清楚的是,GRC是允许我们创建Python文件图形的,不过流程图的方式更加简化了GNU Radio的使用。
首先我们来看一下GNU Radio Companion的界面。它包括4个区域:模块库、工具栏、函数输出窗口和工作区域。
学会一个东西最好的方法就是亲自尝试,想到一个问题,然后自己找出答案。大家可以首先在界面摸索,打开GRC的方式,在终端输入命令:
gnuradio-companion
在右边的模块库里面有各种不同类型的信号处理模块,包括了GNU Radio的标准模块和我们初始化的模块。怎样快速的找到我们自己需要的模块呢?假设我们需要一个产生信号的模块,我们可以看到有一个叫做Waveform Generator的类型,打开就可以看到各种产生信号的模块了。那么假设我们需要一个展示波形图,但是又不确定哪种模块是效果最好的,又怎么办呢?我们在上一章节知道,有一个叫sink的类型,但是右边并没有发现sink的类型。这个时候我们就需要使用搜索的功能了,按Ctrl+f,或者点击搜索按钮,然后输入模块的关键字sink,我们可以看到很多关于sink的模块了:
现在让我们添加一个叫QT GUI Time Sink的模块。我们可以通过双击或拖动的方式。
工作区域里面包含各种信号处理模块和变量。我们双击打开模块,设置它的参数属性。如下图:
在不同的应用系统中,我们可能需要修改这些默认的参数。我们把原来的名字去掉,可以看到ID字样编程蓝色。这种颜色表明信息已经被修改,但是还没有保存。我们再尝试一下修改windows size为300,300,单击OK。然后我们可以看到尺寸的改变。然后,我们看到documentation:
看用颜色标记的字段,我们知道ID用来确定python文件名字和相关类的名字。
然后,我们删除掉ID里面的字符串,看到最底下出现了红色的报错信息,同时,ID也变成了红色,这样我们能够很方便的确定错误的所在。
为了方便,我们取ID的名字为”tutorial_two_1”,同时将Generate Options改成”QT GUI”,因为我们采用的是QT GUI sink,而不是WX GUI sink,在最新版的GNU Radio,默认的是QT GUI.GRC是一个图形化的界面,它是基于python环境的。所以当我们执行一个流程图时,实际上我们真的运行的是一个python程序。ID是用来命名python文件名,与GRC文件保存在同样的路径下。默认情况下,ID是top_block,所以它创建一个为top_block.py的文件。更改ID使我们可以更改保存的文件名,以更好进行文件管理。
这个GRC-Python连接另一个结果是,Python可以控制GRC的参数属性。事实上,所有的输入框属性或变量,我们使用时被解释为Python。这意味着我们可以使用Python调用设置属性,如调用NumPy或其他GNU Radio功能。这方面的一个常见用途是称为filter.firdes滤波器设计工具从GNU Radio建立我们的滤波器抽头。
注意的另一个关键是接口不同的颜色。这些实际上对应于不同的数据类型,我们将在本教程后面稍后覆盖。
现在我们了解如何找到块,如何将它们添加到工作区,以及如何编辑块属性,我们尝试建立一个将信号输出到示波器的流程图,注意模块之间的数据类型的匹配:
注意到有一个叫throttle block的模块:在本教程后面的更详细的解释是什么。现在,可以了解的是这个模块确保流程图不消耗100%的CPU周期,不然你的电脑可能反应不过来。
在此之前,我们先来看一下工具栏。
这里主要是一些流程图软件执行的一些命令,如新建,打开,保存等。让我们开始我们的流程图,我们给它取名叫做tutorial_two。这里有几个重要的工具,Generate flowgraph,excute flowgraph,分别是产生GRC,和运行GRC。在help里面的type,我们可以看到每种数据类型对应的颜色。
Generate Options有两种常用的设置QT GUI和WX GUI。最常见的错误就是设置的Generate Options与实际我们用的不匹配。具体来讲,就是我们Generate Options设置的是QT GUI,但是我们构造的流程图却是WX GUI我们会的到如下的报错信息:
反过来的话,也会得到类似的报错信息。所以,我们必须首先确定自己选用的是QT GUI还是WX GUI。
让我们点击Execute按钮启动程序,我们可以看到如下的波形:
这是一个复数类型的波形。我们简单化一些,选用别的数据类型。关掉程序,我们打开Help-Type,可以看到如下的数据类型的代表颜色:
在这里,我们基本上可以找到所有的数据类型。我们看到我们的流程图的接口是蓝色的,很明显这是32位浮点型组成复数形式,现在我们可以解释刚才输出有两个波形的情况了,Time Sink输入一个复数,然后输出它的实部和虚部。现在,我们尝试修改以下信号源的数据类型,将其改为浮点型,然后我们看到它的接口编程橘黄色的,当我们把它和Throttle Block连接时,看到有红色的报错,我们点击工具栏的红色的横杆,可以看到具体的报错信息:
报错信息显示,数据长度不匹配。这是由于我们的数据类型不匹配的原因。GNU Radio不允许不同的数据类型之间直接连接。我们把所有的模块都改成浮点型的,然后再次运行,可以看到如下的波形:
现在我们可以看到,只有一个波形输出了,我们可以尝试用鼠标放大或者缩小。
现在我们已经能够创建自己的流图了,我们进一步的来学习一些GNU Radio Companion有关知识。
首先,我们来讨论下Throttle Block,之前在我们的流图有用到过。下图是添加Throttle 模块和不添加Throttle 模块的CPU的使用率对比:
我们可以看到,当流图没有连接硬件也没有连接Throttle 的时候,CPU基本是满负载运行的。在一个流图中我们只需要一个Throttle 就可以了,不管它是有几个输入输出。我们可以认为Throttle 起到限速的作用,设置高的速率,流图执行快,设置低的速率流图执行慢。打个比方,比如我们设置Throttle 为1e6,另一个设置1e3,我们可以看到CPU在1e6的情况下比1e3占用更多的资源。当有硬件连接的时候,我们不需要Throttle 模块,因为硬件本身已经对速率有了限制。
我们已经知道硬件需要设定特定的采样率来实现某些特定的功能,现在我们来自己创建一个GRC,来看看不同的采样率之间有什么区别:
根据上图配置好参数:
QT GUI Chooser模块设置3个采样速率,ID改为samp_rate
所有的source模块的Sampling Rate改为samp_rate
音频模块改为48e3
所有的sink模块的sampling rate改为audio_rate
在这里,我们可以看到没有Throttle 模块,这是因为这里有音频硬件。点击运行,设置sample rate为48e3,可以听到熟悉的电话的拨号音,再看一下fft,确实有两个分别为440Hz和350Hz的频段。
尝试下,当改变sampling rate比audio sampling低的时候,看能否还能听到拨号音。再尝试下,当改变sampling rate比audio sampling高的时候,看能否还能听到拨号音。正常的话,应该听不到拨号音,因为声卡的速率和我们采样的速率不匹配。所以,任何时候,都应该设置正确的采样率。
现在来看一个由probe,soundcard以及QT Sink模块组成的正弦信号瀑布图:
请参考上图设置好参数,另外,必须注意的是Audio Sink的Sample Rate。设置好后,点击运行,可以看到:
现在我们应该知道流图的基本原理,能有找到自己需要的信号处理模块,正确的设置采样率。如何发现并定位错误,怎样设置相应的数据类型,用户可以自己动手,多多尝试,这样就能够比较快的上手GRC了。
粤ICP备20009059号 © Copyright 2019. All rights reserved. ettus.com.cn