一、实习目的
1、熟悉通信相关方面的知识、学习并掌握 OFDM 技术的原理
2、熟悉 MATLAB 语言
3、设计并实现 OFDM 通信系统的建模与仿真
二、实习要求
仿真实现 OFDM 调制解调,在发射端,经串/并变换和 IFFT 变换,加上保护间隔(又称“循
环前缀”),形成数字信号,通过信道到达接收端,结束端实现反变换,进行误码分析
三、实习内容
1. 实习题目
《正交频分复用 OFDM 系统建模与仿真》
2. 原理介绍
OFDM 的基本原理就是把高速的数据流通过串并变换,分配到传输速率相对较低的若干
个子信道中进行传输。由于每个子信道中的符号周期会相对增加,因此可以减轻由无线信道
的多径时延扩展所产生的时间弥散性对系统造成的影响。并且还可以在 OFDM 符号之间插入
保护间隔,令保护间隔大于无线信道的最大时延扩展,这样就可以最大限度地消除由于多径
而带来的符号间干扰(ISI)。而且,一般都采用循环前缀作为保护间隔,从而可以避免由多
径带来的子载波间干扰((ICI) 。
3. 原理框图
RF TX
DAC
并/串
插入循
环前缀
和加窗
编码
交织
解码
解交
织
数字
调制
数字
解调
插入
导频
信道
校正
串并
变换
并串
变换
IFFT
FFT
串/并
去除循
环前缀
RF RX
ADC
定时
和频
率同
步
图 1-1 OFDM 原理框图
4. 功能说明
4.1 确定参数
需要确定的参数为:子信道,子载波数,FFT 长度,每次使用的 OFDM 符号数,调制度水
平,符号速率,比特率,保护间隔长度,信噪比,插入导频数,基本的仿真可以不插入导频,
可以为 0。
4.2 产生数据
使 用 个 随 机 数 产 生 器 产 生 二 进 制 数 据 , 每 次 产 生 的 数 据 个 数 为 carrier_count *
symbols_per_carrier * bits_per_symbol。
4.3 编码交织
交织编码可以有效地抗突发干扰。
4.4 子载波调制
OFDM 采用 BPSK、QPSK、16QAM、64QAM4 种调制方式。按照星座图,将每个子信道上
的数据,映射到星座图点的复数表示,转换为同相 Ich 和正交分量 Qch。
其实这是一种查表的方法,以 16QAM 星座为例,bits_per_symbol=4,则每个 OFDM 符号的
每个子信道上有 4 个二进制数{d1,d2,d3,d4},共有 16 种取值,对应星座图上 16 个点,每个点
的实部记为 Qch。为了所有的映射点有相同高的平均功率,输出要进行归一化,所以对应
BPSK,PQSK,16QAM,64QAM,分别乘以归一化系数系数 1, 2
.输出的复数
10
42
1
1
,
1
,
序列即为映射后的调制结果。
4.5 串并转换。
将一路高速数据转换成多路低速数据
4.6 IFFT。
对上一步得到的相同分量和正交分量按照(Ich+Qch*i)进行 IFFT 运算。并将得到的复数的
实部作为新的 Ich,虚部作为新的 Qch。
在实际运用中, 信号的产生和解调都是采用数字信号处理的方法来实现的, 此时要对信号
进行抽样, 形成离散时间信号。 由于 OFDM 信号的带宽为 B=N·Δf, 信号必须以Δ
t=1/B=1/(N·Δf)的时间间隔进行采样。 采样后的信号用 sn,i
表示, i = 0, 1, …, N-1,则有
s
,
in
1
1 N
N
0
k
S
,
kn
e
2j
Nik
/
从该式可以看出,它是一个严格的离散反傅立叶变换(IDFT)的表达式。IDFT 可以采用快
速反傅立叶变换(IFFT)来实现
4.7 加入保护间隔。
由 IFFT 运算后的每个符号的同相分量和正交分量分别转换为串行数据,并将符号尾部 G 长
度的数据加到头部,构成循环前缀。如果加入空的间隔,在多径传播的影响下,会造成载波
间干扰 ICI。保护见个的长度 G 应该大于多径时的扩张的最大值。
1
子载波1
延迟的子载波2
子载波2对子载波1的
干扰部分
保护时间
FFT积分时间
OFDM符号周期
图 1-2 多径情况下,空闲保护间隔在子载波间造成的干扰
复制
IFFT
保护
间隔
IFFT输出
保护
间隔
IFFT
Tg
TFFT
Ts
符号N
符号N-1
时间
符号N+1
图 1-3 保护间隔的插入过程
4.8 加窗
加窗是为了降低系统的 PAPR,滚降系数为 1/32。通过这种方法,可以显著地改善 OFDM 通
信系统高的 PAPR 分布,大大降低了峰值信号出现的概率以及对功率放大器的要求,节约成
本。经常被采用的窗函数是升余弦窗
tw
5.05.0
0.1
5.05.0
cos
T
s
t
cos
Tt
s
T
s
0
t
T
s
T
Tt
s
s
1
t
T
s
s
T
(1-2)
图 1-9 经过加窗处理后的 OFDM 符号示意图
4.9 通过信道。
2
信道分为多径实验信道和高斯白噪声信道。多径时延信道直射波河延迟波对于标准时间按照
固定比率递减,因此多径时延信道参数为比率和对大延迟时间。
4.10 同步。
同步是决定 OFDM 系统高性能十分重要的方面,实际 OFDM 系统都有同步过称。主要同步
方法有使用导频,循环前缀,忙算法三种。研究目的为同步的可以详细实现本步,基本的方
针可以略过此步,假设接收端已经于发射端同步。
4.11 去掉保护间隔。
根据同步得到的数据,分别见给每个符号的同相分量和正交分量开头的保护间隔去掉。
4.12 并串转换。
将每个符号分布在子信道上的数据,还原为一路串行数据。
4.13 FFT。
对每个符号的同相分量和正交分量按照(Ich+Qch*i)进行 FFT 运算。并将得到的实部作为
新的 Ich,虚部作为新的 Qch。
与发端相类似,上述相关运算可以通过离散傅立叶变换(DFT)或快速傅立叶变换(FFT)来
实现, 即:
R
,
kn
1
1 N
N
0
i
/π2j
Nik
r
,
in
e
4.14 子载波解调
FFT 后的同相粉脸感和正交分量两组数据在星座图上对饮高的点,由于噪声和信道的影响,
不再是严格的发送端的星座图。将得到的星座图上的点按照最近原则判决为原星座图上的
点,并按映射规则还原为一组数据。
4.15 解码解交织。
按照编码交织对应解码,解交织的方法,还原为原始数据,并进行纠错处理。
4.16 计算误码率。
比较第 2 步产生的数据和接收到的数据,计算误码率 BER
5. 实现步骤
16QAM 的调制函数
5.1
function [complex_qam_data]=qam16(bitdata)
%modulation of 16QAM,modulate bitdata to 16QAM complex signal
X1=reshape(bitdata,4,length(bitdata)/4)';
d=1;%min distance of symble
for i=1:length(bitdata)/4;
for j=1:4
X1(i,j)=X1(i,j)*(2^(4-j));
end
source(i,1)=1+sum(X1(i,:));%convert to the number 1 to 16
end
mapping=[-3*d 3*d;
-d
d
3*d;
3*d;
3
3*d
-3*d
-d
d
3*d
-3*d
-d
d
3*d
-3*d
-d
d
3*d
3*d;
d;
d;
d;
d;
-d;
-d;
-d;
-d;
-3*d;
-3*d;
-3*d;
-3*d];
for i=1:length(bitdata)/4
qam_data(i,:)=mapping(source(i),:);%data mapping
16QAM 的解调函数。
end
complex_qam_data=complex(qam_data(:,1),qam_data(:,2));
5.2
function [demodu_bit_symble]=demoduqam16(Rx_serial_complex_symbols)
%将得到的串行 16QAM 数据解调成二进制比特流
complex_symbols=reshape(Rx_serial_complex_symbols,length(Rx_serial_complex_symbols),1);
d=1;
mapping=[-3*d 3*d;
-d
d
3*d
-3*d
-d
d
3*d
-3*d
-d
d
3*d
-3*d
-d
d
3*d
3*d;
3*d;
3*d;
d;
d;
d;
d;
-d;
-d;
-d;
-d;
-3*d;
-3*d;
-3*d;
-3*d];
complex_mapping=complex(mapping(:,1),mapping(:,2));
for i=1:length(Rx_serial_complex_symbols);
for j=1:16;
metrics(j)=abs(complex_symbols(i,1)-complex_mapping(j,1));
end
[min_metric
decode_symble(i)]= min(metrics) ; % 将 离 某 星 座 点 最 近 的 值 赋 给
4
decode_symble(i)
end
decode_bit_symble=de2bi((decode_symble-1)','left-msb');
demodu_bit_symble=reshape(decode_bit_symble',1,length(Rx_serial_complex_symbols)*4);
5.3 加窗函数
function [rcosw]=rcoswindow(beta, Ts)
%定义升余弦窗,其中 beta 为滚降系数,Ts 为包含循环前缀的 OFDM 符号的长度,Ts 为正偶
数
t=0:(1+beta)*Ts;
rcosw=zeros(1,(1+beta)*Ts);
for i=1:beta*Ts;
rcosw(i)=0.5+0.5*cos(pi+ t(i)*pi/(beta*Ts));
end
rcosw(beta*Ts+1:Ts)=1;
for j=Ts+1:(1+beta)*Ts+1;
rcosw(j-1)=0.5+0.5*cos((t(j)-Ts)*pi/(beta*Ts));
end
rcosw=rcosw';%变换为列向量
5.4 OFDM 主程序
clear all;
close all;
carrier_count=200;%子载波数
symbols_per_carrier=12;%每子载波含符号数
bits_per_symbol=4;%每符号含比特数,16QAM 调制
IFFT_bin_length=512;%FFT 点数
PrefixRatio=1/4;%保护间隔与 OFDM 数据的比例 1/6~1/4
GI=PrefixRatio*IFFT_bin_length ;% 每 一 个 OFDM 符 号 添 加 的 循 环 前 缀 长 度 为
1/4*IFFT_bin_length 即保护间隔长度为 128
beta=1/32;%窗函数滚降系数
GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度 20
SNR=15; %信噪比 dB
%==================================================
%================信号产生===================================
baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;%所输入的比特
数目
carriers = (1:carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_count/2));%共轭对称子载
波映射 复数数据对应的 IFFT 点坐标
conjugate_carriers = IFFT_bin_length - carriers + 2;%共轭对称子载波映射 共轭复数对应的
IFFT 点坐标
baseband_out=round(rand(1,baseband_out_length));%输出待调制的二进制比特流
%==============16QAM 调制====================================
complex_carrier_matrix=qam16(baseband_out);%列向量
5
complex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_per_carrier)';%s
ymbols_per_carrier*carrier_count 矩阵
figure(1);
plot(complex_carrier_matrix,'*r');%16QAM 调制后星座图
title('16QAM 调制后星座图')
axis([-4, 4, -4, 4]);
grid on
%=================IFFT===========================
IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);% 添 0 组 成 IFFT_bin_length
IFFT 运算
IFFT_modulation(:,carriers ) = complex_carrier_matrix ;%未添加导频信号 ,子载波映射在此
处
IFFT_modulation(:,conjugate_carriers ) = conj(complex_carrier_matrix);%共轭复数映射
%=================================================================
signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2);%OFDM 调制 即 IFFT 变换
time_wave_matrix =signal_after_IFFT;%时域波形矩阵,行为每载波所含符号数,列 ITTF 点
数,N 个子载波映射在其内,每一行即为一个 OFDM 符号
%===========================================================
%=====================
缀 与
====================================
XX=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);
for k=1:symbols_per_carrier;
for i=1:IFFT_bin_length;
加 循
环 前
添
后
缀
XX(k,i+GI)=signal_after_IFFT(k,i);
end
for i=1:GI;
XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI);%添加循环前缀
end
for j=1:GIP;
XX(k,IFFT_bin_length+GI+j)=signal_after_IFFT(k,j);%添加循环后缀
end
end
time_wave_matrix_cp=XX;%添加了循环前缀与后缀的时域信号矩阵,此时一个 OFDM 符号长
度为 IFFT_bin_length+GI+GIP=660
%==============OFDM 符号加窗==========================================
windowed_time_wave_matrix_cp=zeros(1,IFFT_bin_length+GI+GIP);
for i = 1:symbols_per_carrier
windowed_time_wave_matrix_cp(i,:)
real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';%加窗 升余弦窗
end
%======================== 生 成 发 送 信 号 , 并 串 变 换
==================================================
windowed_Tx_data=zeros(1,symbols_per_carrier*(IFFT_bin_length+GI)+GIP);
=
6
windowed_Tx_data(1:IFFT_bin_length+GI+GIP)=windowed_time_wave_matrix_cp(1,:);
for i = 1:symbols_per_carrier-1 ;
windowed_Tx_data((IFFT_bin_length+GI)*i+1:(IFFT_bin_length+GI)*(i+1)+GIP)=windowed_ti
me_wave_matrix_cp(i+1,:);%并串转换,循环后缀与循环前缀相叠加
end
%=======================================================
Tx_data=reshape(windowed_time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_length+GI
+GIP),1)';%加窗后 循环前缀与后缀不叠加 的串行信号
%=================================================================
temp_time1 = (symbols_per_carrier)*(IFFT_bin_length+GI+GIP);%加窗后 循环前缀与后缀不
叠加 发送总位数
figure (2)
subplot(2,1,1);
plot(0:temp_time1-1,Tx_data );%循环前缀与后缀不叠加 发送的信号波形
grid on
ylabel('Amplitude (volts)')
xlabel('Time (samples)')
title('循环前后缀不叠加的 OFDM Time Signal')
temp_time2 =symbols_per_carrier*(IFFT_bin_length+GI)+GIP;
subplot(2,1,2);
plot(0:temp_time2-1,windowed_Tx_data);%循环后缀与循环前缀相叠加 发送信号波形
grid on
ylabel('Amplitude (volts)')
xlabel('Time (samples)')
title('循环前后缀叠加的 OFDM Time Signal')
%===============加窗的发送信号频谱=================================
symbols_per_average = ceil(symbols_per_carrier/5);%符号数的 1/5,10 行
avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;%点数,10 行数据,10 个
符号
averages = floor(temp_time1/avg_temp_time);
average_fft(1:avg_temp_time) = 0;%分成 5 段
for a = 0:(averages-1)
subset_ofdm = Tx_data(((a*avg_temp_time)+1):((a+1)*avg_temp_time));%利用循环前缀后缀
未叠加的串行加窗信号计算频谱
subset_ofdm_f = abs(fft(subset_ofdm));%分段求频谱
average_fft = average_fft + (subset_ofdm_f/averages);%总共的数据分为 5 段,分段进行 FFT,
平均相加
end
average_fft_log = 20*log10(average_fft);
figure (3)
subplot(2,1,2)
plot((0:(avg_temp_time-1))/avg_temp_time, average_fft_log)% 归 一 化 0/avg_temp_time
(avg_temp_time-1)/avg_temp_time
:
7