基于USRP&GNU Radio的软件无线电平台

       软件定义的无线电(Software Defined Radio,SDR) 是一种无线电广播通信技术,它基于软件定义的无线通信协议而非通过硬连线实现。换言之,频带、空中接口协议和功能可通过软件下载和更新来升级,而不用完全更换硬件。

       SDR 针对构建多模式、多频和多功能无线通信设备的问题提供有效而安全的解决方案。SDR 能够重新编程或重新配置,从而通过动态加载新的波形和协议可使用不同的波形和协议操作。这些波形和协议包含各种不同的部分,包括调制技术、在软件中定义为波形本身的一部分的安全和性能特性。

       近来,基于硬件设备USRP和PC端的无线电信号处理软件GNU Radio构建SDR来进行无线电信号处理和研究成为热点。本文用通俗的语言对此平台进行介绍。

一、软件无线电(Software Defined Radio,SDR)

首先,我们从一个图看起。如下图1,数字通信系统模型。


            基于USRP&GNU Radio的软件无线电平台_第1张图片
图 1 数字通信系统模型

在数字通信系统模型中信号源产生某种需要发送的信号或消息(必须是数字信号,比如0,1序列),经过编码、加密、调制等一系列处理(不同的通信模式下,这些步骤不都是必须的,目前也无需管这些处理具体是什么)将处理过的信号送入信道。通过信道到达接收端。再对接收到的信号经过一系列逆处理,还原出信源的发送信号。我们强调信号在送入信道之前,信源信号和之后的一系列处理都是在数字模式下进行(信号流为数字流),后面的逆处理过程也是如此。如果我们选择的信道为有线信道,则数字信号可以直接送入信道进行传输。但本实验进行的是无线通信,即信道选择为无线信道。如此,数字信号是无法直接进行发送的。数字信号必须转换为模拟信号才能在空间中传播。同样接收端也需要接收此模拟信号,然后转化为数字信号进行逆处理。那将数字信号转化为模拟信号,并发送;接收模拟信号,并转化为数字信号这一过程就需要具体的设备来完成,这个设备我们选取的就是USRPUSRP其实可以简单理解为一个信号转换器和收发器,对USRP如何具体完成此功能的我们后面详述。


现在我们回到数字信号的处理流程上来。数字信号的产生和一系列处理、逆处理,除了上图中提到的步骤外,还可以细分和丰富出更多步骤。我们可以将每一步的处理(实现某单一功能)称为一个“block”。一定有一个起始的blockhead)来产生数据,再将数据传送给下一个block继续处理,如此传递下去一定有最后一个blockend)完成并结束数据在单个通信端的处理过程。在本实验的发送端就是:数据从blockhead)产生到最终blockend)交给USRP的过程;在接收端就是:blockhead)从USRP接收数据并进行一系列逆处理的过程到达“信息宿”blockend)。我们将每一个blockhead)到blockend)的数据处理过程称为一个“flow-graph”,对照图1,就像是数据依次在各个block间流动一样。


现在我们有了“block”和“flow-graph”的基本概念。每一个block在具体实现上有多种方式。最直观的就是电路板上焊接的一个个信号处理模块,每一个信号处理模块通过导线连接形成一个“flow-graph”。但这种实现方法有很大的局限性。这些硬件成本很高,提供的功能模块毕竟有限,而且组合也不灵活。如果将这些模块通过软件实现,那我们理论上可以编写出无穷多的模块—blocksblock的功能通过具体的算法实现,而且完全可以根据用户需要来构建自己的“flow-graph”。通过软件实现的“flow-graph”在一台PC机上完成,如果需要同其他设备进行无线通信,通过USRP将数据转化并发送出去即可,接收端同理。这一实现信号收发和处理的方式就是“一种”软件无线电(software defined radioSDR)的方式。无线电是无线电通信,软件是相对于使用专门的硬件模块实现“block”来说的。其通信模型可以重新描述如下图2

基于USRP&GNU Radio的软件无线电平台_第2张图片

图 2 软件定义的无线通信模型



二、软件无线电平台的软件—GNU Radio

GNU Radio — 看上去很美。

1. C++ blocks

 

我们已经了解,使用软件对信号进行处理就是编写具体的实现某种单一功能的block(这里强调单一功能是为了使block可以复用,就像“类”一样。当然也可以将几个block重新组合自定义为一个功能更强大的block,这点后面详述)。因为信号处理是比较复杂又要求效率的运算,最好的实现方式就是使用c++来编写单个block。有了单个的block,我们还需要根据具体应用将blocks组合成一个“flow-graph”来实现信号的完整处理。因为要互相连接,那每个block就必须包含两部分内容:功能区和IO接口。IO接口就涉及到:端口数量,数据类型等问题。将所需的block连接成为一个“flow-graph”后,还需要有唯一的“标识”来代表整个“flow-graph”,进而对“flow-graph”进行控制:run(),start(),wait(),stop(),lock(),unlock()等。这里我们引入一个概念“top_block”。top_block用来唯一表示一个“flow-graph”,一个“flow-graph”只能有一个top_block。单个block之间的连接和组合就是在top_block下定义的。通过对top_block的控制来实现对整个flow-graph的控制。

例如,

    tb = my_top_block

    tb.start()

    tb.stop()

    .................................................

这里我们就引入了“分层”(Hierarchical)的概念。top_block位于block结构的顶层,唯一代表flow-graph,在其下再调用各个功能的block来完成flow-graph。而且在整个flow-graph中,一定有一个blockhead)—信源,一定有一个blockend)—信宿。上图2中,发送端显示有一“信息源”,接收端有一“信息宿”。实际上发送和接收各构成一个flow-graph,分别各有一个“信源”和一个“信宿”。发送端的信宿设定USRP的参数并将数据输出给USRP;接收端的信源设定USRP的参数,并接收USRP的数据输出。

实际上,我们上面提到的top_block在实现上可以是一个python封装,作为分层模块的顶层模块,代表一个flow-graph,用于派生子类。我们使用c++来具体实现各个功能模块—block,为什么又引入python呢,见下节。

 

2. 从c++ python

    

在上节我们说明了我们需要在一个top_block下进行各个block的调用来完成flow-graph。在flow-graph的构建过程中,我们往往只需要知道block的功能,参数设定和它与其他block的连接方式。至于内部的实现细节并不是我们关心的。假定我们现在已经写好了各个功能的block。如果我们提供一种方式将c++模块封装为可执行模块,定义好传参接口,IO接口(用于与其他block连接)等。在构建flow-graph时,直接调用封装好的block,连接完成后就可以直接运行。这样就会极大的简化flow-graph的开发过程,并且使整个信号处理流程逻辑清晰,便于维护和重组。

 

这时我们就引入了pythonPython是一种解释性语言,无需编译链接,可直接执行。我们使用一种叫swig的工具可以将c++模块封装为python模块。我们整个flow-graph都基于python模块构建。首先定义一个my_top_block(top_block的子类),然后在my_top_block下调用其他block或者block的某个功能函数实现我们需要实现的功能,最后将各部分功能连接起来就可以直接执行了。

 

3. GNU Radio—千呼万唤始出来

 

对于GNU Radio先给个官方定义:GNU Radio was designed to develop DSPdigital signal process) applications from Python。就是说:GNU Radio被设计为用python语言来开发数字信号处理应用的。

 

不考虑GNU Radio已有的可直接调用的blocks, GNU Radio其实就是提供了一种集成环境(集成了Pythonswig等多种工具)。首先使用一种GNU Radio提供的工具gr_modtool生成一个工程。我们需要在此工程下根据GNU Radio的规则编写c++代码。然后此工具会自动生成cmakemake等文件,并且自动添加swig文件。通过编译、安装就生成了可以直接调用的“python” block

 

GNU Radio另一个强大的地方在于它已经定义和封装好了各个功能的block,包括唯一标识flow-graphtop_block。通过编写Python程序调用其现有的block,我们就已经可以进行各种数字信号处理(digital signal processDSP)的开发。GNU Radio将现有的block文件(包括封装好的Python block和其调用的c++可执行文件)组织成一个文件架构,形成一个“tree”。使得我们在开发Python程序时方便的调用所需blocks

 

如果需要编写和开发自定义的block就需要使用上文提到的gr_modtool。使用此工具生成的工程文件就是一个“out-of-treemodule(正如我们摘要里提到的)。当然,通过buildinstall最终会将生成的block集成入“tree”里,使其可以像其它block一样方便被调用。

 

如此,GNURadio就成为了我们进行数字信号处理可以依赖的有力工具。

 

 

 



你可能感兴趣的:(基于USRP&GNU Radio的软件无线电平台)