【SDR】Gnuradio Benchmark介绍

0 说明

       最近为了检验编译码模块的空口性能,故基于Gnuradio软件中的benchmark程序进行了空口程序的测试,在该过程中,不仅对python语言进行了初步的了解,并且需要gnuradio中的模块编写框架熟悉,前前后后花费一个多月的时间,故在此进行一下整理总结,也方便有需要的人,难免有错,请见谅!
       关于Gnuradio的介绍及安装,可以自行Google以及查看相关教程,这里不再做介绍。我所使用的Gnuradio版本为 gnuradio-3.7.11,环境 Ubuntu 14.04,其中benchmark收发程序的目录为 gnuradio-3.7.11/gr-digital/examples/narrowband,发送端程序的入口为benchmark_tx.py,接收端程序的入口为benchmark_rx.py,两者均为python的可运行脚本。下面先来讲如何运行,然后对代码框架进行一个详解,希望对大家有用!

1  Benchmark运行

1.1 发送端

       在linux命令行中输入:./benchmark_tx.py–h 可以查看benchmark_tx.py运行时的命令参数,以下对几个重点进行介绍,其余的参数,感兴趣的可以自己研究一下。

-h / --help

show this help message and exit

-m / --modulation

Select modulation from: psk, cpm, qpsk, dqpsk, gfsk, qam, dbpsk, bpsk, gmsk [default=psk] 选择调制方式

-s / --size

Set packet size [default=1500] 设置发送每个数据包的大小(单位:字节)

-M / --megabytes

set megabytes to transmit [default=1.0] 设置一共发送的字节大小,默认为1百万bytes,根据-s 及 –M的参数,可以计算出发送数据包的个数

--discontinuous

enable discontinous transmission (bursts of 5 packets),可以设置在发送端每发送5个包之后,停顿1s再继续发送

--from-file=FROM_FILE

use intput file for packet contents 从文件中读取数据,然后发送

--to-file=TO_FILE    

Output file for modulated samples 注意:这里的意思是将要发送的数据保存到文件中,不再通过USRP发送出去

-r / --bitrate

specify bitrate [default=100000.0]

--tx-amplitude

set transmitter digital amplitude: 0 <= AMPL < 1 [default=0.25]

-f / --freq

set Tx and/or Rx frequency to FREQ [default=none] 设置USRP的发送频率

-a / --args

UHD device address args [default=] 可以不加,UHD会进行自动检测

--spec

Subdevice of UHD device where appropriate

-A / --antenna

select Rx Antenna where appropriate 选择USRP的天线

--tx-freq=FREQ

set transmit frequency to FREQ [default=none] (同-f)

--lo-offset=LO_OFFSET

set local oscillator offset in Hz (default is 0)

--tx-gain=TX_GAIN

set transmit gain in dB (default is midpoint) 设置USRP发送增益

-C / --clock-source

select clock source (e.g. 'external') [default=none] 不用设置

-v --verbose

打印一些程序中的信息

-S / --samples-per-symbol

set samples/symbol [default=2]

--log

Log all parts of flow graph to file (CAUTION: lots of data) 将程序中的发送数据及处理中间的数据保存到log文件中

1.2 接收端

       在linux命令行中输入:./benchmark_rx.py–h 可以查看benchmark_rx.py运行时的命令参数,可以看到其和发送端的参数基本一致,这里不再进行详细解释。

2  Benchmark TX &Benchmark RX

2.1 综述

       相信看到这里的朋友们都明白,gnuradio benchmark实现了通过USRP进行简单的数据收发工作,即发送端可以将要发送的数据经过处理之后,通过USRP发送出去,而接收端通过USRP接收后,通过相应的操作将数据“解”出来,简单点说,其是一个简单的通信系统,有信源、信道、信宿,期间还涉及到调制解调,CRC校验等等,当然,也可以自己添加功能模块进行测试,下面看一下gnuradio中benchmark中的系统框图:

【SDR】Gnuradio Benchmark介绍_第1张图片
Figure 1 benchmark系统框图

Figure 2 benchmark帧结构

       Figure 1为benchmark的系统框图,其中发送端首先需要指定发送数据的size(default 1500),然后程序中根据命令参数size,产生(size-2)的随机数(或者从文件中读取数据),之后在数据前边加上2bytes的帧号,之后添加32bits CRC,再之后添加Header,即帧号+信息比特+CRC的长度,并且是两次,即每次都是两个字节;最后添加Preamble以及Access Code,其中Access code是用来在接收端做相关接收使用的,即接收端根据Access code的相关性,找到数据的“起始位置”,配合Header的数据长度,得到payload;Preamble的使用没有做研究,有兴趣的朋友们可以研究一下。

      下面对benchmark_tx.py 以及benchamark_rx.py 进行一下讲解,如果只是用这两个程序来传输指定的数据,可能你还真需要研究一下程序。

2.2 Benchmark TX

模块连接图

【SDR】Gnuradio Benchmark介绍_第2张图片

Figure 3 Benchmark TX模块连接

代码整理

        我们都知道,python语言同样是从main函数开始运行的,那么benchmark是如何运行的呢?下面简单整理一下,首先从main函数开始。

       BenchmarkTX的main函数位于benchmark_tx.py中,如Figure 4所示,可以看到,在main函数中,定义了send_pkt函数,之后进行读取命令行参数,并且实例化了一个对象tb,tb就是Figure 3中的my_top_block 的实例。

【SDR】Gnuradio Benchmark介绍_第3张图片

Figure 4 benchmark_tx.py main函数(1)

【SDR】Gnuradio Benchmark介绍_第4张图片

Figure 5 benchmark_tx.py main函数(2)

       如Figure 5中所示,tb.start()表示程序开始运行,首先产生一定长度(size-2)的随机数据或者从文件中读取数据,并且在数据前面添加帧号,之后调用send_pkt函数将payload发送出去,帧号自加,最后是发送等待;另外,程序中还可以添加--discontinuous进行间断发送,每发送一个包,输出打印一个点号。

       下面继续看send_pkt函数,Figure 4中可以看到,其只是return tb.txpath.send_pkt()函数的返回值,因此,需要去看txpath中的函数send_pkt(),其调用顺序为:main::send_pkt() ----> txpath::send_pkt() ----> digital::mod_pkts::send_pkt() ---> packet_utils::make_packet

       经过packet_utils::make_packet,即完成了数据包的封帧工作,之后连接到modulator模块进行调制,之后通过usrp发送出去。

2.3 Benchmark RX

模块连接图

【SDR】Gnuradio Benchmark介绍_第5张图片

Figure6 Benchmark RX模块连接

代码整理

        对于benchmark RX的函数调用流程,这里不再详细论述,基本上就是benchamrk_tx.py的反操作,这里总结一下几个重要函数所在的目录:

main

benchmark_tx.py / benchmark_rx.py

gnuradio-3.7.11/gr-digital / examples

/narrowband

txpath / rxpath

transmit_path.py / receive_path.py

gnuradio-3.7.11/gr-digital / examples

/narrowband

mod / demod

generic_mod_demod.py

gnuradio-3.7.11/gr-digital/python

/digital

mod_pkts

demod_pkts

pkt.py

gnuradio-3.7.11/gr-digital/python

/digital

make_packet

unmake_packet

packet_utils.py

gnuradio-3.7.11/gr-digital/python

/digital

3 运行

       发送端:

./benchmark_tx.py -f 915M -A TX/RX -m qpsk --tx-amplitude=0.5 -r 250k -S 4 -s 528

       接收端:

         ./benchmark_rx.py-f 915M -A TX/RX -m qpsk --rx-gain=17.5 -r 250k -S 4

【SDR】Gnuradio Benchmark介绍_第6张图片

Figure7 发送端运行图

【SDR】Gnuradio Benchmark介绍_第7张图片

Figure 8 接收端运行图

         在接收端,pktno表示接收到的包的帧号,n_rcved 表示接收到的总总帧数,n_right表示接收数据包正确的帧数(通过CRC校验进行正确性判断)。

4 参考文献

    [1] http://gnuradio.cc/simple/?t622.html  benchmark例程详解(不断更新中)
    [2] https://www.youtube.com/watch?v=dgW44CRho1Y 




你可能感兴趣的:(SDR,gnuradio,ubuntu,python)