USRP-OFDM通信系统实验报告(总42页_第1页
USRP-OFDM通信系统实验报告(总42页_第2页
USRP-OFDM通信系统实验报告(总42页_第3页
USRP-OFDM通信系统实验报告(总42页_第4页
USRP-OFDM通信系统实验报告(总42页_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验一 利用GNU-Radio和USRP搭建OFDM通信系统图1,基于GNU-Radio和USRP的OFDM通信系统示意图1 实验设备l 设备清单设备型号数量1Ettus USRP N21022SBX-40子板23VERT245024计算机2l 开发环境操作系统:Ubuntu 14.04 64bit软件平台:GNU-Radio v3.7.8 UHD release_003_009_0012 实验目的l 理解OFDM信号的调制和解调原理;l 熟悉使用GNU-Radio软件并对信号进行处理;l 学会使用软件GNU-Radio和硬件USRP来完成点对点设备的通信。3 实验内容本实验是在Linux桌面

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

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

4、个限幅器模块。图2, OFDM通信系统的发送端实验流程图4.1.1 数据帧结构实验开始时一帧数据的长度规定为96个字节,其中每个字节包含8个比特。信源不断地产生0和1的比特序列,经过数据打包模块(B模块)后变成上述固定长度的帧数据。数据流经过CRC校验后,会在一帧数据的末尾增加4个字节,这时一帧数据便变成了100字节。这些有用的信息称为payload,其采用的是QPSK调制方式,注意经过QPSK映射后一帧数据的长度变成了100*8/2=400个QPSK符号。接着,针对每一帧数据需要生成一个帧头,用来记录当前帧的一些信息,比如帧长、这是第几帧等信息。实验中帧头信息长度为6个字节共48个比特,帧头

5、中的信息称为Header,采用BPSK方式调制,故其长度不变。Payload 和 Header需要复合在一起才能进行传输,一般将Header置于Payload之前形成新的帧结构,这时一帧数据的长度又发生了变化,变成了400+48=448个符号。在实验中一个OFDM符号的长度设定为64(即总载波个数为64),除去虚拟载波、直流子载波和射频子载波还有48个有效数据子载波。因此,一个OFDM符号可以负载48个Payload的符号,也就是这是一帧数据需要10(448/48=9.333)个OFDM符号。另外,根据文献【1】为了接收端能正常解调信号,需要在一帧数据前加上两个OFDM符号的同步字。所以,一帧

6、数据中包含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的数据流,数据类型by

7、te。图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

8、_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。 告诉模块

9、输入的数据是否是打包好的数据。输出:带标签的帧数据流,数据类型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. 标签名。该模块在对数据进行处理时需要知道一帧数据

10、的长度。输出:帧头数据流,数据类型byte,暂存到Header Bits 模块中.图6,帧头生成模块E. Repack Bits: 该模块实现的功能是将8比特一组的数据变成2比特一组,由最低位到最高位依次转换。因此,在解码的时候需要特别注意每个比特在一个字节中的位置。输入变量:1, Bits per input byte :8, 输入端口每个字节中包含的比特数,指定为8;2, Bits per output byte: payload_mod.bits_per_symbol(), 输出端口每个字节中所包含的比特数,payload_mod.bits_per_symbol 中的payload_mo

11、d 在流图的变量模块中设定为QPSK,因此每个符号应包含2个比特数。3, Length Tag Key: length_tag_key. 标签名。该模块在对数据进行处理时需要知道帧长。可选变量:Packet Alignment: input. 选择需要进行该操作的端口,这里只有一个input端口可选。Endianness: LSB. 从一个字节的最低位开始操作。输出:带标签的帧数据流,数据类型byte,但每个byte包含2个字节.图7,字节重生成模块F. Chunks to Symbols: 符号映射模块,完成数据块到符号流的转换。这里可选的符号参数为-1+0j 和 1+0j,因此该模块的功能

12、是实现BPSK映射。输入变量:1, Symbol Table :header_mod.points(), 该值在变量模块中已定义,其映射规则是输入0时输出-1+0j,输入1时输出1+0j;2, Dimension : 1, 整个流图始终处理的都是一维数据,所以这里同样是1维。3, Num Ports: 1. 端口数,同样这里选1。可选变量:Input Type: Byte: 输入数据类型与前一模块的数据类型相同。Output Type: Complex. 输出数据类型为复数。输出:带标签的帧数据流,数据类型complex。图8,BPSK映射模块G. Chunks to Symbols: 符号映

13、射模块,完成数据块到符号流的转换。这里可选符号参数包括-0.707+0.707j, -0.707-0.707j, 0.707-0.707j 和 0.707+0.707j,因此该模块实现的功能是QPSK映射。输入变量:1, Symbol Table :payloas_mod.points(), 该值在变量模块中已定义,其映射规则是输入10时输出-0.707+0.707j,输入00时输出-0.707-0.707j, 输入01时输出0.707-0.707j,输入11时输出0.707+0.707j。2, Dimension : 1, 整个流图始终处理的都是一维数据,所以这里同样是1维。3, Num P

14、orts: 1. 端口数,同样这里选1。可选变量:Input Type: Byte: 输入数据类型与前一模块的数据类型相同。Output Type: Complex. 输出数据类型为复数。输出:带标签的帧数据流,数据类型complex。图9,QPSK映射模块H. Tagged Stream Mux: 该模块的功能是增大或减小数据流标签中值的大小,从而达到增加或缩减一帧数据长度的目的。这里需要将两路信号合并,因此需要增加数据帧的长度。之前我们分析过数据帧长为100个字节共100*8个比特,经QPSK映射后为100*4个符号;同样针头有6个字节共48个比特,经BPSK映射后变成48个符号。因此,将

15、这两路信号进行合并后得到的一帧数据长度为100*4+48=448个符号。输入变量:1,Number of Input : 2, 输入端口数,有两路信号输入,因此这里应填。2, Length tag names : length_tag_key, 输入数据帧的长度, 96。3,Vector Length : 1. 和信源保持一致;可选变量:IO Type: complex, 端口输入数据类型。输出:带标签的帧数据流,数据类型complex。图10,信号合成模块I. OFDM Carrier Allocator: OFDM子载波分配模块,也即串并转换模块。该模块的作用是给每个子载波分配相应的值,数

16、据相应地实现串并转换。这里设总载波个数为64,载波类型包括以下几种:数据子载波(Occupied carriers )、导频子载波(Pilot carriers)、虚拟子载波(Virtual carriers, VC)和直流子载波(DC carrier)。其中占用载波可以用来携带数据和同步字,导频载波用于发射特定符号数据,空载波的值默认为0.在试验中发送端OFDM子载波的编号规则是:为了保持左右对称,将64个子载波编号为-32,31。其中,最左边6个子载波-32,-27和最右边的5个子载波26,31 称为虚拟载波,即不使用的载波它的值默认为0,其作用是为了减少带外功率和抑制ACI。编号为-26

17、,-22、-20,-8、-6,-1、1,6、8,20、22,26都是数据子载波;编号为-21、-7、7、21为射频子载波;编号为0为直流子载波,作用是降低OFDM信号的峰值信噪比以及硬件电路的复杂度【3】。由此可知,64个子载波中有效子载波只有48个。这样我们便可以计算出承载一帧有效数据(包括帧头和负载共448个符号)所需要的OFDM符号数(将64个子载波组成的并行数据称为一个OFDM符号),即448/48=9.33个OFDM符号,也就是说传输一帧有效数据需要10个OFDM符号。另外,为了接收端解调方便,本实验中的OFDM信号需要加入2个符号的同步字置于一帧有效数据的开头。所以,最后传输的一帧

18、数据中包含了12个OFDM字符,2个同步字和10个有效数据。输入变量:1, FFT length : fft_len, 傅里叶变换的长度,fft_len在流图变量模块中指定为64。2, Occupied Carriers: occupied_carrieds, 数据子载波编号,occupied_carrieds在流图变量模块中指定为-26,-22、-20,-8、-6,-1、1,6、8,20、22,26。3, Pilot Carriers: pilot_carrieds, 导频子载波编号,pilot_carrieds在流图变量模块中指定为-21、-7、7、21。4, Pilot Symbols:

19、 pilot symbols, 导频子载波上对应的符号(值),pilot symbols在流图变量模块中对应上述载波编号指定为:1,1,1, -1。5, Sync_words: (sync_word1, sync_word2), 同步字信息,sync_word1, sync_word2是在流图变量模块中指定信息。其中同步数组1的值为0., 0., 0., 0., 0., 0., 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., -1.41421356, 0., -1.41421356, 0., -1.41421356, 0., 1.414

20、21356, 0., -1.41421356, 0., 1.41421356, 0., -1.41421356, 0., -1.41421356, 0., -1.41421356, 0., -1.41421356, 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., 1.41421356, 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., 1.41421356, 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., 1.4142135

21、6, 0., 1.41421356, 0., 0., 0., 0., 0., 0.;同步数组2的数据为0, 0, 0, 0, 0, 0, -1, -1, -1, -1, 1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 0, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 0, 0, 0, 0, 0。可选变量:无输出:OFDM符号流,数据类型complex。图

22、11,OFDM子载波分配模块J. FFT: 傅里叶变换模块。对已分配好的子载波符号进行傅里叶变换,完成OFDM调制。输入变量:1, FFT Size : fft_len, 傅里叶变换的长度,fft_len在流图变量模块中指定为64。2, Windows : (), 傅里叶变化的窗函数,不清楚()代表什么。3, Num. Threads: 1, 线程数设为1,C+中多线程数在任务量大时才有效,当任务量小时采用多线程会消耗额外的通信开销而导致其效率比单线程还低。因此,这里64点DFT采用单线程较好。可选变量:1, Input Type: Complex, 输入的数据类型为复数。2, Forward

23、/Reverse: Reverse, FFT变换类型,Forward表示FFT变换,Reverse表示IFFT(逆傅里叶)变换。3, Shift:shift, 傅里叶变换后是否将频率点(下标)移动,shift表示需要移动,移动规则如下图所示。这里需要注意的是在接收端FFT模块中需要做同样的设置,否则无法正常解调信号。输出:OFDM符号流,数据类型complex。图12,FFT/IFFT Shift 变换过程图13,FFT 变换模块K. OFDM Cyclic Prefixes: 给OFDM符号添加循环前缀。OFDM信号中加循环前缀的目的是为了防止OFDM符号间干扰(ISI),但需要保证循环前缀

24、的长度大于信道卷积长度。输入变量:1, FFT Length : fft_len, 傅里叶变换的长度,fft_len在流图变量模块中指定为64。2, CP Length : fft_len/4, 循环前缀的长度,其值为fft_len/4=16。3, Rolloff: rolloff, 成形滤波器参数设置,rolloff 为升余弦滚降。4, Length Tag Key : length_tag_key, 数据帧的长度,同之前模块中的值一样。可选变量:无。输出:OFDM符号流,数据类型complex。图14,OFDM循环前缀模块L. Multiply Const: 衰减器模块。该模块通常将输入的

25、数据乘上一个常数,从而达到改变输入信号幅度的目的。在这里为了防止调制好的OFDM信号在进入功率放大器后产生非线性失真,需要将输入信号乘上一个小于1的常数。输入变量:1, Constant : M_const, 一个小于1的浮点型常数,为方便将其设为仿真中可变的值,设置如图15所示,默认值为0.02,变动范围0, 0.1,步进为0.001。2, Vec Length: 1. 同上。可选变量:1, IO Type : complex。输出:OFDM符号流,数据类型complex。图15,衰减器模块M. UHD: USRP Sink: 信号发送模块。该模块实现信号从软件到硬件转换的桥梁作用,将信号送

26、到硬件再经射频天线将信号发送出去。本实验中所用的硬件是USRP N210和其搭载的母板SBX_v2,它们主要的任务是完成插值、上变频、D/A转换、功放、混频、最后经射频天线发射出去。USRP N210有一个千兆以太网端口,可以通过网线和主机连接实现最高50MS/s的通信速率。需要设置的参数:1, Device Address : usrp_addr, 输入USRP设备的地址,通常一台设备对应一个IP地址,其储存在芯片EPROM中,主机通过寻找该地址来实现通信。usrp_addr是流图变量模块中的一个变量名,其值为“addr = 192.168.10.2”。另外,要想完成主机和设备通信还需要对主

27、机进行设置,具体参见文献【4】中的PDF资料。2, Samp Rate (Sps): samp_rate, 采样率。通常可以理解为主机和设备之间传输数据速率,最大为50MS/s(8bit )或25MS/s(16 bit)。samp_rate 的值在流图的变量模块中设为1MHz。3, Center Freq (Hz): c_freq, 中心频率。指信号在无线环境中传播的频率,也即射频。c_freq 的值在流图的变量模块中设为433MHz。4, Gain Value: Tx_gain, USRP发送增益,单位是dB。Tx_gain 的值在流图的变量模块中设为25dB。可选变量:1,其它变量采用默认

28、值。输出:射频信号,数据类型:模拟信号。图16,USRP 信号发送模块4.2 接收端与发送端相对应,接收端主要由以下几个模块组成:USRP Source 模块、同步模块、载波频偏估计及消除模块、FFT模块、信道估计及均衡模块、逆子载波分配模块、解QPSK和BPSK模块、CRC校验模块等。同样除了USRP模块外其它几个模块中的信号处理都是在GNR-Radio中完成的,也即在主机中完成。USRP模块由于拥有单独的DSP和FPGA模块,因此可以独立对输入数据进行处理。在USRP模块中需要完成混频、D/A转换、字下变频、插值数等功能。接收端的主要功能是将射频信号从无线信道中接收下来,模数转换,再经过一

29、系列信号处理模块最终将信号解调出来。图1,OFDM通信系统的接收端实验流程图4.2.1工作原理首先,USRP模块将无线信道中的信号接收下来,IQ两路A/D采样变成数字信号,之后经过数字下变频、抽取等得到一连串的复信号流。输出的数据分成两路,一路经过同步模块B和调制模块D进入相乘模块E。模块B有两个输出端口分别输出小数倍载波频偏和定时脉冲,小数倍载波频偏输入到模块D中进行调制,用于消除接收信号中的载波频偏,定时脉冲输入到模块F中用于触发一帧数据的起始点;另一路数据流经过模块C延迟一个OFDM符号(包括CP)后进入相乘模块。在模块E中两路信号相乘从而使得小数倍的载波频偏得以纠正,消去载波频偏后的数

30、据流进入F模块来将一帧数据中的Header和Payload分开。但是,接收端一开始不知道接收信号中的数据帧结构,所以在解调时需要先读出Header中信息,才能将接收信号正常解调。因此,我们先分析Header这路信号。信号首先进入了FFT模块做傅里叶变换,之后进入信号估计模块,经过该模块后会得到整数倍载波频偏和系统频谱响应两个参数。接着信号流带着这两个参数进入模块I中进行频域均衡同时纠正整数倍的载波频偏,这时接收信号中的载波频偏已完全消除了。数据之后经过串并转换模块(即逆子载波分配模块J)和解星座映射模块K得到所需的信息(包括帧头信息、整数载波频偏和系统频域响应等参数),在将其以PMT字典格式的

31、数据储存并输入到模块F中。模块F的作用之前已经提到,它将一帧数据的Header和Payload分开,其具体工作原理见下一节的模块分析。Header和Payload数据分开后,现在主要考虑Payload这路数据流,这部分功能大体和接收端是对称的。首先,它同样进入FFT模块中进行傅里叶变换,后经过模块N来进行信道均衡和去载波频偏,然后在模块O中做逆子载波分配,之后是解QPSK映射。这之后的步骤便完全是发送端实现过程的逆过程了,直到信号完全解调出来。另外,最后信号输出的是标签,包括载波频偏,信道均衡系数(即系统频率响应)、当前数据帧的帧号、接收时间等信息。4.2.2 接收端各模块功能的介绍A. UH

32、D USRP Source:该模块可以实现硬件和软件之间的连接。具体是将硬件USRP N210接收到的信号(经过一系列处理后得到的信号)传送到主机。需要设定的参数是USRP设备地址,采样频率以及中心频率。输出是复数类型的I/Q数据流。B. Schmidl & Cox OFDM synch:该模块实现两个功能,第一实现符号定时同步;第二去除小数部分的载波频偏。该模块所使用的方法是根据文献【1】编写的,但是整数倍频偏纠正的方法没在该模块中给出。输入变量:3, FFT length:fft_len。其中fft_len是傅里叶变换的长度,也是指OFDM符号中子载波的总个数。fft_len在流图的变量模

33、块中设定为64;4, Cyclic Prefix length: fft_len/4, 循环前缀的长度。值为傅里叶变换长度的四分之一。可选变量:Preamble Carriers:Odd。模块使用同步字里面的奇数载波来计算起始点和载波频偏。使用奇数载波的目的是什么呢?在进行定时和载波频偏纠正时考虑的是第一同步字,而第一个同步字在频域中偶数载波上有值,而奇数载波为了零,但在时域是对称的。可以肯定的是奇数载波为0是同步字1的特征,因为所有的symbol在奇数载波上都是有值的,但并没有表明定时和去载波频偏算法中和奇数载波的关系。输出:输出两个值,一个是载波频偏(小数倍),一个是定时信息。小数倍的载波

34、频偏是经过归一化的:,可以得到输出output的变化范围为,也就是说载波频偏如果超过该范围便无法纠正。(其实指的是相位的变化,这是因为在数字域里面频率都被奈奎斯特采样率给归一化了,也就是说模拟频率和数字频率存在一定映射关系,而这种映射关系往往体现在相位的变化上。通常数字域中相位使用得多,模拟域中频率使用得多)。定时信息是一串和数据等长的0,1序列,起始点对应的地方设为1,其它为0.图2,信号同步和载波C. Delay: 延迟模块。实现数据流指定长度延时。这里该模块的作用是使输入数据延迟一个OFDM符号。Why the number of delays is an OFDM symbol?输入变

35、量:1, Delay:fft_len+fft_len/4。延迟参数,当该值为正时输出在数据前端添加相应个数的0,当该值为负时输出舍弃相应个数的数据。fft_len上面已经介绍其值为64,加上循环前缀的长度为80,刚好一个OFDM符号的长度。2, Num Ports: 1, 输入端口数,1个。3, Vec Length: 1,输入向量数,1个。可选变量:Type:Complex。选择输入数据类型。输出:延迟一个OFDM符号后的信号流,数据类型复数。 D. Frequency Mod: 频率调制模块。作用是产生一个和载波频偏对应的序列,进而将该序列和接收的数据流相乘,达到去除载波频偏的目的。输入变

36、量:1, Sensitivity: -2.0/fft_len。 这个该叫什么呢?通信原理中有个调频灵敏度,好像有点像这个;其中fft_len 的值是64。可选变量:无。2, 输出:经过该模块后输出的序列为:其中,是模块C输出的载波频偏,的值和输入信号长度一样。E. Multiply: 该模块实现两个向量相乘。作用是去除小数倍载波频偏,消除ACI干扰。输入变量:1, Num Inputs:2。 输入端口数为两个。2, Vec Length: 1。向量长度为1。可选变量:IO Type:Complex。输入和输出端口的数据类型为复数。输出:去除小数倍载波频偏的数据流,数据类型为复数。F. Head

37、er/Payload Demux: 该模块的作用是根据定时信息和帧头信息,将复合在一起的针头和数据进行分离。该模块的工作原理是:首先,将三个输入端口从上到下编号为0,1,2, 输出端编号类似。0号端口连续输入去除载波频偏的数据流,当2号端口(定时信息)输入1时,也就是功能被触发,则输出端口0输出帧头,而数据(Payload)则保持不动。直到输入端口2接收到解码后的帧头信息,输出端口才有数据输出,输出数据为帧头和数据payload 的合并数据,也就是说输出端口2中的信息包含一帧数据中的完整信息。输入变量:1, Header Length (Symbols):3。 帧头占用的OFDM符号数。2,

38、Items per symbol: fft_len。 每个OFDM符号中所包含的项数。3, Guard Interval (iterms): fft_len/4。一个符号中保护间隔所包含的项数。4, Length tag key: length_tag_key。一帧数据的长度,它的值是frame_len 设定为960.5, Timing tag key: rx_time。给每个定时点贴上标签,以便后面输出,或调试。6, Sampling Rate: samp_rate。采样率。可选变量:1, Output Format: symbols。 输出格式为符号;2, IO Type: Complex

39、.。输出数据类型为复数。输出:去除小数倍载波频偏的数据流,数据类型为复数。G. FFT: 傅里叶变换模块。在发送端也有一个FFT变换模块,那是逆向(Reverse)变换,为了实现解调这里应该做正向(Forward)变换。注意为与发送端一致需要选择shift操作,否则无法正常解调信号。H. OFDM Channel Estimation:信道估计模块。该模块实现两个功能,得到整数倍频偏和系统频域响应(即信道的频率响应)。整数倍频偏的获取依靠同步字2,其具体算法参考文献【1】。它在FFT模块之后,因此实现的是信道频域估计,得到的是信道的频域响应,其中,是同步字序列(同步字1或同步字2),是经过傅里

40、叶正反变换和信道之后的序列。综上,该模块的工作原理是,根据同步字1和2来获取整数倍频偏和信道的频率响应,并将这两个值作为标签传递到该模块以后的所有模块中,而输入信号流不做任何处理输出。输入变量:1, Sync. symbol 1: sync_word 1。 同步字1。sync_word 1是个变量,它的值在流图变量模块中给出。2, Sync. symbol 2: sync_word 2。同步字2。3, Number of data symbol: 1。 数据符号的个数,为1.4, Maximum carrier offset: 3。 最大的载波频偏,为3,也就说允许最大有3个载波位置的偏移。但

41、为什么是3呢?可选变量:Force One Synchronizations Symbol:No。不知道什么意思?输出: 输出数据与输入数据相比少了两个同步字,但第一数据符号多了两个标签:一个是整数倍载波频偏,记为ofdm_sync_carr_offset (integer);另一个是信号频率响应,记为ofdm_sync_eq_offset (complex vector)。也就是说输出是带标签的数据流,数据类型是复数。I. OFDM Frame Equalizer: OFDM帧均衡模块。该模块实现两个功能,第一纠正整数倍频偏,第二对接收信号进行均衡。纠正整数倍频偏可以通过循环移位子载波编号来

42、完成。比如,设接收信号经FFT后为,其产生的整数倍频偏为(该值在前一模块中求得,并通过标签ofdm_sync_carr_offset传递到当前模块),则通过循环移位得到来消除频偏,其中表示到步进为的向量,且。另外,信道均衡依赖系统频率响应(该值也是从上一个模块中获得的),均衡后的信号。输入变量:1, FFT length:fft_len。 傅里叶变换长度。2, CP length: fft_len/4。 OFDM保护间隔长度3, Equalizer: header_equalizer.base()。 采用的均衡方法,内部指定。4, Length Tag Key: length_tag_key。

43、 一帧数据的长度。5, Fixed frame length: 1。 帧的长度是否等长,设为1等长。可选变量:Propagate Channel State: Yes。 将信道状态作为标签继续传递下去。输出:去除整数倍载波频偏和均衡后的带有标签的数据流,数据类型为复数。J. OFDM Serializer: 逆OFDM子载波分配模块,也称为并串转换模块。该模块实现的功能是发送端OFDM Carrier Allocator 模块的逆过程,需要知道OFDM符号中每个子载波的分配规则,找到携带数据的48个子载波,并提取其信息。输出: 有效数据流,去除了空载波和虚拟载波信息,数据类型复数。K. Con

44、stellation Decoder: 解符号映射模块。这里解调的是针头数据,因此根据发送端规则,该模块是解BPSK映射。输出: 输出的0和1的信息流,数据类型是字节。L. Packet Header parser: 解帧头信息模块。该模块实现的功能是发送端 packet header generator模块的逆过程,唯一不同的是这里不是输出一连串的0,1数据流,而是PMT字典格式的信息,伴随着一个“header_data”的ID。输入变量:1, Formatter Object:header_formatter.base()。 帧的格式,内部指定的格式,当无输入时,调用默认格式。可选变量:P

45、ropagate Channel State: 无。输出: PMT字典格式的信息,伴随着一个“header_data”的ID。M. FFT: 傅里叶变换模块。 功能与G模块相同。输出: 带标签的数据流,数据类型复数。N. OFDM Frame Equalizer: OFDM帧均衡。 其功能与之前的I模块相同。输出:带标签的数据流,数据类型复数。O. OFDM seriallzer: 逆子载波分配模块,也称为并串转换模块。输出:带标签的数据流,数据类型复数。P. Constellation Decoder: 解符号映射模块。这里解调的是paylaod数据,因此根据发送端规则,该模块是解QPSK映

46、射。输出: 输出的0和1的信息流,数据类型是字节。Q. Repack Bits: 字节重组合模块。 这里实现的功能是将2个比特的字节变换成8个比特的字节,从最低位开始。输出: 输出的0和1的信息流,数据类型是字节。R. Stream CRC32: CRC校验模块。 是发送端的CRC校验模块的逆过程,发送端是生成4个字节的校验码,而这里是验证校验码。输出: 去除CRC校验字的0和1的信息流,数据类型是字节。S. Tag Debug: 标签调试。没有实际的功能,只是在终端中输出数据流所携带的标签信息。输出: 标签信息。实验二 在MATLAB中编写接收端代码1 实验设备l 设备清单设备型号数量1Et

47、tus USRP N21022SBX-40子板23VERT245024计算机2l 开发环境操作系统:Ubuntu 14.04 64bit软件平台:GNU-Radio v3.7.8; UHD release_003_009_001; Matlab 2012b2 实验目的l 学会利用MATLAB 来读取GNU-Radio中保存的数据文件;l 理解OFDM接收信号的解调原理;l 学会画星座图,并通过星座图来估计系统性能;l 学会计算误码率。3 实验内容本实验的主要根据实验一中的接收端OFDM信号的解调原理,采用Matlab软件编程来重新实现实验一中接收端流程图的各模块功能。或者说用Matlab语言来

48、重写接收端模块的底层代码,以实现相同的功能。这些功能包括同步、载波频偏估计、信道估计与均衡、FFT/IFFT、星座图、误码率等。其中,载波频偏估计算法和同步算法是根据文献【1】来编写的,这与GNU-Radio中Schmidl & Cox OFDM synch模块的工作原理是一致的。信道估计采用的是最小二乘估计方法,得到的是信道的频域响应来实现信号均衡的。星座图的作用类似于二元通信系统中的眼图,用来观测接收信号的好坏。最后,误码率用于表征系统的性能。3 实验步骤本实验在实验一的基础上进行扩展。l 首先,在实验一接收端流程图的模块A后增加一个File Sink模块,其作用是将接收到的数据保存到当前

49、文件中,实验中将该数据文件命名为Test1_data_1M,其默认的文件格式为,dat。l 重新运行实验一(运行时间尽量不要超过5分钟,以免接收的文件过大)得到Test1_data_1M.dat数据文件。l 打开Matlab软件,将得到的数据文件的所在路径加入到Matlab工作路径中,并调用专用函数读到Matlab中。(需要注意的是文件中保存的是复数格式的数据,所以在读取数据时应交替读取,即奇数为实部,偶数为虚部,反之亦然。)l 根据实验一中接收端流程图的工作原理,在Matlab中重新编写接收端的解调代码。l 运行编写的程序,观测星座图,从而估计系统的性能。l 计算Payload的误码率。图1

50、 实验流程图3.1 各模块功能介绍A. 读取数据模块:该模块实现两个功能:将GNU-Radio中File Sink模块保存的数据文件读取到Matlab中,和截断数据中设备的启动噪声。图2和图3分别是初始读取的数据和截断噪声后的数据,从图2中可以明显看到在数据起始端设备启动噪声非常大,之后逐渐衰减。图3是截断噪声后的接收信号,可以看出总体幅度比较平坦,设备的启动噪声被消除。调用函数:read_complex_binary输入参数:Filename, Data length。其中Filename 表示保存的数据文件Test1_data_1M.dat;Data length是读取的数据长度,试验中设

51、为1e6,当文件中数据小于该值时读取的数据长度将根据文件的大小自动截止。输出参数:RX signal。表示读出的数据,这里使用名称x0。图2 初始读出的数据图3 截断噪声后的数据B 同步模块:该模块实现三个功能。第一找出USRP模块中DSP插值器插值的大小(实际实验中发现该值不是固定的);第二找出一帧数据的起始点;第三估计接收信号中小数倍的载波频偏。根据文献【1】中同步字1的特点有其中,表示截断噪声后的接收信号,包括OFDM信号和噪声,是采样点下标。为了使得到的值差异性更明显,可以除以同步字1后一半的能量,进而得到测量其中根据公式(2)我们可以找出USRP模块中DSP插值器插值的大小(1到4的

52、整数)和一帧数据的起始点,其基本原理是前者让的一帧数据的最大值(根据文献【1】中Fig3,在一帧数据中会形成一个高峰)大于当前帧数据平均值的倍找出;在其基础上再让的一帧数据大于当前帧数据最大值的倍(实验中,)找出起始点。根据文献【1】找到起始点后,载波频偏可以估计为其中是一个OFDM符号的持续时间。但是,我们在实验中会发现估计的相位和真实的相位之间有一个的偏移。通过分析其产生的原因,发现式(1)对符号的一半操作刚好产生的相位,其理论分析见附录A。图4所示为该模块的信号处理示意图,从图中可以看出每帧数据的起始都会产生一个很大的高峰,高峰越明显说明信号质量越好,判决设置更准确。另外,从图中可以看出

53、相位大致位于()附近(为了图像美观相位都乘了0.1的系数),这说明信号在传输过程中没有产生频偏或频偏很小。图中的黑线是寻找起始点的判决门限,从图中可以看到大于判决门限的点不是唯一的(理论上应该有CP长度个),也就是说每帧数据的起始点不是固定的。那么它是否会对解调产生影响呢?这个问题将在模块D精确的符号定时(STO)中解决。图4 同步模块信号处理示意图调用函数:synchron输入参数:RX signal, Frame length, Data length。Rx signal 是截断噪声后的接收信号,所以需要调入的参数为x0;Frame length 是一帧数据的长度,这里的值为960;Dat

54、a length是读取的数据长度,试验中设为1e4,当文件中数据小于该值时读取的数据长度将根据文件的大小自动截止。输出参数:Start point, signal。Start point 表示一帧数据的起始点,用符号start_p表示;signal 表示重新读取过的数据,没做任何处理只是改变输入信号的长度,表示符号x。C. IFFT模块:逆傅里叶变换模块。该模块完成的功能是逆傅里叶变换,不采用shift。这似乎接收端做FFT并采用shift刚好相反,确实,原因是GNU-Radio中的的傅里叶变换和Matlab中的傅里叶变换不一致,尤其是shift的方式完全不同,如图5所示。所以,通过实验发现在

55、Matlab中正确解调数据需要做IFFT,并自己编写与GNU-Radio中一致的shift代码(称为载波位置调整)。图5 GNU-Radio和Matlab中的Shift变换方式调用函数:ifft输入参数:T_Sym, FFT_len, dim。T_Sym 是待变换的信号,是由OFDM符号组成的二维信号矩阵;FFT_len 是傅里叶变换的长度,这里的值为64;dim是矩阵做傅里叶变换的维度,这里需要对行向量作变换,故dim为1。输出参数:T_Sym_fft。T_Sym_fft 表示经过逆傅里叶变换处理后的信号。D. 估计整数倍CFO模块:该模块的功能是估计出接收信号中的整数倍载波频偏。其理论分析

56、见参考文献【1】,这样结合之前的得到小数倍载波频偏,估计得到载波频偏为其中,是估计得到的整数倍载波频偏。调用函数:Integer_CFO输入参数:sync_r1, sync_r2, sync_1, sync_2, Max_offset。sync_r1, sync_r2 分别是接收到信号作IFFT后的同步字1和同步字2,即一帧数据的第1、2个OFDM符号;sync_1, sync_2 分别是发送端设定的同步字1和同步字2;Max_offset 是所能纠正的最大载波频偏,这里设为10;输出参数:integer_CFO, 表示整数倍载波频偏使用epsilon代替。E. 信道估计与频域均衡模块:该模块实现两个功能信道估计和均衡。这里的信道估计考虑最简单的最小二乘估计方法,根据参考文献【2】的方法得到其

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论