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 |
@H_403_41@
-m / --modulation |
Select modulation from: psk,cpm,qpsk,dqpsk,gfsk,qam,dbpsk,bpsk,gmsk [default=psk] 选择调制方式 |
@H_403_41@
-s / --size |
Set packet size [default=1500] 设置发送每个数据包的大小(单位:字节) |
@H_403_41@
-M / --megabytes |
set megabytes to transmit [default=1.0] 设置一共发送的字节大小,默认为1百万bytes,根据-s 及 –M的参数,可以计算出发送数据包的个数 |
@H_403_41@
--discontinuous |
enable discontinous transmission (bursts of 5 packets),可以设置在发送端每发送5个包之后,停顿1s再继续发送 |
@H_403_41@
--from-file=FROM_FILE |
use intput file for packet contents 从文件中读取数据,然后发送 |
@H_403_41@
--to-file=TO_FILE |
Output file for modulated samples 注意:这里的意思是将要发送的数据保存到文件中,不再通过USRP发送出去 |
@H_403_41@
-r / --bitrate |
specify bitrate [default=100000.0] |
@H_403_41@
--tx-amplitude |
set transmitter digital amplitude: 0 <= AMPL < 1 [default=0.25] |
@H_403_41@
-f / --freq |
set Tx and/or Rx frequency to FREQ [default=none] 设置USRP的发送频率 |
@H_403_41@
-a / --args |
UHD device address args [default=] 可以不加,UHD会进行自动检测 |
@H_403_41@
--spec |
Subdevice of UHD device where appropriate |
@H_403_41@
-A / --antenna |
select Rx Antenna where appropriate 选择USRP的天线 |
@H_403_41@
--tx-freq=FREQ |
set transmit frequency to FREQ [default=none] (同-f) |
@H_403_41@
--lo-offset=LO_OFFSET |
set local oscillator offset in Hz (default is 0) |
@H_403_41@
--tx-gain=TX_GAIN |
set transmit gain in dB (default is midpoint) 设置USRP发送增益 |
@H_403_41@
-C / --clock-source |
select clock source (e.g. 'external') [default=none] 不用设置 |
@H_403_41@
-v --verbose |
打印一些程序中的信息 |
@H_403_41@
-S / --samples-per-symbol |
set samples/symbol [default=2] |
@H_403_41@
--log |
Log all parts of flow graph to file (CAUTION: lots of data) 将程序中的发送数据及处理中间的数据保存到log文件中 |
@H_403_41@
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中的系统框图:
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
@H_381_301@模块连接图Figure 3Benchmark TX模块连接
代码整理
我们都知道,python语言同样是从main函数开始运行的,那么benchmark是如何运行的呢?下面简单整理一下,首先从main函数开始。
BenchmarkTX的main函数位于benchmark_tx.py中,如Figure 4所示,可以看到,在main函数中,定义了send_pkt函数,之后进行读取命令行参数,并且实例化了一个对象tb,tb就是Figure 3中的my_top_block 的实例。
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
@H_381_301@模块连接图Figure6 Benchmark RX模块连接
@H_381_301@代码整理对于benchmark RX的函数调用流程,这里不再详细论述,基本上就是benchamrk_tx.py的反操作,这里总结一下几个重要函数所在的目录:
main |
benchmark_tx.py / benchmark_rx.py |
gnuradio-3.7.11/gr-digital / examples /narrowband |
@H_403_41@
txpath / rxpath |
transmit_path.py / receive_path.py |
gnuradio-3.7.11/gr-digital / examples /narrowband |
@H_403_41@
mod / demod |
generic_mod_demod.py |
gnuradio-3.7.11/gr-digital/python /digital |
@H_403_41@
mod_pkts demod_pkts |
pkt.py |
gnuradio-3.7.11/gr-digital/python /digital |
@H_403_41@
make_packet unmake_packet |
packet_utils.py |
gnuradio-3.7.11/gr-digital/python /digital |
@H_403_41@
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
Figure7 发送端运行图
Figure 8 接收端运行图
在接收端,pktno表示接收到的包的帧号,n_rcved 表示接收到的总总帧数,n_right表示接收数据包正确的帧数(通过CRC校验进行正确性判断)。