OFDM的系统仿真与实现.docx
《OFDM的系统仿真与实现.docx》由会员分享,可在线阅读,更多相关《OFDM的系统仿真与实现.docx(18页珍藏版)》请在冰豆网上搜索。
OFDM的系统仿真与实现
OFDM的系统仿真与实现
一、实验器件
Matlab编程软件、PC机
二、实验目的
1、通过实验过程熟悉OFDM的系统运行过程.
2、进一步练习通过MATLAB解决通信系统的仿真问题.
3、掌握导频插入、训练序列等原理与实际运用.
4、掌握通过实际仿真与理论分析的结合的方法.
三、OFDM的基本原理
OFDM(OrthogonalFrequencyDivisionMultiplexing)即正交频分复用技术,实际上OFDM是多载波调制的一种。
其主要思想是:
将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。
正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰ICI。
每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上的可以看成平坦性衰落,从而可以消除符号间干扰。
而且由于每个子信道的带宽仅仅是原信道带宽的一小部分,信道均衡变得相对容易。
在向B3G/4G演进的过程中,OFDM是关键的技术之一,可以结合分集,时空编码,干扰和信道间干扰抑制以及智能天线技术,最大限度的提高了系统性能。
包括以下类型:
V-OFDM,W-OFDM,F-OFDM,MIMO-OFDM,多带-OFDM。
OFDM是一种无线环境下的高速传输技术。
无线信道的频率响应曲线大多是非平坦的,而OFDM技术的主要思想就是在频域内将给定信道分成许多正交子信道,在每个子信道上使用一个子载波进行调制,并且各子载波并行传输。
这样,尽管总的信道是非平坦的,具有频率选择性,但是每个子信道是相对平坦的,在每个子信道上进行的是窄带传输,信号带宽小于信道的相应带宽,因此就可以大大消除信号波形间的干扰。
由于在OFDM系统中各个子信道的载波相互正交,它们的频谱是相互重叠的,这样不但减小了子载波间的相互干扰,同时又提高了频谱利用率。
OFDM技术属于多载波调制(Multi-CarrierModulation,MCM)技术。
有些文献上将OFDM和MCM混用,实际上不够严密。
MCM与OFDM常用于无线信道,它们的区别在于:
OFDM技术特指将信道划分成正交的子信道,频道利用率高;而MCM,可以是更多种信道划分方法。
OFDM技术的推出其实是为了提高载波的频谱利用率,或者是为了改进对多载波的调制,它的特点是各子载波相互正交,使扩频调制后的频谱可以相互重叠,从而减小了子载波间的相互干扰。
在对每个载波完成调制以后,为了增加数据的吞吐量、提高数据传输的速度,它又采用了一种叫作HomePlug的处理技术,来对所有将要被发送数据信号位的载波进行合并处理,把众多的单个信号合并成一个独立的传输信号进行发送。
另外OFDM之所以备受关注,其中一条重要的原因是它可以利用离散傅立叶反变换/离散傅立叶变换(IDFT/DFT)代替多载波调制和解调。
OFDM增强了抗频率选择性衰落和抗窄带干扰的能力。
在单载波系统中,单个衰落或者干扰可能导致整个链路不可用,但在多载波的OFDM系统中,只会有一小部分载波受影响。
此外,纠错码的使用还可以帮助其恢复一些载波上的信息。
通过合理地挑选子载波位置,可以使OFDM的频谱波形保持平坦,同时保证了各载波之间的正交。
OFDM尽管还是一种频分复用(FDM),但已完全不同于过去的FDM。
OFDM的接收机实际上是通过FFT实现的一组解调器。
它将不同载波搬移至零频,然后在一个码元周期内积分,其他载波信号由于与所积分的信号正交,因此不会对信息的提取产生影响。
OFDM的数据传输速率也与子载波的数量有关。
OFDM每个载波所使用的调制方法可以不同。
各个载波能够根据信道状况的不同选择不同的调制方式,比如BPSK、QPSK、8PSK、16QAM、64QAM等等,以频谱利用率和误码率之间的最佳平衡为原则。
我们通过选择满足一定误码率的最佳调制方式就可以获得最大频谱效率。
无线多径信道的频率选择性衰落会使接收信号功率大幅下降,经常会达到30dB之多,信噪比也随之大幅下降。
为了提高频谱利用率,应该使用与信噪比相匹配的调制方式。
可靠性是通信系统正常运行的基本考核指标,所以很多通信系统都倾向于选择BPSK或QPSK调制,以确保在信道最坏条件下的信噪比要求,但是这两种调制方式的频谱效率很低。
OFDM技术使用了自适应调制,根据信道条件的好坏来选择不同的调制方式。
比如在终端靠近基站时,信道条件一般会比较好,调制方式就可以由BPSK(频谱效率1bit/s/Hz)转化成16QAM-64QAM(频谱效率4~6bit/s/Hz),整个系统的频谱利用率就会得到大幅度的提高。
自适应调制能够扩大系统容量,但它要求信号必须包含一定的开销比特,以告知接收端发射信号所应采用的调制方式。
终端还要定期更新调制信息,这也会增加更多的开销比特。
OFDM还采用了功率控制和自适应调制相协调工作方式。
信道好的时候,发射功率不变,可以增强调制方式(如64QAM),或者在低调制方式(如QPSK)时降低发射功率。
功率控制与自适应调制要取得平衡。
也就是说对于一个发射台,如果它有良好的信道,在发送功率保持不变的情况下,可使用较高的调制方案如64QAM;如果功率减小,调制方案也就可以相应降低,使用QPSK方式等。
自适应调制要求系统必须对信道的性能有及时和精确的了解,如果在差的信道上使用较强的调制方式,那么就会产生很高的误码率,影响系统的可用性。
OFDM系统可以用导频信号或参考码字来测试信道的好坏。
发送一个已知数据的码字,测出每条信道的信噪比,根据这个信噪比来确定最适合的调制方式。
三、OFDM系统实现的整体思路
1、系统图如下:
2、具体实现过程
(1)先进行信道编码
为了提高数字通信系统的性能,信道编码(通常还伴有交织)是普遍采用的方法。
在OFDM系统中,如果信道衰落不是太严重,均衡是无法再利用信道的分集特性来改善系统性能的,因为OFDM系统自身具有利用信道分集特性的能力,一般的信道特性信息已经被OFDM这种调制方式本身所利用了。
但是,OFDM系统的结构却为在子载波间进行编码提供了机会,形成COFDM(前置编码OFDM)方式。
编码可以采用各种码,如分组码、卷积码等,其中卷积码的效果要比分组码好,但分组码的编解码实现更为简单。
(2)子载波调制
传输信号进行信道编码后,要进行子载波的数字调制将其转换成载波幅度和相位的映射,一般采用QAM或MPSK方式。
各子载波不必要采用相同的状态数(进制数),甚至不必要采用相同的调制方式。
这使得OFDM支持的传输速率可以在一个较大的范围内变化,并可以根据子信道的干扰情况,在不同的子信道上采用不同状态数的调制,甚至采用不同的调制方式。
调制信号星座在IFFT之前根据调制模式形成。
(3)加入保护间隔
应用OFDM的一个重要原因在于它可以有效地对抗多径时延扩展。
把输入数据流串并变换到个并行的子信道中,使得每一个调制子载波的数据周期可以扩大为原始数据符号周期的N倍,因此时延扩展与符号周期的数值比也同样降低N倍。
另外,通过在每个OFDM符号间插入保护间隔可以进一步抵制符号间干扰(ISI),还可以减少在接收端的定时偏移错误。
这种保护间隔是一种循环复制,增加了符号的波形长度,在符号的数据部分,每一个子载波内有一个整数倍的循环,此种符号的复制产生了一个循环的信号,即将每个OFDM符号的后
时间中的样点复制到OFDM符号的前面,形成循环前缀,在交接点没有任何的间断。
因此将一个符号的尾端复制并补充到起始点增加了符号时间的长度。
符号的总长度为
,其中
为OFDM符号的总长度,
为抽样的保护间隔长度,TFFT为FFT变化产生的无保护间隔的OFDM符号长度,则可以完全克服ISI的影响。
同时,由于OFDM延时副本内所包含的子载波的周期个数也为整数,时延信号就不会破坏子载波间的正交性,在FFT解调过程中就不会产生载波间干扰(ICI)。
(3)将信号进行上变频(载波调制)后,发送出去,在接收端经过解调、逆快速傅里叶变换、去掉保护间隔等过程即可恢复原始的信号。
四、OFDM系统的具体实现
1、详细设计思路
接收端采用的算法和程序流程与发送端发送的OFDM符号的帧结构有关系。
具体的帧结构,以及定时估计,频偏估计,剩余误差跟踪的算法可参考算法说明文档。
这里对程序的流程进行说明。
首先根据短训练字的特性进行相关运算,进行信号到达检测,当检测到相关值大于门限一定次数后,认为有信号到达。
然后根据长训练字的特性,进行相关运算,进行OFDM符号FFT窗口起始位置的估计。
估计出FFT窗口的位置后,先在时域进行小频偏的估计,将两个长训练字进行小频偏补偿后,进行FFT运算,根据FFT运算的结果进行整数倍频偏的估计。
这些参数估计完成后,就可以进行数据解调了。
先对数据部分进行完整的频偏补偿,然后根据估计的FFT窗口位置进行FFT运算得到频域的数据,进行解调。
然后在对应于导频的子载波位置上提取出导频信息,根据导频信息估计出剩余定时误差以及剩余的信道响应误差,将误差量送入环路进行跟踪。
当收到所有数据后,重新回到信号到达检测状态,进行下一次信号到达的检测和信号接收。
2、程序流程图
3、具体代码实现
Nfft=128*2;%256进行256点的FFT
Ng=32*2;%64
Nzero=0;
Nzerosub=floor((Nfft*0.5)/2);%forpadding
Ntotal=Ng+2*Nzero+Nfft;%320
Constellation_num=16;
Symbol_num=20;%able
N=Symbol_num*Nfft;%total
Ns=Symbol_num*Ntotal;
Pnum_least(1:
Symbol_num)=10000;
Pnum(1:
Symbol_num)=0;
Ndata_o=Symbol_num*(Nfft/2-Nfft/16/2);
sita=0;
sita1=1;
sita2=0;
sita3=0;%测试变量
sign=1;
%forfilter
LHBF1=23;%半带滤波器长度
%I1=zeros(1,Ndata_o);
%I2=zeros(1,Ndata_o);
%I3=zeros(1,Ndata_o);
%I4=zeros(1,Ndata_o);
CHBF1(1:
LHBF1)=0;
InsertGIout(1:
Symbol_num,1:
Ntotal)=0;
%半带滤波器系数
fid2=fopen('HBF23.txt','r');
CHBF1=fscanf(fid2,'%f');
fclose(fid2);
IHBF1in(1:
LHBF1)=0;
QHBF1in(1:
LHBF1)=0;%进行半带滤波时的缓冲区
IHBF1out(1:
2*Ns)=0;
QHBF1out(1:
2:
Ns)=0;%两倍上采样后时域数据的存放数组
%I、Q分别表示I、Q两路信号
ii=1;k=1;k1=1;k2=1;k3=1;k4=1;k5=1;
t=1;t2=1;t3=1;
SoutI(1:
Ns)=0;
SoutQ(1:
Ns)=0;%没有进行两倍上采样之前的时域数据存放数组
%I、Q分别表示I、Q两路信号
IFFToutI(1:
Symbol_num,1:
Nfft)=0;
IFFToutQ(1:
Symbol_num,1:
Nfft)=0;
IFFToutIQ(1:
Symbol_num,1:
Nfft)=0;
IFFToutIQS(1:
Symbol_num,1:
Nfft)=0;%进行IFFT运算后OFDM符号存放数组
%I、Q分别表示I、Q两路信号
%IQ表示复数信息
FFTout_t_1(1:
Symbol_num,1:
2*Nfft)=0;
FFTout_t_2(1:
Symbol_num,1:
4*Nfft)=0;
FFTout_t_3(1:
Symbol_num,1:
8*Nfft)=0;%测试变量
ii=1;
M_pilot=8;
subcarrier(1:
N)=0;
subcarriercom(1:
N)=0;
%train_word
%获得短前导字频域信息
fid3=fopen('data_I_train_word_re_i0_256.txt','r');
I_train_word_re_temp=fscanf(fid3,'%f');
fclose(fid3);
I_train_word_re=(I_train_word_re_temp)';
fid3=fopen('data_Q_train_word_re_i0_256.txt','r');
Q_train_word_re_temp=fscanf(fid3,'%f');
fclose(fid3);
Q_train_word_re=(Q_train_word_re_temp)';
%获得一个长前导字频域信息
fid3=fopen('data_I_train_word_1_i0_256.txt','r');
I_train_word_1_temp=fscanf(fid3,'%f');
fclose(fid3);
I_train_word_1=(I_train_word_1_temp)';
fid3=fopen('data_Q_train_word_1_i0_256.txt','r');
Q_train_word_1_temp=fscanf(fid3,'%f');
fclose(fid3);
Q_train_word_1=(Q_train_word_1_temp)';
%获得二个长前导字频域信息
fid3=fopen('data_I_train_word_2_i0_256.txt','r');
I_train_word_2_temp=fscanf(fid3,'%f');
fclose(fid3);
I_train_word_2=(I_train_word_2_temp)';
fid3=fopen('data_Q_train_word_2_i0_256.txt','r');
Q_train_word_2_temp=fscanf(fid3,'%f');
fclose(fid3);
Q_train_word_2=(Q_train_word_2_temp)';
l=1;
%加窗处理的参数设置
wind=zeros(1,(Nfft+Ng));
windo=hamming(Nfft+Ng);
wind((Ng+1):
Nfft)=windo((Ng+1):
Nfft);
wind(1:
Ng)=windo(Ng+1);
wind((Nfft+1):
(Nfft+Ng))=windo(Nfft);
stst=1;
%获得随机数,当作用户信息,调制到各个子载波上
fid3=fopen('I1.txt','r');
I1=fscanf(fid3,'%d,');
fclose(fid3);
fid3=fopen('I2.txt','r');
I2=fscanf(fid3,'%d,');
fclose(fid3);
fid3=fopen('I3.txt','r');
I3=fscanf(fid3,'%d,');
fclose(fid3);
fid3=fopen('I4.txt','r');
I4=fscanf(fid3,'%d,');
fclose(fid3);
%BitsMappingtoconstellations
fori=1:
N
%前面4个符号是前导字
if(i%短前导字
if(i>0&i<2*Nfft+1)
if(rem(i,Nfft)==0)
Imapped(i)=I_train_word_re(Nfft);
Qmapped(i)=Q_train_word_re(Nfft);
else
Imapped(i)=I_train_word_re(rem(i,Nfft));
Qmapped(i)=Q_train_word_re(rem(i,Nfft));
end
end
%第一个长前导字
if(i>2*Nfft&i<3*Nfft+1)
if(rem(i,Nfft)==0)
Imapped(i)=I_train_word_1(Nfft);
Qmapped(i)=Q_train_word_1(Nfft);
else
Imapped(i)=I_train_word_1(rem(i,Nfft));
Qmapped(i)=Q_train_word_1(rem(i,Nfft));
end
end
%第二个长前导字
if(i>3*Nfft&iif(rem(i,Nfft)==0)
Imapped(i)=I_train_word_2(Nfft);
Qmapped(i)=Q_train_word_2(Nfft);
else
Imapped(i)=I_train_word_2(rem(i,Nfft));
Qmapped(i)=Q_train_word_2(rem(i,Nfft));
end
end
else
%前导字发送完后,发送用户信息,这里用随机数代替用户信息
%中间查0的虚拟子载波没有用户信息
if((rem(i,Nfft)<(Nfft/2-Nzerosub+1))|(rem(i,Nfft)>(Nfft/2+Nzerosub)))
if(rem(i,Nfft/(2*M_pilot))==0)%insertpilots
if(sign==1)
Isignal=3*1.414;
Qsignal=0;
else
Isignal=-3*1.414;
Qsignal=0;
end%%sub-carrierpolitschemeisBPSK
stst=stst+1;
else
%插入导频信息
Isignal=2*(I1(l)*1+I2(l)*2)-3;
Qsignal=2*(I3(l)*1+I4(l)*2)-3;
l=l+1;
end
Imapped(i)=Isignal;
Qmapped(i)=Qsignal;
else
%中间查0的虚拟子载波没有用户信息
Imapped(i)=0;
Qmapped(i)=0;
end
end
if(rem(i,Nfft)==0)
now_step=[num2str(ii)]
sign=rem(sign+1,2);
Imappedfs(1:
Nfft)=Imapped(i-Nfft+1:
i);
Qmappedfs(1:
Nfft)=Qmapped(i-Nfft+1:
i);
%对频域信息进行IFFT变换,获得时域信息
IFFToutI(ii,1:
Nfft)=ifft(Imappedfs,Nfft);
IFFToutQ(ii,1:
Nfft)=ifft(Qmappedfs,Nfft);
%IFFToutIQ(ii,1:
Nfft)=IFFToutI+j*IFFToutQ;
IFFToutIQS(ii,1:
Nfft)=ifft(Imappedfs(1:
Nfft)+j*Qmappedfs(1:
Nfft),Nfft);
IFFToutIQ(ii,1:
Nfft)=IFFToutIQS(ii,1:
Nfft);
ii=ii+1;
end;
end;%endoffftsymbolgeneration
for(ig=1:
Symbol_num)
%插入循环前缀
InsertGIout(ig,1:
Nzero)=0;
InsertGIout(ig,Ng+Nzero+1:
(Ng+Nfft+Nzero))=IFFToutIQ(ig,1:
Nfft);
InsertGIout(ig,Nzero+1:
(Ng+Nzero))=IFFToutIQ(ig,(Nfft-Ng)+1:
Nfft);
InsertGIout(ig,(Ng+Nfft+Nzero)+1:
Ntotal)=0;
%加窗处理
if(ig>4)
InsertGIouta(ig,1:
Ntotal)=InsertGIout(ig,1:
Ntotal);
InsertGIout(ig,1:
Ntotal)=InsertGIouta(ig,1:
Ntotal).*wind;
end
FFTout_t(ig,1:
Nfft)=fft(InsertGIout(ig,Ng+1-sita:
Nfft+Ng-sita),Nfft);%进行中间变量的测试
%将生成的OFDM时域信号依次写入一个数组里,形成一个连续的OFDM时域数据流
for(is=1:
Ntotal)
SoutI((ig-1)*Ntotal+is)=real(InsertGIout(ig,is));
SoutQ((ig-1)*Ntotal+is)=imag(InsertGIout(ig,is));
end;
end;
%对生成的OFDM时域信号进行两倍上采样
%samplerateinterpolationandmodulation
for(k=1:
Ns)
%HBF1
forj1=1:
2
IHBF1in(2:
LHBF1)=IHBF1in(1:
LHBF1-1);
QHBF1in(2:
LHBF1)=QHBF1in(1:
LHBF1-1);
if(j1==1)
IHBF1in
(1)=SoutI(k);
QHBF1in
(1)=SoutQ(k);
else
IHBF1in
(1)=0;
QHBF1in
(1)=0;
end;
IHBF1out(k1)=2*IHBF1in*CHBF1;
QHBF1out(k1)=2*QHBF1in*CHBF1;
if(rem(k1,2*Ntotal)==0)
FFTout_t_1(t,1:
2*Nfft)=fft(IHBF1out(k1-2*Nfft+1-sita1:
k1-sita1),2*Nfft)+j*fft(QHBF1out(k1-2*Nfft+1-sita1:
k1-sita1),2*Nfft);
t=t+1;
end;
k1=k1+1;
end;%endofj1
end;%endofk
%MODULATION
%将基带信号转换成中频信号
M=2;
NN=length(IHBF1out);
phase0=pi/30;
error_f=0;
w=pi/M;%IF=8*(symbolrate)or(samplerate)/4
IMOD(1:
NN)=0;
QMOD(1:
NN)=0;
Modout(1:
NN)=0;
fori=1:
NN
IMOD(i)=cos(rem(i*w+phase0,2*pi))*IHBF1out(i);
QMOD(i)=-sin(rem(i*w+phase0,2*pi))*QHBF1out(i);
Modout(i)=IMOD(i)+QMOD(i);
end;
zB=20*log10(abs(fft(SoutI+j*SoutQ)));
z