资源描述
OFDM系统仿真
一、OFDM基本原理
把一个高速率的数据流分解成很多低速率的子数据流,以并行的方式在多个子载波上传输,子载波间彼此保持相互正交的关系以消除子载波间数据的干扰。
1. 串并变换
在并行数据传输系统中,许多符号被同时传输 ,每个传输符号速率的在几十bit/s到几十kbit/s之间检错码和纠错码,数据加扰作为串并变换工作的一部分,通过把每个连续的数据比特随机的分配到各个子载波上来实现 ,将比特错误位置的随机化可以提高前向纠错编码对性能,并且系统的总的性能也得到改进。
2. 子载波调制
一个OFDM符号之内包含多个经过相移键控(PSK)或者正交幅度调制(QAM)的子载波。其中,N表示子载波的个数,T表示OFDM符号的持续时间,d(i=0,1,2,….n-1)是分配给每个子载波的数据符号,fi是第i个子载波的载波频率,矩形函数rect(t)=1,,则从开始的OFDM符号可以表示为:
其中,s(t)的实部和虚部分别对应于OFDM符号的同相和正交分量,在实际系统中可以分别于相应子载波的cos分量和sin分量相乘,其中,。在接收端将接收到的同相和正交分量映射回数据信息,完成子载波调解。
OFDM系统基本模型框图
3. OFDM的IDFT/DFT实现
对于N比较大的系统来说,式2中的OFDM复等效基带信号可以采用离散Fourier逆变化(IDFT)方法来实现。令式2中的,并且忽略矩形函数,对信号s(t)以T/N的速率进行抽样,即令t=kT/N,(k=0,1,......N-1),可以得到:
可以看到,等效为对进行IDFT运算。同样在接收端,为了恢复原始的数据符号,可以对进行逆变化,即DFT得到:
由此可见,OFDM系统的调制和解调可以分别通过IDFT/DFT来实现,频域数据符号经过N点IDFT运算变换为时域符号,经过射频载波调制后,发送到信道中。其中每一个IDFT输出的数据符号都是由所有子载波经过叠加生成的,即对连续的多个经过调制的子载波的叠加信号进行抽样得到的。
在OFDM系统的实际应用中,可以采用更加方便快捷的快速Fourier变换(FFT/IFFT)。N点IDFT运算需要实施N*N次的复数乘法,而IFFT可以显著的降低运算的复杂度。对于常用的基2IFFT算法来说,其复数乘法的次数仅为(N/2)。IDFT的计算复杂度会随N增加而呈现二次方增长,IFFT的算法复杂度的增加速度只是稍稍快于线性变化。对于子载波数量非常大的OFDM系统来说,可以进一步采用基4IFFT算法来实施Fourier变换。
4. 保护间隔与循环前缀
应用OFDM的一个重要原因在于它可以有效的对抗多径时延扩展,为了最大限度的消除符号间干扰,还可以在每个OFDM符号之间插入保护间隔,为了消除由于多径所造成的ICI,OFDM符号需要在其保护间隔内填入循环前缀信号。
插入保护间隔后的OFDM系统框图
当子载波个数比较大时,OFDM的符号周期T相对于信道的脉冲响应长度很大,则符号间干扰的影响很小;而如果相邻OFDM符号之间的保护间隔满足的要求,则可以完全克服ISI的影响。同时为了保持子载波之间的正交性,该保护间隔必须是循环前缀。此时,OFDM的符号周期为:
保护间隔的离散长度,即样点个数为:
这样根据图7,保护间隔、功率归一化的OFDM的抽样序列为:
经过信道和加性高斯噪声作用后的接收信号为:
接收信号r(t)经过A/D变换后得到接收序列,为对r(t)按T/N的抽样速率得到的数字抽样。ISI只会对接收序列的钱个样点形成干扰,因此将前个样点去掉,就可以完全消除ISI的影响。对去掉保护间隔的序列进行DFT变换,可得到DFT输出的多载波调解序列,得到N个复数点:
通过适当选择子载波个数N,可以使信道响应平坦,插入保护间隔还有助于子载波之间的正交性,因此OFDM有可能完全消除ISI和多径带来的ICI的影响,接收信号的频率表达为:
(1-13)
其中,为第n个子载波的复衰落系数,代表第个子信道的AWGN,它的实部与虚部均服从零均值高斯分布,且互相独立。噪声方差为:
这个系统有N个并行的子系统,每个子系统经受乘性复干扰和加性白高斯噪声的影响。
●OFDM多载波系统的等效频域系统
二、802.11a的帧结构
1.OFDM物理层编码过程
(1)产生PLCP训练序列。此序列由10个重复的短训练序列和2个重复的加保护间隔(GI)的长训练序列构成。10个端训练序列用来进行接收端的自动增益控制、定时捕获以及完成频率的粗同步。长训练训练作用是在接受端正信道估计以及进行系统的细同步。
(2)根据发送端的速率位、长度位和业务位,再添加适当的比特得到PLCP头。PLCP中Rate和Length经过1/2速率的卷积编码,映射成一个单独BPSK编码的OFDM符号,这与Signal得到一个OFDM符号要经过统一的过程:卷积编码、交织、BPSK调制、插入导频、IFFT,最后是加保护间隔是数据速率达到6Mbit/s。Signal部分不需要扰码。
(3)根据发送端的Rate,计算每个OFDM符号所包含的数据比特率(记为)。编码速率(R),每个OFDM子载波中的比特数()。
(4)发送端服务区后跟着的是PSDU。通过添加适当的“0”(至少6个),使得比特流的长度是的整数倍。调整过后的比特流形成包中的Data部分。
(5)用非0初值产生的伪随机序列形成扰码,然后再与调整后的信息比特做与逻辑运算。
(6)用6个未成扰码的“0”比特替换后6个“0”经过扰码后形成的比特(这些比特能使接收端的卷积编码器回到零状态,而他们解码后只作为尾比特)。
(7) 接下来对数据进行1/2速率的卷积编码,然后再根据编码速率的需要进行打孔(Puncture)。
(8) 将编码输出的数据以NCBPS为长度单位分成若干组,对每一组进行交织(Interleaving)处理。
(9) 编码,交织完成后输出的数据流以NCBPS为长度单位分成若干组,再选择合适的调制方法,如BPSK或者QAM等进行调制。
(10) 将调制后的复数信号按48为单位分成若干组,每一组可以形成一个OFDM符号。一组中的符号映射到编号为-26~-22、-20~-8、-6~-1、1~6、8~20、22~26的OFDM子载波上。编号为-21、-7、7、21的子载波用来插入导频。代表中心频率的0号子载波可以忽略,所以置为零。
(11) 导频插入编号为-21、-7、7和21的4个子载波中,总的子载波是52。
(12) (12) 每一组从编号为-26~26的子载波经过逆傅立叶变换转为时域信号。对逆傅立叶变换后的波形加循环前缀形成GI,并采用时间截短的方法对每一个周期的OFDM符号的波形范围进行加窗处理(Windowing)。
(13) 以含有Rate和Length信息的Signal开始的OFDM符号流一个接一个地进入信道传输。
(14) 根据理想信道的中心频率,将复基带波形上变频到RF频率上。
OFDM系统的主要参数
2. 训练符号
训练符号用来进行同步,训练符号由2部分组成:10个相同的短训练符t1~t100(为正常OFDM符号时间的1/4)和2个相同的长训练符号T1~T2(时间长等于正常的OFDM符号时间长度),总的训练时间长度为16us。
3. Signal域
训练符号之后紧跟着Signal域
§Signal域中的信息比特经过BPSK调制以及效率为1/2的卷积编码,这样就可以得到6Mbit/s的信息传输速率,这也是IEEE 802.11a中规定的最低信息速率。
§随后LENGTH域的长度为12个比特,用于指示MAC请求PHY发送的PSDU的字节个数。
4. Data域的扰码及解扰
Data域包括Service、PSDU、尾比特以及填充比特。在送入卷积编码器要先经过加扰处理,也就是用一长为127的帧同步码来对Data域进行加扰。
三、IEEE 802.11a系统的仿真
§单径信道
§2径信道
源代码:
clear all
%%%%%%%%%%%%% 参数设置部分 %%%%%%%%%%%%%%%%%
Nsp=52; %系统子载波数(不包括直流载波)
Nfft=64; % FFT 长度
Ncp=16; % 循环前缀长度
Ns=Nfft+Ncp; % 1个完整OFDM符号长度
noc=53; % 包含直流载波的总的子载波数
Nd=6; % 每帧包含的OFDM符号数(不包括训练符号)
M1=4; % QPSK调制
M2=16; % 16-QAM调制
sr=250000; % OFDM符号速率
EbNo=0:2:30; % 归一化信噪比
Nfrm=10000; % 每种信噪比下的仿真帧数
ts=1/sr/Ns; % OFDM符号抽样时间间隔
t=0:ts:(Ns*(Nd+1)*Nfrm-1)*ts; % 抽样时刻
fd=100; % 最大多普勒频移
h=rayleigh(fd,t); % 生成单径Rayleigh衰落信道
h1=sqrt(2/3)*h;
h2=sqrt(1/3)*rayleigh(fd,t);
h2=[zeros(1,4) h2(1:end-4)];
%训练符号频域数据,采用802.11a中的长训练符号数据
Preamble=[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 ...
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];
Preamble1=zeros(1,Nfft);
Preamble1(2:27)=Preamble(27:end); % 前导重排后的数据
Preamble1(39:end)=Preamble(1:26);
preamble1=ifft(Preamble1); % 训练符号时域数据
preamble1=[preamble1(Nfft-Ncp+1:end) preamble1]; % 加入循环前缀
%%%%%%%%%%%%%%%%%%%%% 仿真循环 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for ii=1:length(EbNo)
%**************************发射机部分 *****************************
msg1=randsrc(Nsp,Nd*Nfrm,[0:M1-1]); % QPSK信息数据
msg2=randsrc(Nsp,Nd*Nfrm,[0:M2-1]); % 16-QAM信息数据
data1=pskmod(msg1,M1,pi/4); % QPSK调制
data2=qammod(msg2,M2)/sqrt(10); % 16-QAM调制并归一化
data3=zeros(Nfft,Nd*Nfrm); % 根据FFT要求,对数据重排
data4=zeros(Nfft,Nd*Nfrm);
data3(2:27,:)=data1(27:end,:);
data3(39:end,:)=data1(1:26,:);
data4(2:27,:)=data2(27:end,:);
data4(39:end,:)=data2(1:26,:);
clear data1 data2; % 清除不需要的临时变量
data3=ifft(data3); % IFFT变换
data4=ifft(data4);
data3=[data3(Nfft-Ncp+1:end,:);data3]; % 加入循环前缀
data4=[data4(Nfft-Ncp+1:end,:);data4];
spow1=norm(data3,'fro').^2/(Nsp*Nd*Nfrm); % 计算符号能量
spow2=norm(data4,'fro').^2/(Nsp*Nd*Nfrm);
data5=zeros(Ns,(Nd+1)*Nfrm); % 加入训练符号
data6=data5;
for indx=1:Nfrm
data5(:,(indx-1)*(Nd+1)+1)=preamble1.';
data5(:,(indx-1)*(Nd+1)+2:indx*(Nd+1))=data3(:,(indx-1)*Nd+1:indx*Nd);
data6(:,(indx-1)*(Nd+1)+1)=preamble1.';
data6(:,(indx-1)*(Nd+1)+2:indx*(Nd+1))=data4(:,(indx-1)*Nd+1:indx*Nd);
end
clear data3 data4; % 清除不需要的临时变量
data5=reshape(data5,1,Ns*(Nd+1)*Nfrm); % 并串变换
data6=reshape(data6,1,Ns*(Nd+1)*Nfrm);
data51=zeros(1,length(data5));
data61=zeros(1,length(data6));
data51(5:end)=data5(1:end-4);
data61(5:end)=data6(1:end-4);
sigma1=sqrt(1/2*spow1/log2(M1)*10.^(-EbNo(ii)/10)); % 根据EbNo计算噪声标准差
sigma2=sqrt(1/2*spow2/log2(M2)*10.^(-EbNo(ii)/10));
for indx=1:Nfrm
dd1=data5((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
dd2=data6((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
dd3=data51((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
dd4=data61((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
hh=h((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1)); % 当前帧的单径信道参数
hh1=h1((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1)); % 当前帧的2径信道参数
hh2=h2((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
% 信号通过单径衰落信道,并加入高斯白噪声
r1=hh.*dd1+sigma1*(randn(1,length(dd1))+j*randn(1,length(dd1)));
r2=hh.*dd2+sigma2*(randn(1,length(dd2))+j*randn(1,length(dd2)));
% 信号通过2径衰落信道,并加入高斯白噪声
r11=hh1.*dd1+hh2.*dd3+sigma1*(randn(1,length(dd1))+j*randn(1,length(dd1)));
r21=hh1.*dd2+hh2.*dd4+sigma2*(randn(1,length(dd2))+j*randn(1,length(dd2)));
r1=reshape(r1,Ns,Nd+1); % 串并变换
r2=reshape(r2,Ns,Nd+1);
r11=reshape(r11,Ns,Nd+1);
r21=reshape(r21,Ns,Nd+1);
r1=r1(Ncp+1:end,:); % 移除循环前缀
r2=r2(Ncp+1:end,:);
r11=r11(Ncp+1:end,:);
r21=r21(Ncp+1:end,:);
R1=fft(r1); % fft运算
R2=fft(r2);
R11=fft(r11);
R21=fft(r21);
R1=[R1(39:end,:);R1(2:27,:)]; % 数据重排
R2=[R2(39:end,:);R2(2:27,:)];
R11=[R11(39:end,:);R11(2:27,:)];
R21=[R21(39:end,:);R21(2:27,:)];
HH1=(Preamble.')./R1(:,1); % 信道估计
HH2=(Preamble.')./R2(:,1);
HH11=(Preamble.')./R11(:,1);
HH21=(Preamble.')./R21(:,1);
HH1=HH1*ones(1,Nd);
HH2=HH2*ones(1,Nd);
HH11=HH11*ones(1,Nd);
HH21=HH21*ones(1,Nd);
x1=R1(:,2:end).*HH1; % 信道补偿
x2=R2(:,2:end).*HH2;
x3=R11(:,2:end).*HH11;
x4=R21(:,2:end).*HH21;
x1=pskdemod(x1,M1,pi/4); % 数据解调
x2=qamdemod(x2.*sqrt(10),M2);
x3=pskdemod(x3,M1,pi/4);
x4=qamdemod(x4.*sqrt(10),M2);
[neb1(indx),temp]=biterr(x1,msg1(:,(indx-1)*Nd+1:indx*Nd),log2(M1)); % 统计一帧中的错误比特数
[neb2(indx),temp]=biterr(x2,msg2(:,(indx-1)*Nd+1:indx*Nd),log2(M2));
[neb3(indx),temp]=biterr(x3,msg1(:,(indx-1)*Nd+1:indx*Nd),log2(M1));
[neb4(indx),temp]=biterr(x4,msg2(:,(indx-1)*Nd+1:indx*Nd),log2(M2));
end
ber1(ii)=sum(neb1)/(Nsp*log2(M1)*Nd*Nfrm); % 理想信道估计的误比特率
ber2(ii)=sum(neb2)/(Nsp*log2(M2)*Nd*Nfrm);
ber3(ii)=sum(neb3)/(Nsp*log2(M1)*Nd*Nfrm); % 非理想信道估计的误比特率
ber4(ii)=sum(neb4)/(Nsp*log2(M2)*Nd*Nfrm);
end
semilogy(EbNo,ber1,'-ro',EbNo,ber3,'-rv',EbNo,ber2,'-r*',EbNo,ber4,'-rx')
grid on
title('OFDM系统误比特率性能')
legend('QPSK 单径信道','QPSK 2径信道','16-QAM 单径信道','16-QAM 2径信道')
xlabel('信噪比(EbNo)')
ylabel('误比特率')
展开阅读全文