OFDM的系统仿真与实现Word文件下载.docx
《OFDM的系统仿真与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《OFDM的系统仿真与实现Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
![OFDM的系统仿真与实现Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/8/e4ed7195-8353-422c-9dc4-5756c6946555/e4ed7195-8353-422c-9dc4-5756c69465551.gif)
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:
QHBF1in(1:
%进行半带滤波时的缓冲区
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:
SoutQ(1:
%没有进行两倍上采样之前的时域数据存放数组
IFFToutI(1:
Nfft)=0;
IFFToutQ(1:
IFFToutIQ(1:
IFFToutIQS(1:
%进行IFFT运算后OFDM符号存放数组
%IQ表示复数信息
FFTout_t_1(1:
2*Nfft)=0;
FFTout_t_2(1:
4*Nfft)=0;
FFTout_t_3(1:
8*Nfft)=0;
M_pilot=8;
subcarrier(1:
N)=0;
subcarriercom(1:
%train_word
%获得短前导字频域信息
fid3=fopen('
data_I_train_word_re_i0_256.txt'
I_train_word_re_temp=fscanf(fid3,'
fclose(fid3);
I_train_word_re=(I_train_word_re_temp)'
;
data_Q_train_word_re_i0_256.txt'
Q_train_word_re_temp=fscanf(fid3,'
Q_train_word_re=(Q_train_word_re_temp)'
%获得一个长前导字频域信息
data_I_train_word_1_i0_256.txt'
I_train_word_1_temp=fscanf(fid3,'
I_train_word_1=(I_train_word_1_temp)'
data_Q_train_word_1_i0_256.txt'
Q_train_word_1_temp=fscanf(fid3,'
Q_train_word_1=(Q_train_word_1_temp)'
%获得二个长前导字频域信息
data_I_train_word_2_i0_256.txt'
I_train_word_2_temp=fscanf(fid3,'
I_train_word_2=(I_train_word_2_temp)'
data_Q_train_word_2_i0_256.txt'
Q_train_word_2_temp=fscanf(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;
%获得随机数,当作用户信息,调制到各个子载波上
I1.txt'
I1=fscanf(fid3,'
%d,'
I2.txt'
I2=fscanf(fid3,'
I3.txt'
I3=fscanf(fid3,'
I4.txt'
I4=fscanf(fid3,'
%BitsMappingtoconstellations
fori=1:
N
%前面4个符号是前导字
if(i<
Nfft*4+1)
%短前导字
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
%第一个长前导字
2*Nfft&
3*Nfft+1)
Imapped(i)=I_train_word_1(Nfft);
Qmapped(i)=Q_train_word_1(Nfft);
Imapped(i)=I_train_word_1(rem(i,Nfft));
Qmapped(i)=Q_train_word_1(rem(i,Nfft));
%第二个长前导字
if(i>
3*Nfft&
i<
Nfft*4+1)
Imapped(i)=I_train_word_2(Nfft);
Qmapped(i)=Q_train_word_2(Nfft);
Imapped(i)=I_train_word_2(rem(i,Nfft));
Qmapped(i)=Q_train_word_2(rem(i,Nfft));
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;
Isignal=-3*1.414;
end%%sub-carrierpolitschemeisBPSK
stst=stst+1;
%插入导频信息
Isignal=2*(I1(l)*1+I2(l)*2)-3;
Qsignal=2*(I3(l)*1+I4(l)*2)-3;
l=l+1;
Imapped(i)=Isignal;
Qmapped(i)=Qsignal;
Imapped(i)=0;
Qmapped(i)=0;
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:
%对频域信息进行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:
ii=ii+1;
end;
%endoffftsymbolgeneration
for(ig=1:
Symbol_num)
%插入循环前缀
InsertGIout(ig,1:
Nzero)=0;
InsertGIout(ig,Ng+Nzero+1:
(Ng+Nfft+Nzero))=IFFToutIQ(ig,1:
InsertGIout(ig,Nzero+1:
(Ng+Nzero))=IFFToutIQ(ig,(Nfft-Ng)+1:
InsertGIout(ig,(Ng+Nfft+Nzero)+1:
%加窗处理
if(ig>
4)
InsertGIouta(ig,1:
Ntotal)=InsertGIout(ig,1:
Ntotal);
Ntotal)=InsertGIouta(ig,1:
Ntotal).*wind;
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;
%对生成的OFDM时域信号进行两倍上采样
%samplerateinterpolationandmodulation
for(k=1:
Ns)
%HBF1
forj1=1:
2
IHBF1in(2:
LHBF1)=IHBF1in(1:
LHBF1-1);
QHBF1in(2:
LHBF1)=QHBF1in(1:
if(j1==1)
IHBF1in
(1)=SoutI(k);
QHBF1in
(1)=SoutQ(k);
IHBF1in
(1)=0;
QHBF1in
(1)=0;
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;
k1=k1+1;
%endofj1
%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:
Modout(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);
zB=20*log10(abs(fft(SoutI+j*SoutQ)));
z