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

100 阅读3分钟

1.算法仿真效果

matlab2022a仿真结果如下:

b6ac36483a4bdea19b584716bf0b5d3e_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

 

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

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

 

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

 

7e6e678d32a0cd04db07d679eae42f2e_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

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

 

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

 

cb9e2fb3b31d3d0f9b3979b22d7c1916_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

        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次迭代')`