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