正交频分复用(OFDM) 是第四代移动通信的核心技术。本文首先简要介绍了OFDM基本原理,并对OFDM的系统框架进行了分析,其中包括调制、解调以及IFFT、FFT的数学模型实现。接着重点用MATLAB语言实现了整个系统基于QPSK调制技术的计算机仿真,分析该系统的信噪比及PAPR的分布。最后对QPSK调制解调系统进行了仿真,对两种系统的性能进行了比较。仿真结果表明:OFDM频带利用率高,误码率高,功率利用率下降,而QPSK频带利用率低,误码率低,功率利用率升高。
OFDM的全称为Orthogonal Frequency Division Multiplexing,意为正交频分复用。OFDM的思想可以追溯到20世纪60年代,当时人们对多载波调制做了许多理论上的工作,论证了在存在符号间干扰的带限信道上采用多载波调制可以优化系统的传输性能。进入20世纪90年代,由于数字信号处理技术和大规模集成电路技术的进步,OFDM技术在高速数据传输领域受到了人们的广泛关注。现在OFDM已经在欧洲的数字音视频广播(如DAB和DVB)、欧洲和北美的高速无线局域网系统(如HIRERLAN2、IEEE802.11a)、高比特率数字用户线(如ADSL、VDSL)以及电力线载波通信中得到了广泛的应用。
OFDM通信技术是多载波传输技术的典型代表。多载波传输把数据流分解为若干个独立的子比特率,每个子数据流将具有低得多的比特速率,用这样低比特率形成的低速率多状态符号去调制相应的子载波,就构成了多个低速率符号并行发送的传输系统。OFDM是多载波传输方案的实现方式之一,利用快速傅里叶逆变换(IFFT)和快速傅里叶变换(FFT)来分别实现调制和解调,是实现复杂度最低、应用最广的一种多载波传输方案。
-
- 正交调制解调
OFDM是一种特殊的多载波传送方案,单个用户的信息流被串/并变换为多个低速率码流,每个码流都用一条载波发送。OFDM弃用传统的用带通滤波器来分隔子载波频谱的方式,改用跳频方式选用那些即便频谱混叠也能够保持正交的波形,因此,OFDM既可以当作调制技术,也可以当作复用技术。OFDM增强了抗频率选择性衰落和抗窄带干扰的能力。为了提高频谱利用率,OFDM方式中各个子载波频谱有1/2重叠,但保持相互正交,在接收端通过相关解调分离出各个子载波,同时消除码间干扰的影响。
OFDM是一种多载波调制技术,其原理是用N个子载波把整个信道分割成N个子信道,即将频率上等间隔的N个子载波信号调制并相加后同时发送,实现N个信道并行传输信息。这样每个符号的频谱只占用信道带宽的1/N,且使各子载波在OFDM符合周期T内保持频谱的正交性。即满足:
%main_OFDM.m
%OFDM通信系统的仿真设计,包括QPSK或QAM数字调制、IFFT、
%保护间隔、高斯信道建模、FFT、解调、计算信噪比及PAPR
clear all;
%+++++++++++++++++++++++++++++++++++++++++++++++++
%seq_num
%SNR_Pre 设定用于仿真的信噪比的初值
%interval_SNR 设定用于仿真的信噪比间隔
%frame_num 每一个信噪比下仿真的数据的帧数
%Pe 用于计算出现的误比特数
%N 子载波数
%+++++++++++++++++++++++++++++++++++++++++++++++++
N=64;
SNR_Pre=1;
interval_SNR =1;
Pe=zeros(1,20);
%发射机
frame_num =5000;
for SNR_System=SNR_Pre:interval_SNR:20
counter=0;
for seq_num=1:frame_num
%+++++++++++++++输入数据++++++++++++
datain=randint(1,N);
%+++++++++++++++++++++++++++++++++++
%++++++++++++++QPSK调制++++++++++++++
qpskin=reshape(datain,2,[]);%将生成序列变成两行
qpskflection=(ones(2,N/2)).*(-1);
qpskflection=qpskflection.^qpskin;%0--1;1---1
qpskflection(2,:)=j*qpskflection(2,:);
qpskout=sum(qpskflection);
%+++++++++++++++++++++++++++++++++++++++
%++++++++++++++++扩展++++++++++++++++++
ifftin=zeros(1,N);
ifftout=zeros(1,N);
for k=1:N %将输入的N/2点扩展为共轭对称的N点
if (33>k>=1)
if(k==1)
ifftin(1)=qpskflection(1,1);
else
ifftin(k)=qpskout(k);
end
else
if(k==33)
ifftin(k)=(-1)*j*qpskflection(2,1);
else
ifftin(k)=conj(qpskout(N+2-k));
end
end
end
%+++++++++++++++++++++++++++++++++++++
%+++++++++++++++++IFFT+++++++++++++++++
ifftout=ifft(N*ifftin);
%+++++++++++++++++++++++++++++++++++++++
%+++++++++++++++加入保护间隔++++++++++++++++++++
clength=N+N/16;
PVout=zeros(1,clength);
col=(N-N/16+1):(N);
PVout=[ifftout(col),ifftout];
%++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++高斯白噪声信道+++++++++++++++++
gsrv=awgn(PVout,SNR_System,'measured');
%+++++++++++++++++++++++++++++++++++++++++++++++++
%接收机
%+++++++++++++++++++++去保护间隔++++++++++++++++++++++++
movep=zeros(1,N);
length=(N/16+1):(N+N/16);
movep=gsrv(length);
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++++++++FFT++++++++++++++++++++++++++++
fftout=(fft(movep))/N;
%++++++++++++++++++++++++++++++++++++++++++++++++++++++
%+++++++++++++++QPSK解调++++++++++++++++++++++++++++
%outsign=qpskout(fftout,count,k);
count=1;
K=1;
%判决门限取0
if((fftout(K))>=0)
outsign(count)=0;
count=count+1;
else
outsign(count)=1;
count=count+1;
end
if((fftout(N/2+1))>0)
outsign(count)=0;
count=count+1;
else
outsign(count)=1;
count=count+1;
end
for K=2:N/2
realpart=real(fftout(K));
imagpart=imag(fftout(K));
if(realpart>=0)
outsign(count)=0;
count=count+1;
else
outsign(count)=1;
count=count+1;
end
if(imagpart>=0)
outsign(count)=0;
count=count+1;
else
outsign(count)=1;
count=count+1;
end
end
%+++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++计算误码率++++++++++++++++++++++++
for k=1:N
if(outsign(k)~=datain(k))
counter=counter+1;
end
end
end
Pe(SNR_System)=counter/(N*frame_num);
end
%画图
figure
plot(Pe,'b');
xlabel('信噪比');
ylabel('误码率');
title('不同信噪比下的误码率');
grid on;
%********************** preparation part ***************************
para=64; % Number of parallel channel to transmit (points)
fftlen=64; % FFT length
nd=1; % Number of information OFDM symbol for one loop
ml=2; % Modulation level : QPSK
gilen=8; % Length of guard interval (points)
%**************************Data generation ****************************
seldata=rand(1,para*nd*ml)>0.5; % rand : built in function
%****************** Serial to parallel conversion ***********************
paradata=reshape(seldata,para,nd*ml); % reshape : built in function
%************************** QPSK modulation *************************
[ich,qch]=qpskmod(paradata,para,nd,ml);
kmod=1/sqrt(2); % sqrt : built in function
ich1=ich.*kmod;
qch1=qch.*kmod;
%******************* IFFT ************************
x=ich1+qch1.*i;
y=ifft(x); % ifft : built in function
ich2=real(y); % real : built in function
qch2=imag(y); % imag : built in function
%********* Gurad interval insertion **********
[ich3,qch3]= giins(ich2,qch2,fftlen,gilen,nd);
fftlen2=fftlen+gilen;
N=fftlen2*nd*ml;
y=ich3+qch3*i;
N=64;
fs=10240000; % Symbol rate
df = fs/N;
f1 = 0:df:(N-1)*df;
y1=ich3+qch3*i;
z1 = fft(y1,N);
figure;
plot(f1,abs(z1),'r--');
xlabel('f');ylabel('幅度谱');
legend('原信号');
N=64;
fs=10240000/2; % Symbol rate
df = fs/N;
f2 = 0:df:(N-1)*df;
y2=ich+qch*i;
z2 = fft(y2,N);
figure;
plot(f2,abs(z2),'r--');
xlabel('f');ylabel('幅度谱');
legend('QPSK后的信号');
N=fftlen2;
fs=10240000/2/64; % Symbol rate
df = fs/N;
f3 = 0:df:(N-1)*df;
y3=ich3+qch3*i;
z3 = fft(y3,N);
figure;
plot(f3,abs(z3),'r--');
xlabel('f');ylabel('幅度谱');
legend('OFDM后的信号');