1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
稀疏码多址接入(Sparse Code Multiple Access, SCMA)是一种非正交多址接入技术,它通过引入码本的稀疏性来实现多用户的高效接入。在SCMA系统中,多用户共享相同的时频资源,每个用户从自己的码本中选择一个码字进行发送。接收端则采用消息传递算法(Message Passing Algorithm, MPA)或其改进版本log-MPA来进行多用户检测。
在一个SCMA系统中,假设有J个用户共享K个正交资源元素(如OFDM子载波),且满足J>K。每个用户都有一个预定义的码本,码本中的每个码字都是一个K维的稀疏向量。用户根据自己的数据选择码本中的一个码字进行发送。接收信号可以表示为:
在接收端,需要解码多个用户的叠加信号以恢复原始信息。最大后验概率(MAP)检测是最理想的方案,但由于计算复杂度过高,在实际应用中难以实现。因此,采用近似算法,如Log-MAP(Logarithmic 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次迭代')
标签:误码率,log,MPA,SCMA,码本,算法,datar From: https://www.cnblogs.com/51matlab/p/18093934