m基于log-MPA检测算法的SCMA通信链路matlab误码率仿真

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

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

       稀疏码多址接入(Sparse Code Multiple Access, SCMA)是一种非正交多址接入技术,它通过引入码本的稀疏性来实现多用户的高效接入。在SCMA系统中,多用户共享相同的时频资源,每个用户从自己的码本中选择一个码字进行发送。接收端则采用消息传递算法(Message Passing Algorithm, MPA)或其改进版本log-MPA来进行多用户检测。

 

       在一个SCMA系统中,假设有J个用户共享K个正交资源元素(如OFDM子载波),且满足J>K。每个用户都有一个预定义的码本,码本中的每个码字都是一个K维的稀疏向量。用户根据自己的数据选择码本中的一个码字进行发送。接收信号可以表示为:

 

 

 

       在接收端,需要解码多个用户的叠加信号以恢复原始信息。最大后验概率(MAP)检测是最理想的方案,但由于计算复杂度过高,在实际应用中难以实现。因此,采用近似算法,如Log-MAPLogarithmic Maximum A Posteriori)或Loopy Message Passing Algorithm (Log-MPA),它们能在一定程度上降低复杂性的同时保持良好的性能。

 

       传统的MPA算法在迭代过程中涉及大量的指数运算和乘法运算,计算复杂度较高。为了降低复杂度,log-MPA算法被提出。log-MPA算法将概率域的计算转换到对数域进行,利用对数域的加法运算来代替概率域的乘法运算,从而减少了计算量。

 

 

 

        Log-MPA算法不断进行上述消息传递直到收敛或达到预设的最大迭代次数,最后根据各个变量节点的最终消息分布估计用户发送的星座符号。

 

       log-MPA算法通过将对数似然比的计算转换到对数域进行,显著降低了计算复杂度。然而,这种转换也带来了一定的性能损失。与传统的MPA算法相比,log-MPA算法在误码率(BER)和误帧率(FER)方面可能会有所增加。但是,通过合理的参数选择和迭代次数控制,这种性能损失可以被控制在可接受的范围内。

 

3.MATLAB核心程序

 

for Niter = [1 5 10 30]; % 迭代次数
    for k = 1:length(SNR)
            %%% 对LLR进行硬判决
            datar= LLR';
            datar(datar>0)=0;
            datar(datar<0)=1;
            err          = sum(xor(din',datar));
            Nerr(:,k,j)  = Nerr(:,k,j) + err.';
            Nbits(:,k,j) = Nbits(:,k,j) + log2(M)*N;
            %%% 计算BER
            BER(:,k,j) = Nerr(:,k,j)./Nbits(:,k,j);
        end
    end
 
    if Niter == 1
        semilogy(EbN0,sum(mean(BER,3)),'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
    end
    hold on;
    if Niter == 5
        semilogy(EbN0,sum(mean(BER,3)),'-mo',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.5,0.9,0.0]);
    end
    hold on;
    if Niter == 10
        semilogy(EbN0,sum(mean(BER,3)),'-r>',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
    end
    hold on;
    if Niter == 30
        semilogy(EbN0,sum(mean(BER,3)),'-k<',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.3,0.3]);
 
    end
    hold on;
end
ylabel('BER');
xlabel('Eb/N0(dB)');
grid on;
legend('第1次迭代','第5次迭代','第10次迭代','第30次迭代')

 

  

 

posted @ 2024-03-25 10:53  我爱C编程  阅读(10)  评论(0编辑  收藏  举报