USRP 实验
课程报告
基于 USRP 的 OFDM 发射接收机
I
一、实验目的:
1、了解 USRP 仿真平台和 GRC 的信号处理模块、流程图及其使用方法;
2、掌握 OFDM 的发射原理以及 QPSK、16QAM 的调制解调;
3、观察对比几种调制方式分别通过信道情况下的星座图失真和误码率情况;
4、尝试实现仿真结果的可视化,可视化界面上能够选择调制方式。
二、OFDM 原理
OFDM 是一种高效的数据传输方式,其基本原理就是把高速的数
据流通过串并变换,分配到传输速率相对较低的若干个子信道中进行
传输。由于每个子信道中的符号周期会相对增加,因此可以减轻由无
线信道的多径时延扩展所产生的时间弥散性对系统造成的影响。这
样,尽管总的信道是不平坦的,具有频率选择性,但是每个子信道是
相对平坦的,在每个子信道上进行的是窄带传输,信号带宽小于信道
相应带宽,因此就可以大大消除信号波形间的码间串扰。并且还可以
在 OFDM 符号之间插入保护间隔,令保护间隔大于无线信道的最大时
延扩展,这样就可以最大限度地消除由于多径而带来的符号间干扰
(ISI)。而且,一般都采用循环前缀作为保护间隔,从而可以避免由
多径带来的信道间干扰(ICI)。(一般保护间隔是时延扩展的 2-4 倍,
OFDM 符号周期长度为保护间隔的 5 倍。)这样就可以消除信道中绝
大部分的符号串扰,因此也就省去了复杂的均衡技术。下图是 OFDM
信号的产生与收发框图,上半部分对应的就是 OFDM 发射机。如图我
们可以知道当信号经过编码-交织-数字调制-插入导频-串并变换-IFFT
II
变换-并串变换-插入循环前缀和加窗-上变频-数模转换等步骤后就可
以通过发射装置将调制出的 OFDM 信号发射出去。
图1 OFDM系统收发机的典型框图
OFDM 相对于一般的多载波传输的不同之处是它允许子载波频
谱部分重叠,只要满足子载波间相互间正交,就可以从混叠的子载波
上分离出数据信号。
III
Transmitter Flow Graph
三、OFDM 发射机的设计与实现
(一)OFDM 发射机的设计
根据 OFDM 技术原理,我们开始着手设计 OFDM 发射机的软件部
分,下图是设计出的 OFDM 发射机程序流程图:
图 6 OFDM 发射机框图
OFDM 发射机如上图所示,在 transmit_path.py 中,语句
self.connect(self.ofdm_tx,self.amp,self)说明其中包含两个模块,
ofdm_tx 是一个 ofdm_mod 类,amp 是一个乘法器。ofdm_mod 类的
代码在文件 ofdm.py 中。
发射机的工作过程如下:要发送的数据包首先经过 Ofdm_mod
模块,在 Ofdm_mod 中数据包首先经过一个 send_pkt 函数,通过添
IV
加 CRC 比特等步骤完成 MAC 包的打包过程。然后 MAC 包被放进一个
Msg 队列,后面的 ofdm_mapper_bcv 模块从 Msg 队列中取出数据包,
根据 OFDM 调制的参数映射成一个个 OFDM symbol,再送到后面的模
块,依次经过添加 preamble(导频),IFFT 变换,添加 cyclic prefix(循
环前缀)模块,最后调整幅度(scale),发送给 USRP 设备。
下面介绍一下 MAC 帧的结构和数据打包过程,如下图所示:
图 7 IP 数据包到 MAC 数据包的打包过程图
首先,IP 包通过 CRC32 算法被加上 4 字节的校验比特;然后数据
部分加上被白化处理过的 CRC 比特和尾比特(X55),这样数据就具有
了随机均匀分布的特性;最后,再加上一个 4 字节的包头。包头部分
包含两个信息:占用 4 比特的白化参数和占用 12 比特数据包长度。
此外,包头部分还采用重复发送的方法来增加可靠性。以上就是一个
完整的 MAC 数据包包装过程。
V
(二)OFDM 发射机程序解析
因为 GNU Radio 中包含了大量 C++语言编写的高速信号处理模
块,我们需要找出相应模块并用 python 语句将其粘合,完成对程序
脚本文件—benchmark_ofdm_tx.py 的编写。
1.程序包含的脚本文件
Ofdm.py:
Psk.py:
Qam.py:
OFDM 调制的主要程序
数字调制中的 PSK 程序文件
数字调制中的 QAM 程序文件
Transmit_path.py:
数据发送的主要程序文件
Fusb_options.py:
添加 USB 命令行参数选择
Pick_bitrate.py:
与比特数率相关的
Ofdm_packet_utils.py:
OFDM 数据打包
我们通过引用这些脚本文件用来对数字信号进行处理,比如通过
执行 Ofdm.py 和 Psk.py 来对二进制代码进行数字调制,通过执行
Ofdm.py 来对数字调制后的信号进行串并变换、IFFT 映射、IFFT 变换、
插入循环前缀等操作调制成为 OFDM 信号。
2.主要函数及功能
gr.ofdm_mapper_bcv(): 比特流映射到星座图上
gr.fdm_insert_preamble(): 插入训练序列
gr.fft_vcc():
进行 IFFT 变换
gr.ofdm_cyclic_prefixer(): 插入循环前缀
gr.multiply_const_cc():
进行幅度控制
VI
这些函数都使用 C++进行编写的,我们在主程序中调用这些函数
对原始电脑产生的二进制代码进行处理使之一步步变成 OFDM 信号
并成功发送。
3.主要运行参数及其意义
-f-freq-tx-freq:
-m、--modulation:
--fft-length:
--occupied-tones:
-V-verbose:
中心频率
数字调制方式
IFFT 变换长度
有效子载波个数
是否输出调制信息
-T-tx-subdev-spec:
进行子板设定
--cp-interp:
--tx-amplitude:
--log:
--bitrate:
插值速率
幅度调节
中间数据记录
比特速率
以上这些参数需要我们去定义,比如经过数学计算可以得到 IFFT
变换长度我们选取 2048,有效子载波数量我们选取 200。通过对这些
参数的设定来对数字信号的处理的过程进行控制,达到我们想要的效
果。
VII
最终的模块形式的 OFDM 的发送图为:
三、OFDM 接收机的设计与实现
由于 OFDM 接收机的设计过程是发射机设计过程的逆过程,这里将不做详细
分析,最终的模块组成图为:
VIII