基于LS最小二乘法的OFDM信道估计误码率matlab仿真

256 阅读3分钟

1.算法描述

ofdm基本结构如下所示:

 

1.png

 

        信道估计是使用接收信号表现出来的各种状态来对信道的特性进行估计的过程。信道估计是信道对输入信号影响的一种数学表示。信道估计可以定义为描述物理信道对输入信号的影响而进行定性研究的过程,是信道对输入信号影响的一种数学表示。如果信道是线性的,那么信道估计就是对系统冲激响应进行估计。信道估计的目标就是使某种估计误差最小化,同时还要尽量降低算法的复杂度,并具有可实现性。为了在接收端能够准确地恢复发射信号,需要对信道的冲激响应进行估计,这就是信道估计。

       OFDM系统常常使用插入导频的方法来进行信道估计。我们都知道OFDM系统是在同一个时刻同时发送多个不同频率的子载波,一次性发送若干个子载波算是发送了一个OFDM符号,然后再隔一定的时间再发送下一个OFDM符号。根据导频插入的不同方式我们可以分为块状导频和梳状导频。

 

LS:Least Square

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

假设发射信号是X(i),信道传输函数是H(i),接收端接收到的信号是Y(i),那么就有这个等式Y(i)=X(i)H(i)。

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

       在硬件实现时,除了在均衡时可以考虑用除法器,其他位置(包括此处的LS算法)都不要使用除法器,除法器占用的资源太多,将除法表示为乘法即可避免,而大部分的乘法可以用移位相加来实现,这样可以大大降低复杂度。

 

2.仿真效果预览

matlab2022a仿真结果如下:

 

2.png

 

3.MATLAB核心程序 `%加高斯白噪声

Error_ber=[];%误比特率

Error_ber1=[];

Error_ber2=[];%误比特率

Error_ber3=[];

%Error_ser=[];%误符号率

for snr_db=0:snr:N_snr

 

    code_power=0;

    code_power=[norm(Tx_data)]^2/(length(Tx_data));%信号的符号功率

    %bit_power=var(Tx_data);

    bit_power=code_power/bits_per_symbol;%比特功率

    noise_power=10*log10((bit_power/(10^(snr_db/10))));%噪声功率

    noise=wgn(1,length(Tx_data),noise_power,'complex');%产生GAUSS白噪声信号

    

    Y7=Tx_data+noise;

 

%-------------------------------------------------------

  %串并变换

   Y6=reshape(Y7,IFFT_bin_length+GI,symbols_per_carrier).';

   

  %去保护间隔

    for k=1:symbols_per_carrier;

       for i=1:IFFT_bin_length;

           Y5(k,i)=Y6(k,i+GI);

       end

    end

    %FFT,傅立叶变换

     Y4=fft(Y5,IFFT_bin_length,2);

     Y3=Y4(:,carriers);

 %-------------------------------------------------------------   

 %LS信道估计,%信道估计准则:最小均方误差(MMSE)最大似然估计(MLE) 最小平方(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=[];`