OFDM通信系统的LS信道估计均衡算法matlab仿真

目录

一、理论基础

二、核心程序

三、仿真结论


一、理论基础

      OFDM主要思想是:将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰(ISI) 。每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上可以看成平坦性衰落,从而可以消除码间串扰,而且由于每个子信道的带宽仅仅是原信道带宽的一小部分,信道均衡变得相对容易。

       OFDM是一种特殊的多载波传输方案。OFDM应用DFT和其逆变换IDFT方法解决了产生多个互相正交的子载波和从子载波中恢复原信号的问题。这就解决了多载波传输系统发送和传送的难题。应用快速傅里叶变换更使多载波传输系统的复杂度大大降低。从此OFDM技术开始走向实用。但是应用OFDM系统仍然需要大量繁杂的数字信号处理过程,而当时还缺乏数字处理功能强大的元器件,因此OFDM技术迟迟没有得到迅速发展。

       基于IFFT/FFT 实现的OFDM 系统:

       OFDM采用BPSK、QPSK、16QAM、64QAM4种调制方式。按照星座图,将每个子信道上的数据,映射到星座图点的复数表示,转换为同相Ich和正交分量Qch。

       其实这是一种查表的方法,以16QAM星座为例,bits_per_symbol=4,则每个OFDM符号的每个子信道上有4个二进制数{d1,d2,d3,d4},共有16种取值,对应星座图上16个点,每个点的实部记为Qch。为了所有的映射点有相同高的平均功率,输出要进行归一化,所以对应BPSK,PQSK,16QAM,64QAM,分别乘以归一化系数系数1,, , .输出的复数序列即为映射后的调制结果。

       信道估计可以定义为描述物理信道对输入信号的影响而进行定性研究的过程,是信道对输入信号影响的一种数学表示。如果信道是线性的,那么信道估计就是对系统冲激响应进行估计。信道估计的目标就是使某种估计误差最小化,同时还要尽量降低算法的复杂度,并具有可实现性。

       基于训练序列的信道估计算法适用于突发传输方式的系统。通过发送已知的训练序列,在接收端进行初始的信道估计,当发送有用的信息数据时,利用初始的信道估计结果进行一个判决更新,完成实时的信道估计。基于导频符号的信道估计适用于连续传输的系统。通过在发送的有用数据中插入已知的导频符号,可以得到导频位置的信道估计结果;接着利用导频位置的信道估计结果,通过内插得到有用数据位置的信道估计结果,完成信道估计。

       为了能在接收端准确的恢复发射端的发送信号,人们采用各种措施来抵抗多径效应对传输信号的影响,信道估计技术的实现需要知道无线信道的信息,如信道的阶数、多普勒频移和多径时延或者信道的冲激响应等参数。因此,信道参数估计是实现无线通信系统的一项关键技术。能否获得详细的信道信息,从而在接收端正确地解调出发射信号,是衡量一个无线通信系统性能的重要指标。因此,对于信道参数估计算法的研究是一项有重要意义的工作。

       其中Y为实际接收数据,Y’为估计的接收数据,其大小均为N1X1的矩阵(N1为参与LSCE计算的数据数量),Z 为噪声也是一个N1X1的矩阵,H是真实信道矩阵,H’是估计信道矩阵,大小为N2X1(N2为估计的多径数量)。X为发送数据矩阵,是一个N1XN2的矩阵,其包含的数据为按行进行符号延迟的数据。
       首先明确一点,在LS估计中,我们使用Y和Y‘’来进行计算,估计出的结果是H’而并非H,若估计的结果H’使得Y’与Y误差最小,则能得到的结果应该是H’与H(带三角)的误差最小,但H(带三角)也不是真实的信道矩阵,其内还包含了一个误差项Z/X,因此对于LS信道估计而言,其结果的精度是受这个误差项影响的,而这个误差项概括来说就是和SNR相关,SNR越大,误差项越小,LS估计精度越高。

        LS算法计算简单、复杂度低,不需要信道的任何先验统计特性。该方法导频处信道频域响应(CFR)通过LS算法估计得到,数据符号处CFR通过插值方法获得。然而,由于LS估计方法不能消除导频处噪声的影响,并且插值类信道估计方法不能有效消除由于多径引起的频域选择兴衰落信道的影响,导致数据处CFR获取不准确,因此LS算法的估计性能较差。

       信道估计中的LS算法是最基本且常用的算法,用最朴实的话说就是忽略噪声,直接除。其公式表示为H(i)=Y(i)/X(i)。频域接收信号导频位置Y,本地已知导频X。两者简单相除,就可以得到导频位置的信道估计值H(i)。

二、核心程序

............................................................
 %-------------------------------------------------------------   
 %LS信道估计
  H=[];
  Y2=Y3(:,signal);
  Rx_training_symbols=Y3(:,pilot);
  Rx_training_symbols0=reshape(Rx_training_symbols,symbols_per_carrier*Np,1);
  
  training_symbol0=reshape(training_symbols,1,symbols_per_carrier*Np);
  training_symbol1=diag(training_symbol0);
  %disp(training_symbols)
  training_symbol2=inv(training_symbol1);
  Hls=training_symbol2*Rx_training_symbols0;
  Hls1=reshape(Hls,symbols_per_carrier,Np);
  HLs=[];
  HLs1=[];
 if ceil(carrier_count/LI)==carrier_count/LI
     for k=1:Np-1
        HLs2=[];
           for t=1:LI
           HLs1(:,1)=(Hls1(:,k+1)-Hls1(:,k))*(t-1)./LI+Hls1(:,k);
           HLs2=[HLs2,HLs1];
        end
       HLs=[HLs,HLs2];
    end
else
    for k=1:Np-2
        HLs2=[];
        for t=1:LI
           HLs1(:,1)=(Hls1(:,k+1)-Hls1(:,k))*(t-1)./LI+Hls1(:,k);
           HLs2=[HLs2,HLs1];
        end
       HLs=[HLs,HLs2];
    end
    HLs3=[];
    for t=1:mod(carrier_count,LI)
        HLs1(:,1)=(Hls1(:,Np)-Hls1(:,Np-1))*(t-1)./LI+Hls1(:,Np-1);
        HLs3=[HLs3,HLs1];
    end;
    HLs=[HLs,HLs3];
end
  %Hls1=Hls.';
  %H=repmat(Hls1,symbols_per_carrier,1);%将导频扩展成symbols_per_carrier*carrier_count矩阵
  Y1=Y2./HLs;
  
  
%-------------------------------------------------------------------

 
 
 
     
             
             
%-------------------------------------------------------------
  %并串变换
  YY=reshape(Y2.',1,N_number/bits_per_symbol);
  YY1=reshape(Y1.',1,N_number/bits_per_symbol);
 
%------------------------------------------------------------
%QPSK解调
   y_real=sign(real(YY));
   y_image=sign(imag(YY));
   y_re=y_real./sqrt(2);
   y_im=y_image./sqrt(2); 
   y_real1=sign(real(YY1));
   y_image1=sign(imag(YY1));
   y_re1=y_real1./sqrt(2);
   y_im1=y_image1./sqrt(2); 
 
   r00=[];
   r01=[];
   r10=[];
   r11=[];
 
  for k=1:length(y_real);
     r00=[r00,[y_real(k),y_image(k)]];
  end;
  for k=1:length(y_real1);
     r10=[r10,[y_real1(k),y_image1(k)]];
  end;
 
 for k=1:length(y_re);
     r01=[r01,[y_re(k),y_im(k)]];
 end;
 for k=1:length(y_re1);
     r11=[r11,[y_re1(k),y_im1(k)]];
 end;

    XX(find(r01>0))=1;
%-------------------------------------------------------------
%计算在不同信噪比下的误比特率并作图

 dif_bit=s-r01; 
 dif_bit1=s-r11; 

 ber_snr=0;    %纪录误比特数
    for k=1:N_number;
       if dif_bit(k)~=0;
         ber_snr=ber_snr+1;
       end
   end;
 ber_snr1=0;    %纪录误比特数
    for k=1:N_number;
       if dif_bit1(k)~=0;
          ber_snr1=ber_snr1+1;
      end
    end
 
 Error_ber=[Error_ber,ber_snr];
 Error_ber1=[Error_ber1,ber_snr1];
end

BER=zeros(1,length(0:snr:N_snr));
BER1=zeros(1,length(0:snr:N_snr));

BER=Error_ber./N_number;
BER1=Error_ber1./N_number;
%-------------------------------------------------------------
%-------------------------------------------------------------
 i=0:snr:N_snr;
semilogy(i,BER,'-*r');

hold on;
semilogy(i,BER1,'-og');
hold on;

grid on;

legend('No Channel Estimation','LS Channel Estimation');
hold off			   
UP163

三、仿真结论

  

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/130450934