基于Matlab实现多种MPA多用户检测算法

简介: 基于Matlab实现多种MPA多用户检测算法

✅作者简介:热爱科研的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电子书和数学建模资料


相关文章
|
2天前
|
机器学习/深度学习 算法 调度
Matlab|基于改进鲸鱼优化算法的微网系统能量优化管理matlab-源码
基于改进鲸鱼优化算法的微网系统能量管理源码实现,结合LSTM预测可再生能源和负荷,优化微网运行成本与固定成本。方法应用于冷热电联供微网,结果显示经济成本平均降低4.03%,提高经济效益。代码包括数据分段、LSTM网络定义及训练,最终展示了一系列运行结果图表。
|
4天前
|
数据采集 存储 算法
基于BP算法的SAR成像matlab仿真
**摘要:** 基于BP算法的SAR成像研究,利用MATLAB2022a进行仿真。SAR系统借助相对运动合成大孔径,提供高分辨率图像。BP算法执行回波数据预处理、像素投影及图像重建,实现精确成像。优点是高精度和强适应性,缺点是计算量大、内存需求高。代码示例展示了回波生成、数据处理到插值显示的全过程。
|
5天前
|
算法 vr&ar
基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法
```markdown - MATLAB2022a中比较SG与RLS自适应波束成形算法。核心程序实现阵列信号处理,强化期望信号,抑制干扰。RLS以其高效计算权重,而SG则以简单和低计算复杂度著称。[12345] [6666666666] [777777] ```
|
2天前
|
算法
基于Dijkstra算法的最优行驶路线搜索matlab仿真,以实际城市复杂路线为例进行测试
使用MATLAB2022a实现的Dijkstra算法在城市地图上搜索最优行驶路线的仿真。用户通过鼠标点击设定起点和终点,算法规划路径并显示长度。测试显示,尽管在某些复杂情况下计算路径可能与实际有偏差,但多数场景下Dijkstra算法能找到接近最短路径。核心代码包括图的显示、用户交互及Dijkstra算法实现。算法基于图论,不断更新未访问节点的最短路径。测试结果证明其在简单路线及多数复杂城市路况下表现良好,但在交通拥堵等特殊情况下需结合其他数据提升准确性。
|
2天前
|
机器学习/深度学习 人工智能 文字识别
一种基于YOLOv8改进的高精度红外小目标检测算法 (原创自研)
【7月更文挑战第2天】 💡💡💡创新点: 1)SPD-Conv特别是在处理低分辨率图像和小物体等更困难的任务时优势明显; 2)引入Wasserstein Distance Loss提升小目标检测能力; 3)YOLOv8中的Conv用cvpr2024中的DynamicConv代替;
18 0
|
2天前
|
算法
基于PID-bang-bang控制算法的卫星姿态控制matlab仿真
该文主要介绍了一个基于PID-bang-bang控制算法的卫星姿态控制系统。在MATLAB2022a中进行了仿真,生成了控制收敛曲线和姿态调整动画。系统通过PID控制器减少误差,结合Bang-Bang控制实现快速响应。核心程序涉及卫星位置、推力向量的计算及动画绘制。PID控制器利用比例、积分、微分项调整输出,Bang-Bang控制则在误差超出阈值时提供即时修正。两者结合以平衡控制精度和响应速度,适应卫星姿态的精确调节需求。
|
3天前
|
传感器 算法
基于无线传感器网络的LC-DANSE波束形成算法matlab仿真
摘要: 此MATLAB程序对比了LC-DANSE与LCMV波束形成算法在无线传感器网络中的性能,基于SNR和MSE指标。测试在MATLAB 2022a环境下进行。核心代码涉及权重更新迭代,用于调整传感器节点权重以增强目标信号。LC-DANSE是分布式自适应算法,关注多约束条件下的噪声抑制;LCMV则是经典集中式算法,侧重单个期望信号方向。两者在不同场景下各有优势。程序结果显示SNR和MSE随迭代变化趋势,并保存结果数据。
|
16天前
|
传感器 算法
ANC主动降噪理论及Matlab代码实现
ANC主动降噪理论及Matlab代码实现
|
2月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)

热门文章

最新文章