基于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电子书和数学建模资料

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: ARM DS-5 是一种全面的集成开发环境(IDE),可用于设计、编译、调试和优化 ARM 架构处理器系统中的软件。 教程中包括安装 DS-5,创建和打开项目,调试程序和分析程序性能的方法。您还将学习如何使用 DS-5 的各种工具和功能来提高您的软件开发效率和代码质量。 DS-5 中的编译器工具可以用于编译 C、C++、Assembly 和其他类型的文件。 DS-5 还支持自定义编译器选项和优化。 DS-5 的调试工具提供了一个直观的图形用户界面,可以帮助您在硬件开发板上调试程序。 DS-5 还支持许多其他类型的调试功能,例如内存映像和堆栈跟踪。 DS-5 还提供了一个运行时分析器,可以帮助您查找软件的性能问题。该工具可以为您提供有关系统 CPU 使用情况、内存使用情况和其他性能参数的有用信息。 总的来说,ARM DS-5 教程提供了一系列指南和示例,以帮助您了解如何使用这个强大的开发工具来加速 ARM 处理器系统上的软件开发和优化。 ### 回答2: ARM DS-5是一款用于嵌入式系统开发的综合性软件开发平台,其提供了完整的开发环境和工具套件,使得嵌入式系统的设计师能够快速地创建、调试和优化应用程序。 对于想要学习和掌握ARM DS-5的开发人员来说,ARM官网上提供了详细的教程和学习资源。其中,ARM DS-5 Community Edition被认为是一个非常良好的入门工具,它提供了一些基本的开发环境和工具,可以协助开发人员如何使用DS-5引导嵌入式系统进行开发和调试。 在ARM DS-5的教程中,通常会涉及到DS-5的安装、如何创建工作区、如何创建和调试应用程序、如何实现远程开发和调试、如何使用DS-5的性能分析工具等等。这些教程都是非常详细和专业的,也非常适合想要进一步深入学习DS-5的开发人员。 总之,ARM DS-5是一个非常强大的嵌入式系统开发平台,通过阅读教程和学习资源,开发人员可以快速学会如何使用DS-5进行开发、调试和性能优化。 ### 回答3: ARM DS-5是一款强大的开发工具,可以用于嵌入式系统软件开发。它提供了集成开发环境(IDE)和调试器,可以在单一的平台上完成软件开发的所有过程。ARM DS-5支持多种处理器架构,包括ARM Cortex-A、Cortex-R和Cortex-M。 ARM DS-5的教程可以帮助开发人员快速入门这个工具。教程中包括了如何安装ARM DS-5,如何创建项目,如何使用调试器等基础知识。用户可以按照教程的步骤来学习和实践,然后进行更加深入的自主探索。ARM DS-5的教程不仅适合初学者,也适合经验丰富的嵌入式系统开发人员学习新的工具。 此外,ARM DS-5的教程还包括一些高级主题,如性能优化、串行线路分析和系统调试等。这些主题可以帮助用户更好地理解ARM DS-5的功能和嵌入式系统软件开发的挑战。教程中提供了大量的示例和实践操作,用户可以通过这些实践活动来加深对ARM DS-5的理解和掌握。 综上所述,ARM DS-5的教程不仅是一份使用手册,更是一份学习指南。学习ARM DS-5可以帮助嵌入式系统软件开发人员更加高效和质量,为嵌入式系统软件的开发提供更好的技术支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值