✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
1、MPA多用户检测算法。
2、对数MPA多用户检测算法。
3、基于因子图裁剪的MPA多用户检测算法。
4、基于阈值的MPA多用户检测算法。
5、串行MPA多用户检测算法。
⛄ 部分代码
%基于因子图裁剪的MPA收敛性
close all;
clear all;
clc;
%%四点码本
cons(:,:,1)=[-0.7071+0.7071j,-0.7071+0.7071j;0.7071+0.7071j,0.7071+0.7071j;-0.7071-0.7071j,-0.7071-0.7071j;0.7071-0.7071j,0.7071-0.7071j];
cons(:,:,2)=exp(pi/12j)*[-0.7071+0.7071j,-0.7071+0.7071j;0.7071+0.7071j,0.7071+0.7071j;-0.7071-0.7071j,-0.7071-0.7071j;0.7071-0.7071j,0.7071-0.7071j];
cons(:,:,3)=exp(pi/6j)*[-0.7071+0.7071j,-0.7071+0.7071j;0.7071+0.7071j,0.7071+0.7071j;-0.7071-0.7071j,-0.7071-0.7071j;0.7071-0.7071j,0.7071-0.7071j];
%%四点码本2
% cons(:,:,1)=[-0.6180+0.7862j,-0.6180+0.7862j;0.6180+0.7862j,0.6180-0.7862j;-0.6180-0.7862j,-0.6180-0.7862j;0.6180-0.7862j,0.6180+0.7862j];
% cons(:,:,2)=exp(mm*pi/180j)*[-0.6180+0.7862j,-0.6180+0.7862j;0.6180+0.7862j,0.6180-0.7862j;-0.6180-0.7862j,-0.6180-0.7862j;0.6180-0.7862j,0.6180+0.7862j];
% cons(:,:,3)=exp(mm*pi/90j)*[-0.6180+0.7862j,-0.6180+0.7862j;0.6180+0.7862j,0.6180-0.7862j;-0.6180-0.7862j,-0.6180-0.7862j;0.6180-0.7862j,0.6180+0.7862j];
% plot(real(cons(:,1,1)),imag(cons(:,1,1)),'*');%星座点
index=2;%调制阶数
Eb=(0.7071^2+0.7071^2)*2/index;
%Eb=(0.6180^2+0.7862^2)/index;
Eb_nv=1000;
% iter=1:7;
El=length(Eb_nv);
N=100;
G=[1,1,1;1,0,1];
% error=zeros(length(iter),6);
% errorm=zeros(length(iter),6);
error=zeros(El,6);
errorm=zeros(El,6);
errorc=zeros(El,6);
errors=zeros(El,6);
% BER=zeros(length(iter),6);
% BERm=zeros(length(iter),6);
BER=zeros(El,6);
BERm=zeros(El,6);
BERc=zeros(El,6);
BERs=zeros(El,6);
for t=1:length(El)%不同iter
%噪声功率
nv=Eb*10^(-Eb_nv/10);%单边功率谱密度
sigma=nv/2;%噪声的方差
%信息序列
info=rand(6,N);%信息码长为N,一共传了6个用户的信息
info(info>0.5)=1;
info(info<=0.5)=0;
Le1=[];Le2=[];Le3=[];Le4=[];Le5=[];Le6=[];
Lem1=[];Lem2=[];Lem3=[];Lem4=[];Lem5=[];Lem6=[];
Lec1=[];Lec2=[];Lec3=[];Lec4=[];Lec5=[];Lec6=[];
Les1=[];Les2=[];Les3=[];Les4=[];Les5=[];Les6=[];
%信道卷积编码
for j=1:6
code(j,:)=convencoder(info(j,:),G);%信道编码后码长变为2N
end
parfor i=1:N %2个比特映射为一个星座点,将2N分割为N次处理
%星座点映射
temp=zeros(1,6);
for j=1:6
temp(j)=2*code(j,2*i-1)+code(j,2*i)+1;
end
Signal=zeros(1,4);%载波
RecSig=zeros(6,4);%经过信道,6个用户接受的信号,一行表示一个用户
Le=zeros(6,2);
Lem=zeros(6,2);
Lec=zeros(6,2);
Les=zeros(6,2);
H=zeros(6,1);
noise=zeros(6,4);
for j=1:6
H(j) = randn(1,1)+1j*randn(1,1);
noise(j,:)=random('norm',0,sqrt(sigma),[1,4])+1i*random('norm',0,sqrt(sigma),[1,4]);
end
Signal(1)=cons(temp(1),1,1)+cons(temp(2),1,2)+cons(temp(3),1,3);
Signal(2)=cons(temp(1),2,1)+cons(temp(4),1,2)+cons(temp(5),1,3);
Signal(3)=cons(temp(2),2,1)+cons(temp(4),2,2)+cons(temp(6),1,3);
Signal(4)=cons(temp(3),2,1)+cons(temp(5),2,2)+cons(temp(6),2,3);
for u=1:6
%分别解码这6个用户
RecSig(u,:)=Signal*H(u)+noise(u,:);
rsnr1=abs(H(u)*(cons(temp(1),1,1)+cons(temp(1),2,1)))^2/nv;
rsnr2=abs(H(u)*(cons(temp(2),1,2)+cons(temp(2),2,1)))^2/nv;
rsnr3=abs(H(u)*(cons(temp(3),1,3)+cons(temp(3),2,1)))^2/nv;
rsnr4=abs(H(u)*(cons(temp(4),1,2)+cons(temp(4),2,2)))^2/nv;
rsnr5=abs(H(u)*(cons(temp(5),1,3)+cons(temp(5),1,3)))^2/nv;
rsnr6=abs(H(u)*(cons(temp(6),1,3)+cons(temp(6),2,3)))^2/nv;
rsnr=[rsnr1,rsnr2,rsnr3,rsnr4,rsnr5,rsnr6];
tic
% tmp=MPA4withoutPA(RecSig,cons,nv,H,u,iter(t));
tmp=MSMPA4_3s2un1n2n3i_sorted(RecSig,cons,rsnr,nv,H,u,2,2,1);
Le(u,:)=tmp;
t1=toc;
tic
% tmpm=ThresholdMPACon4(RecSig,cons,nv,H,u,20,iter(t));
tmpm=MSMPA4_3s2un1n2n3i_sorted(RecSig,cons,rsnr,nv,H,u,2,2,2);
Lem(u,:)=tmpm;
t2=toc;
tic
tmpc=MSMPA4_3s2un1n2n3i_sorted(RecSig,cons,rsnr,nv,H,u,3,2,2);
Lec(u,:)=tmpc;
t3=toc;
% tic
% tmps=MSMPA4_3s2un1n2n3i_sorted(RecSig,cons,rsnr,nv,H,u,2,1,1);
% Les(u,:)=tmps;
% t4=toc;
end
Le1=[Le1 Le(1,:)];
Le2=[Le2 Le(2,:)];
Le3=[Le3 Le(3,:)];
Le4=[Le4 Le(4,:)];
Le5=[Le5 Le(5,:)];
Le6=[Le6 Le(6,:)];
Lem1=[Lem1 Lem(1,:)];
Lem2=[Lem2 Lem(2,:)];
Lem3=[Lem3 Lem(3,:)];
Lem4=[Lem4 Lem(4,:)];
Lem5=[Lem5 Lem(5,:)];
Lem6=[Lem6 Lem(6,:)];
Lec1=[Lec1 Lec(1,:)];
Lec2=[Lec2 Lec(2,:)];
Lec3=[Lec3 Lec(3,:)];
Lec4=[Lec4 Lec(4,:)];
Lec5=[Lec5 Lec(5,:)];
Lec6=[Lec6 Lec(6,:)];
% Les1=[Les1 Les(1,:)];
% Les2=[Les2 Les(2,:)];
% Les3=[Les3 Les(3,:)];
% Les4=[Les4 Les(4,:)];
% Les5=[Les5 Les(5,:)];
% Les6=[Les6 Les(6,:)];
end
Le=[Le1;Le2;Le3;Le4;Le5;Le6];
Lem=[Lem1;Lem2;Lem3;Lem4;Lem5;Lem6];
Lec=[Lec1;Lec2;Lec3;Lec4;Lec5;Lec6];
% Les=[Les1;Les2;Les3;Les4;Les5;Les6];
for j=1:6
% [L,P]=decoder(Le(j,:),G);
[P]=decoder_log(Le(j,:),G);
d=decider(P);
[Pm]=decoder_log(Lem(j,:),G);
dm=decider(Pm);
[Pc]=decoder_log(Lec(j,:),G);
dc=decider(Pc);
% [Ps]=decoder_log(Les(j,:),G);
% ds=decider(Ps);
for i=1:N
if d(i)~=info(j,i)
error(t,j)=error(t,j)+1;
end
if dm(i)~=info(j,i)
errorm(t,j)=errorm(t,j)+1;
end
if dc(i)~=info(j,i)
errorc(t,j)=errorc(t,j)+1;
end
% if ds(i)~=info(j,i)
% errors(t,j)=errors(t,j)+1;
% end
end
BER(t,j)=error(t,j)/N;
BERm(t,j)=errorm(t,j)/N;
BERc(t,j)=errorc(t,j)/N;
% BERs(t,j)=errors(t,j)/N;
end
fprintf('%d/%d has completed.\n',t,length(Eb_nv));
end
error
errorm
errorc
% errors
BERav=sum(BER,2)/6;
BERmav=sum(BERm,2)/6;
BERcav=sum(BERc,2)/6;
% BERsav=sum(BERs,2)/6;
% semilogy(iter,BERav','-ro','LineWidth',4);grid on;hold on;
% semilogy(iter,BERmav','-b^','LineWidth',4);grid on;
semilogy(5:7,[BERav,BERmav,BERcav],'-y*','LineWidth',4);grid on;
% semilogy(1:4,BERsav','-g*','LineWidth',4);grid on;
xlabel('iter');ylabel('Average BER');
title('\fontsize{10}\bf基于因子图裁剪的MPA收敛性');
%semilogy(Eb_nv,BERm2av','-yv','LineWidth',2);grid on;
⛄ 运行结果
⛄ 参考文献
[1] 邹佳. SCMA系统中的低复杂度检测算法研究[D]. 北京邮电大学, 2016.
[2] 邹春灵. 基于MATLAB实现的CDMA多用户检测[J]. 中国科技信息, 2008(18):3.
[3] 邵凯郭红耀. 基于模型驱动辅助MPA的SCMA多用户检测算法[J]. 电讯技术, 2022, 62(11):1607-1613.
⛳️ 代码获取关注我
❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料