您好,欢迎来到年旅网。
搜索
您的当前位置:首页OFDM的系统仿真与实现

OFDM的系统仿真与实现

来源:年旅网


OFDM的系统仿真与实现

一、 实验器件

Matlab编程软件、PC机

二、 实验目的

1、通过实验过程熟悉OFDM的系统运行过程.

2、进一步练习通过MATLAB解决通信系统的仿真问题.

3、掌握导频插入、训练序列等原理与实际运用.

4、掌握通过实际仿真与理论分析的结合的方法.

三、OFDM的基本原理

OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上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、QAM等等,以频谱利用率和误码率之间的最佳平衡为原则。我们通过选择满足一定误码率的最佳调制方式就可以获得最大频谱效率。无线多径信道的频率选择性衰落会使接收信号功率大幅下降,经常会达到30dB之多,信噪比也随之大幅下降。为了提高频谱利用率,应该使用与信噪比相匹配的调制方式。可靠性是通信系统正常运行的基本考核指标,所以很多通信系统都倾向于选择BPSK或QPSK调制,以确保在信道最坏条件下的信噪比要求,但是这两种调制方式的频谱效率很低。OFDM技术使用了自适应调制,根据信道条件的好坏来选择不同的调制方式。比如在终端靠近基站时,信道条件一般会比较好,调制方式就可以由BPSK(频谱效率1bit/s/Hz)转化成16QAM-QAM(频谱效率4~6bit/s/Hz),整个系统的频谱利用率就会得到大幅度的提高。自适应调制能够扩大系统容量,但它要求信号必须包含一定的开销比特,以告知接收端发射信号所应采用的调制方式。终端还要定期更新调制信息,这也会增加更多的开销比特。

OFDM还采用了功率控制和自适应调制相协调工作方式。信道好的时候,发射功率不变,可以增强调制方式(如QAM),或者在低调制方式(如QPSK)时降低发射功率。功率控制与自适应调制要取得平衡。也就是说对于一个发射台,如果它有良好的信道,在发送功率保持不变的情况下,可使用较高的调制方案如QAM;如果功率减小,调制方案也就可以相应降低,使用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、程序流程图

通过两倍下采样内插滤波得到一倍数据率的数据短训练字的相关运算相关值与判决门限进行比较大于门限次数是否到达一定阈值否是长训练字的相关运算OFDM符号起始位置检测和小数倍频偏估计根据解调出的长训练字整数倍频偏估计和信道估计根据估计出的参数进行数据部分的OFDM符号的解调提取导频信息进行参数估计剩余误差分析将提取的误差量送入环路跟踪参数估计的剩余误差该帧数据是否接收完毕是进行下一次OFDM帧的到达检测否

3、具体代码实现

Nfft=128*2; %256 进行256点的FFT

Ng=32*2; %

Nzero=0;

Nzerosub=floor((Nfft*0.5)/2); %for padding

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;

%for filter

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);

% Bits Mapping to constellations

for i=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

% 第一个长前导字

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) % insert pilots

if (sign==1)

Isignal=3*1.414;

Qsignal=0;

else

Isignal=-3*1.414;

Qsignal=0;

end %% sub-carrier polit scheme is BPSK

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; % end of fft symbol generation

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时域信号进行两倍上采样

% sample rate interpolation and modulation

for(k=1:Ns)

% HBF1

for j1=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;% end of j1

end; %end of k

% MODULATION

% 将基带信号转换成中频信号

M=2;

NN=length(IHBF1out);

phase0=pi/30;

error_f=0;

w=pi/M; % IF=8*(symbol rate) or (sample rate)/4

IMOD(1:NN)=0;

QMOD(1:NN)=0;

Modout(1:NN)=0;

for i=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)));

zF=20*log10(abs(fft(Modout)));

% 记录基带信号的频谱情况

fid=fopen('SoutI_4_BF.txt','w');

fprintf(fid,'%d,',zB);

fclose(fid);

% 记录中频信号的频谱情况

fid=fopen('SoutI_4_IF.txt','w');

fprintf(fid,'%d,',zF);

fclose(fid);

% 观测时域信号

figure(1);

plot(SoutI(1:length(SoutI)));

figure(2);

plot(SoutQ(1:length(SoutQ)));

% 观察频域情况

figure(3);

plot (real(FFTout_t(1,1:Nfft)));

figure (4);

plot(20*log10(abs(fft(Sooty*SoutQ))));

figure(5);

plot(20*log10(abs(fft(IHBF1out+j*QHBF1out))));

figure(6);

plot(20*log10(abs(fft(Modout))));

五、OFDM的仿真结果

1、输入时域I路数据信号

2、输入时域Q

路数据信号

3、I路、Q路数据合并后的频域波形

4、频域信息的理论输出波形如下

5、第一个数据OFDM符号的星座图

6、最后一个数据OFDM符号的星座图

7、所有数据OFDM符号的星座图

分析及说明:经过OFDM调制之后,信号星座图上的点更加集中,说明峰均比相对调制之前有所降低。

六、实验总结:

1、通过这个实验对OFDM调制的基本原理和具体实现有了一定得了解,OFDM作为一种先进的通信技术,具有频谱利用率高、抗码间干扰能力强、抗频率选择性衰落和窄带干扰能力强等优点,因此在实际生活中应用比较广泛,如未来的3G、4G都是采用OFDM技术。

2、OFDM利用个子信道正交的方法来提高频谱利用率,利用增加循环前缀的方法来消除码间干扰,都是非常巧妙的,既保持了多载波调制技术的优点,又在其基础上进行了改进,因此应用更加广泛。

3、通过编写代码来实现OFDM的实现过程,对一些具体的实现更加熟悉,如怎么增加循环前缀等,将理论是实际仿结合,更加直观,也更易于理解,所以,整体来说这个实验还是收获很大的。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务