USRP-OFDM通信系统实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一利用GNU-Radio和USRP搭建OFDM通信系统

图1,基于GNU-Radio和USRP的OFDM通信系统示意图

1 实验设备

●设备清单

●开发环境

操作系统:Ubuntu 14.04 64bit

软件平台:GNU-Radio v3.7.8 UHD release_003_009_001

2 实验目的

●理解OFDM信号的调制和解调原理;

●熟悉使用GNU-Radio软件并对信号进行处理;

●学会使用软件GNU-Radio和硬件USRP来完成点对点设备的通信。

3 实验内容

本实验是在Linux桌面应用系统Ubuntu上进行的,使用到的包括一款免费的无线电和信号处理开发软件—GNU-Radio,和通用软件无线电外设硬件—USRP N210。实验的任务是在GUN-Radio和USRP组成的软硬件平台,搭建了基于OFDM调制的无线通信环境,以便更好的了解OFDM通信原理和信号在无线信道中传播的特点。实验主要包括三部分:发送端、信道和接收端。其中发送端主要包括信源、符号映射、子载波分配、IFFT并加CP、USRP TX;无线信道所处的是室内环境,也被称为准静态信道环境(这也为接收端的均衡提供了思想);接收端主要包括USRP RX、同步、去CP FFT、信道估计和均衡、解符号映射、信宿。

4 实验步骤

4.1 发送端

在OFDM通信系统中,发送端需要完成以下几个功能:信源编码、数据打包、符号映射、子载波分配、IFFT变换、加CP、USRP发送射频信号等。除USRP模块外其它几个模块中的信号处理都是在GNR-Radio中完成的,也即在主机中完成。USRP模块拥有单独的DSP 和FPGA模块,因此可以独立对输入数据进行处理。在USRP模块里面需要完成很多的功能,比如抽取、数字上变频、A/D转换、混频等功能都是在其中完成的。发送端的主要目的是完成信号的调制、上变频、功放,最后通过专用天线将其发送到无线信道中去。考虑到若上变频后的信号幅度过大,在经过功放后可能导致信号失真,因此需要在USRP模块前增加一个限幅器模块。

图2,OFDM通信系统的发送端实验流程图

4.1.1 数据帧结构

实验开始时一帧数据的长度规定为96个字节,其中每个字节包含8个比特。信源不断地产生0和1的比特序列,经过数据打包模块(B模块)后变成上述固定长度的帧数据。数据流经过CRC校验后,会在一帧数据的末尾增加4个字节,这时一帧数据便变成了100字节。这些有用的信息称为payload,其采用的是QPSK调制方式,注意经过QPSK映射后一帧数据的长度变成了100*8/2=400个QPSK符号。接着,针对每一帧数据需要生成一个帧头,用来记录当前帧的一些信息,比如帧长、这是第几帧等信息。实验中帧头信息长度为6个字节共48个比特,帧头中的信息称为Header,采用BPSK方式调制,故其长度不变。Payload 和Header需要复合在一起才能进行传输,一般将Header置于Payload之前形成新的帧结构,这时一帧数据的长度又发生了变化,变成了400+48=448个符号。在实验中一个OFDM符号的长度设定为64(即总载波个数为64),除去虚拟载波、直流子载波和射频子载波还有48个有效数据子载波。因此,一个OFDM符号可以负载48个Payload的符号,也就是这是一帧数据需要10(448/48=9.333)个OFDM符号。另外,根据文献【1】为了接收端能正常解调信号,需要在一帧数据前加上两个OFDM符号的同步字。所以,一帧数据中包含12个OFDM 符号。

图3 数据帧结构示意图

4.1.2发送端各模块功能的介绍

A. Vector Source: 实现的功能是循环产生同一组向量,并将该向量转化成无符号整形变量(即uchar型变量),所以其输出是一连串的0和1的数据流。

输入变量:

1,Vector,range(packet_len)。其中packet_len是个变量指一帧数据的长度,单位字节,试验中该变量的值设为96。所以,根据python语法规则range(Packet_len)就是产生一组0到95的向量。

2,Vec length, 1。产生一个向量。

可选变量:

是否循环:Yes。

输出:一串0和1的数据流,数据类型byte。

图3,向量信源模块

B. Stream to Tagged Stream: 该模块实现的功能是将输入数据流进行打包,形成一定长度的帧数据流,并给数据贴上标签。因此,试验中设定一帧数据长度为96个字节,则该模块按该长度输出打包好的帧数据流,共96个字节96*8个比特。

输入变量:

1,Vector length :1,输入向量的个数,默认为1个;

2,2,packet length:packet_len, 定义一帧数据的长度,在流程图的变量模块中packet_len 设定为96;

3,3, Length Tag Key: length_tag_key, 给输出数据打上标签,其标签名为length_tag_key,值

为96.

输出:带标签的帧数据流,数据类型byte.

图4,数据打包模块

C. Stream CRC32: 该模块实现的功能是对输入的每帧数据进行校验,并将形成的4个字节的校验字附在每帧数据的末尾。注意:经过该模块后输出的一帧数据长度较输入之前增加了4个字节,所以一帧数据长度变成100个字节共100*8个比特。

输入变量:

1,Length tag name :length_tag_key,输入的标签名,该模块需要知道一帧数据的长度是多少;

可选变量:

Mode: Generate CRC。这里是发送端,所以选产生CRC校验码,而不是校验接收到的数据。Packed: Yes。告诉模块输入的数据是否是打包好的数据。

输出:带标签的帧数据流,数据类型byte.

图5,CRC校验模块

D. Packer Header Generator: 该模块用来记录一帧数据中的信息,即形成帧头,共6个字节6*8个比特,其中字节1代表一帧数据的长度,字节2和3一起表示当前帧的帧号,字节2每16个加一帧,到255字节3便加1;其它三个字节还不知道具体表示什么。

输入变量:

1,Formatter Object :header_formatter.formatter(). 指定形成的帧头格式;

2,Length Tag Name: "packet_len". 标签名。该模块在对数据进行处理时需要知道一帧数据的长度。

相关文档
最新文档