基于MIMO-OFDM通信系统的误码率matlab仿真,对比了MRC,ZF等多种接收器性能

发布时间 2023-05-27 15:26:48作者: 我爱C编程

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

2.算法涉及理论知识概要

    MIMO-OFDM系统的接收信号是多个发射天线发送信号的衰落与加性噪声的线性叠加,若采用通常SISO-OFDM系统或MIMO系统的估计算法估计信道,将会带来很大的估计误差。出于设计实现的考虑,本文主要研究理论相对比较成熟的慢变环境下基于训练序列的MIMO-OFDM系统的信道估计算法。本章将主要讨论MIMO-OFDM系统特殊训练序列的设计和信道估计算法的选择。

 

       多天线系统的信道估计算法同单天线系统的相比具有更大的复杂性,因为接收信号是多个发射信号的叠加信号,这些发射信号同时从多个发射天线上发射出来,几乎同步到达任一接收天线。因此要从一个叠加信号中正确的识别出多个发射信号,需要信道估计算法能估计出各发射天线到同一接收天线之间多个并行信道的信道特性。而任一发射天线到任一接收天线之间的信道估计可参考单天线系统的算法。

 

       信道估计算法主要可以分为两种:盲估计算法和非盲估计算法。盲信道估计算法不需要在发送信息中插入训练序列,节约了带宽。盲估计算法的实现需要利用发送信息内包含的统计信息。这通常需要在接收端对接收信号进行复杂的数学运算,算法的运算量一般都很大,不适合应用于对时延要求比较高的实时系统。非盲估计算法是在发送信号中插入收发两端都事先己知的信息,接收端在接收到该已知信息之后,由该信息的幅度、载频或相位变化来估计信道对发送信息所造成的衰落影响。算法应用广泛,几乎可以应用于所有的无线通信系统。

 

 

最大比合并(MRC)算法:

 

       最大比合并是分集合并技术中的最优选择,相对于选择合并和等增益合并可以获得最好的性能,性能提升是由Array Gain带来的更高的信噪比,进而带来更好的误码率特性决定的。

 

      最大比合并(Maximal Ratio Combining)的实现方式即通过给分集的N路不同信号乘上一个不同的系数wi,i=1,2,……,N,系数的确定与N路分支的衰落系数hi,i=1,2,……,N有关。通常有

 

 

 

3.MATLAB核心程序

 

SNRs1 = [0:2:18];  
figure; 
%MRC
mrcber = [];
for snr=SNRs1
    snr
    signal      = round(rand(LENS, 1));
    datqpsk     = bi2de(reshape(signal, [], 2));
    Vqpsk       = qammod(datqpsk, 4)/sqrt(2);
    channel1    = ch_Rayleigh(zeros(length(Vqpsk), 1), 0);
    channel2    = ch_Rayleigh(zeros(length(Vqpsk), 1), 0);
    CHqpsk1     = channel1.*Vqpsk;
    CHqpsk2     = channel2.*Vqpsk;
    Nqpsk1      = ch_Rayleigh(CHqpsk1, snr);
    Nqpsk2      = ch_Rayleigh(CHqpsk2, snr);
    demod_symb  = zeros(length(Vqpsk), 1);
 
    for i=1:length(Vqpsk)
        channel        = [channel1(i) ; channel2(i)];
        received_value = [Nqpsk1(i) ; Nqpsk2(i)];
        ls_est_value   = [channel'*received_value]/(channel'*channel);
        demod_symb(i) = OfdmSym(ls_est_value, @(x)(x));
    end
    mrcber = [mrcber ; [1-(sum(demod_symb==datqpsk)/length(Vqpsk))]];
end
 
semilogy(SNRs1, mrcber,'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
 
hold on;
xlabel('SNR[db]');
ylabel('BER');
 
LENS = 30000;
SNRs2 = [0:2:16];  
    
...............................................................
 
 
semilogy(SNRs2, stcber,'-mo',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.5,0.9,0.0]);
..........................................
 
semilogy(SNRs3, bfber,'-b^',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.2,0.9,0.5]);
 
 
.................................................................................
 
semilogy(SNRs4, smber,'-r>',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
 
grid on
legend('MRC 1X2', 'STC 2X2', 'BF 2X2', 'SM 2X2');