基于MATLAB的OFDM通信链路仿真,输出星座图以及频偏锁定同步

发布时间 2023-03-25 16:35:21作者: 我爱C编程

1.算法描述

          正交频分复用(orthogonal frequency-division multiplexing, OFDM) 技术是一种多载波数字调制技术,它具有抗多径能力强,频谱利用率高等优点,与其他技术结合在一起应用到第四代移动通信中。但OFDM 技术的缺点是对定时同步误差和频率偏差非常敏感。定时偏差会造成相位的旋转,而频率偏移会使OFDM 各子载波间正交性遭到破坏,系统性能急剧恶化。因此准确地时频同步对提升OFDM 系统的整体性能起到非常关键的作用。

 

        正交频分复用(OFDM)技术的概念最早出现于20世纪50年代中期。当时由于使用模拟滤波器实现的系统,复杂度较高,因此一直没有真真正正发展起来。到了60年代,人们开始对多载波调制(MCM)技术进行了许多理论上的研究,形成了并行数据传输以及频分复用(FDM)的思想,这些思想使得OFDM技术最先在美国军用高频通信系统得到应用。WeinstemEbert1971年建议使用离散傅立叶逆变换(IDFT)以及离散傅立叶变换(DFT)来实现基带的调制和解调,这样就大大降低了多载波系统的复杂度。SaltzbergOFDM进行了性能分析,并得出以下结论:在OFDM中主要限制就是信道的干扰。为了对抗信道间干扰(ICI)和符号间干扰(ISI)PeledRuiz引入了循环前缀(CPCyclic Prefix)的概念,其中不是使用空的保护空间,而是使用OFDM码元的周期扩展,只要循环前缀大于信道的最大多径时延扩展,就可以有效地模拟实现周期卷积的信道。但是,使用CP的代价是要丧失部分信号能量,这些能量与CP的长度成正比,然而使用CP所获得的好处通常要远大于信号能量损失。正交频分复用(OFDM)是一种特殊的多载波调制方式,它的基本思想是将高速传输的数据流通过串/并变换,变成在若干个正交的窄带子信道上并行传输的低速数据流。OFDM技术将传送的数据信息分散到各个子载波上,从而大大增加了每个符号的持续时间,使得符号周期大于多径时延,因此可以减轻由无线信道的多径时延扩展所产生的时间弥散性对系统所造成的影响。并且还可以在OFDM符号之间插入保护间隔,令保护间隔大于无线信道的最大时延扩展,这样就可以最大限度地消除由于多径而带来的符号间干扰(ISI)。而且一般都采用循环前缀作为保护间隔,从而可以避免由多径而带来的信道间干扰(ICI)。OFDM技术利用信号的时频正交性,允许子信道频谱有部分重叠,使得频谱利用率提高近一倍,因而具有非常高的频谱利用率。

 

       OFDM系统框图如图所示。

 

 

 

 

        符号定时同步的任务是在接受数据流中寻找OFDM符号的分界。MIMO-OFDM系统的符号定时和单载波系统有很大的区别,单载波系统传送的符号有一个最佳抽样点,也就是其眼图张开的最大点处;而OFDM的符号不存在眼图,也就没有所谓的最佳抽样点。它的特点是一个符号由N个抽样点(N为系统子载波个数)组成,符号定时也就是要确定一个符号开始的时间。符号同步的结果用来判定各个OFDM符号中用来解调符号中的各子载波。当符号同步算法定时在OFDM符号的第一个样值时,MIMO-OFDM接收机的抗多径效应的性能达到最佳。 理想的符号同步就是选择最佳的FFT窗,使子载波保持正交,且ISI被完全消除或者降至最小。由于使用了循环前缀技术,MIMO-OFDM 系统能够容忍一定的符号定时误差而不受到性能上损失。所以MIMO-OFDM系统对定时偏差不像对频率偏差那么敏感。

 

        采样频率的同步是指发射端 D/A变换器和接收端的A/D变换器的工作频率保持一致。一般地,连接各个变换器之间的偏差较小,相对于载波频移的影响来说也较小,而一帧的数据如果不太长的话,只要保证了帧同步的情况下,可以忽略采样时钟不同步时造成的漏采样或多采样,而只需要在一帧数据中补偿由于采样偏移造成的相位噪声。

 

        整数频偏尽管造成信息符号在子信道上平移,但并不破坏子载波间的正交性,只会引起OFDM 信号的频谱结构错位,导致接收机恢复的数据码元序列的循环移位和相位旋转,使接收数据经过FFT 运算输出的顺序相对于发送端产生偏移。小数频偏导致抽样点有些错位,使得在某位置为零时,另一子载波不为零,破坏各子载波间的正交性。因此在完成系统定时同步之后,通过在时域内利用找到的训练符号相关最大值进行小数频偏估计,在频域内利用训练符号移动相关估计整数频偏的方法,就显得极为重要。

 

时域和频域同步

 

      OFDM系统对定时以及频率偏移敏感,特别是实际应用中与FDMATDMACDMA等多址方式相结合使用时,时域和频域同步就更显得尤为重要。与其他的数字通信系统一样,同步分为捕获和跟踪两个阶段。在下行链路中,基站向各个移动终端广播发送同步信号,因此,下行链路的同步相对简单,比较容易实现。在上行链路中,来自不同终端的信号必需同步地到达基站,这样才能保证子载波间的正交性。基站根据各移动终端发来的子载波携带的信息进行时域和频域同步信息的提取,再由基站发回移动终端,以便让移动终端进行同步。在具体实现时,同步将分为时域同步和频域同步,也可以时域和频域同时进行同步;

 

信道估计

 

       OFDM系统中,信道估计器的设计主要有以下两个问题:一、导频信息的选择。由于无线信道通 常是衰落信道,需要不断地对信道进行跟踪,因此导频信息也必须不断传送;二、复杂度比较低以及导频跟踪能力良好的信道估计器的设计。而在实际的设计中,导频信息的选择和最佳估计器的设计又是相互关联的,因为估计器的性能与导频信息的传输方式有很大关系;

 

3.信道编码和交织

 

      为了提高数字通信系统的性能,信道编码和交织是普通采用的方法。对于衰落信道中的随机错误,可以采用信道编码;对于存在于衰落信道中的突发错误,可以采用交织技术。实际应用中,通常同时采用信道编码和交织这两种技术,进一步改善整个系统的性能。在OFDM系统中,如果信道衰落不是太严重,均衡时无法再利用信道的分集特性来改善系统性能的,因为OFDM系统自身具有利用信道分集的能力,一般的信道特性信息已经被OFDM这种调制方式本身所利用了。但是,OFDM系统的结构却为在子载波间进行编码提供了机会,形成了COFDM方式。编码可以采用各种码,如分组码、卷积码等,其中卷积码的效果要比分组码好;

 

4.降低峰值平均功率比

 

      由于OFDM信号在时域上表现为N个正交子载波信号的叠加,当这N个信号恰好全部以峰值相加时,这时,OFDM信号也将产生最大峰值,该峰值功率可以达到平均功率的N倍。尽管峰值功率出现的概率较低,但为了不失真地传输这些高PAPROFDM信号,发送端对高功率放大器(HPA)的线性度要求很高,从而导致发送效率极低,接收端对前端放大器以及A/D变换器的线性度要求也很高。因此,高的PAPR值使得OFDM系统的性能大大下降甚至直接影响实际应用。为了解决这一问题,人们提出了基于信号畸变技术、信号扰码技术和基于信号空间扩展等降低OFDM系统PAPR的方法;

 

5.均衡

 

       在一般的衰落环境下,在OFDM系统中,均衡技术不是有效地改善系统性能的方法。因为均衡技术的实质就是补偿多径信道引起的码间干扰,而OFDM技术本身就已经利用了多径信道的分集特性,所以说,在普通的情形下,OFDM系统就不需要再做均衡了。在高度散射的信道中,信道记忆长度很长,循环前缀(CPCyclic Prefix)的长度必须很长,才能够使ISI尽量不出现。但是,循环前缀的长度过长必然导致能量的大量损失,尤其对于那些子载波个数不是很大的系统。这时,可以考虑加均衡器以使CP的长度适当减小,即通过增加系统的复杂性换取系统频带利用率的提高。

 

2.仿真效果预览

matlab2022a仿真结果如下:

 

 

 

 

 

 

 

 

 

3.MATLAB核心程序

 

for jk=2:1:num_fram
    jk
    seed_num=jk;
    
    
    rand('state',seed_num);
    
    Bits_IN(1:FFTLen*sym_num*M)=rand(1,FFTLen*sym_num*M)>0.5;  %  产生OFDM采样点
    
    %-----------------串并转换-----------------------------------------
    
    paradata=reshape(Bits_IN,FFTLen,sym_num*M); %串并转换排成256列
    
    
    %----------------QPSK调制------------------------------------------
    
    paradata2=paradata.*2-1;
    
    qpsk_i = zeros(FFTLen,sym_num);
    qpsk_q = zeros(FFTLen,sym_num);
    
    for jj=1:sym_num
        qpsk_i((1:FFTLen),jj)= 1/sqrt(2)*paradata2((1:FFTLen),2*jj-1);
        qpsk_q((1:FFTLen),jj)= 1/sqrt(2)*paradata2((1:FFTLen),2*jj);
    end
    
    qpsk_out1=qpsk_i+1i*qpsk_q;
    
    
    %--------------------加连续导频-------------------------------------
    [row_num,rank_num]=size(qpsk_out1);
    cpilot_slot=[10,43,75,105,151,181,213,246];
    cpilot=1/sqrt(2)*(ones(1,rank_num)+1i*ones(1,rank_num));
    for ii=1:1:length(cpilot_slot)
        qpsk_out1(cpilot_slot(ii),:)=cpilot;
    end
    
   
    %------------------上采样添0---------------------------------------
    
    qpsk_out2=zeros(FFTLen8,sym_num);
    
    qpsk_out2=[qpsk_out1(1:FFTLen/2,:);zeros((FFTLen8-FFTLen),sym_num);qpsk_out1(FFTLen/2+1:end,:)];%添零
    
 
    %----------------insert pilot加导频--------------------------------
    
    qpsk_add_pilot=zeros(FFTLen,sym_num+1);
    qpsk_add_pilot=[tain_qpsk_out,qpsk_out2];
    
    %-----------------2048点IFFT ---------------------------------------
    qpsk_out_ifft = sqrt(FFTLen8)*ifft(qpsk_add_pilot);
    
  
    %----------------加入 guard interval-------------------------------
    %----------------取后1/8为循环前缀----------------------------------
    qpsk_out_ifft_ext=zeros(FFTLen8+CPLen8,sym_num+1);
    qpsk_out_ifft_ext=[qpsk_out_ifft(FFTLen8-CPLen8+1:FFTLen8,:);qpsk_out_ifft];
    
    %---------------并串转换-------------------------------------------
    ofdm_out=reshape(qpsk_out_ifft_ext,1,(FFTLen8+CPLen8)*(sym_num+1));
    
    %+----------------------------------------------------------------+
    %|                   信道仿真                       |
    %+----------------------------------------------------------------+
    %+----------------------------------------------------------------+
    %|                   采样频偏 (立方插值)                          |
    %+----------------------------------------------------------------+
    
    %-------------------------------------------------------------------
    
    delta_samp=1e-4;%归一化采样时钟频偏delta_samp*fs,50ppm
    ofdm_samp_index=1:1:length(ofdm_out);
    ofdm_samp_cubic_index=1:0.9999:length(ofdm_out);
    num_cubic=length(ofdm_samp_index);
    ofdm_samp_cubic=interp1(ofdm_samp_index,ofdm_out,ofdm_samp_cubic_index,'cubic');
 
    %----------------------------------------------------------------
    EbNo=20;
    ofdm_Freq_I=zeros(1,length(ofdm_receive1));
    ofdm_Freq_Q=zeros(1,length(ofdm_receive1));
    ofdm_noise_I=zeros(1,length(ofdm_receive1));
    ofdm_noise_Q=zeros(1,length(ofdm_receive1));
    Noise_I=zeros(1,length(ofdm_receive1));
    Noise_Q=zeros(1,length(ofdm_receive1));
    ofdm_noise=zeros(1,length(ofdm_receive1));
    %------------------------------------------------------------------
    
    randn('state',seed_num+2);
    Noise_I=sqrt(var(real(ofdm_receive1))*10^(-EbNo/10))*randn(1,length(ofdm_receive1));
    randn('state',seed_num+4);
    Noise_Q=sqrt(var(real(ofdm_receive1))*10^(-EbNo/10))*randn(1,length(ofdm_receive1));
    ofdm_noise2_I=real(ofdm_receive1)+Noise_I;
    ofdm_noise2_Q=imag(ofdm_receive1)+Noise_Q;
    ofdm_noise2=(ofdm_noise2_I+1i*ofdm_noise2_Q);
    
    fd_est(jk)=fd_residue(jk-1);
    fs_est(jk)=fs_residue(jk-1);
    %fd_est(jk)=fd;
    %fs_est(jk)=-delta_samp;
    
    %--------------去除残余频偏------------------------------------------
    
    ofdm_noise4=ofdm_noise3((jk-2)*N_sym_fram+1:(jk-1)*N_sym_fram);%每一帧符号*帧数
    kkj=1:1:N_sym_fram;
    fd_offset=exp(-1i*2*pi*fd_est(jk).*(kkj-1)/FFTLen);
    ofdm_offset_fd=ofdm_noise4.*fd_offset;
    
    %ofdm_offset_fd=ofdm_noise4;
    
    
    %-------------------平滑--------------------------------------------
    if jk<30
        c2=0.25;
    else c2=0.05;
    end
    fs_residue(jk)=fs_residue(jk-1)+c2*fs_residue_jk(jk);
    fd_residue(jk)=fd_residue(jk-1)+c2*fd_residue_jk(jk);
    fd_est_theory(jk)=fd;
    fs_est_theory(jk)=-delta_samp;
    
    
end