当前位置: 首页 > news >正文

【通信】非正交多址接入(NOMA)和正交频分多址接入(OFDMA)的性能对比附matlab代码

1 内容介绍

随着移动通信的快速发展,数据流量急剧增长,频谱资源开始日益缺乏,能源消耗也在不断加大,而第五代移动通信(5G)中的非正交多址接入(NOMA)技术正是解决这些问题的关键.在NOMA技术中,通过功率域实现多用户复用并共享相同的频谱资源,在接收端采用串行干扰删除(SIC)技术实现多用户检测.由于功率复用可以区分用户,实现系统容量和频谱效率的提升,因此成为本文研究的重点. 首先,引入NOMA系统下行链路的系统模型,在此模型上以两用户为例验证了NOMA技术相较于正交频分多址接入(OFDMA)技术的性能增益,并总结了NOMA技术的特点优势和应用场景.随后对NOMA中的关键技术进行介绍,重点研究了现有三种经典的功率分配算法.

2 部分代码

clc; close all; clear all;

% addpath('.\comm');

% addpath('.\lte');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Performance comparison of NOMA-OFDM system and      %

% traditional OFDMA system, % Vision 1.0.0, 2017/4/8. %

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 参数

order_psk = [2,4,8,16,64];      % PSK符号阶数,2表示BPSK,4表示4PSK,以此类推

for order = 1:length(order_psk)

    sym_total = 2.048e4*52; % 总符号数

    len_turbo = 1280;   % Turbo码长

    bit_total = sym_total * log2(order_psk(order));

    N_ofdma_u1 = 26;    % OFDMA用户1的子载波数

    N_ofdma_u2 = 26;    % OFDMA用户2的子载波数

    p1 = 0.1;           % NOMA用户1的功率

    p2 = 0.9;           % NOMA用户2的功率

    N_ofdm = 64;        % OFDM子载波数

    N_data = 52;        % 数据载波数

    N_GB = [4; 3];      % 载波间隔参数

    N_P = [12; 26; 40; 54]; % 导频参数

    CP = 1/4;           % CP占比

    Ts = 1/10000;

    FD = 500;           % 瑞利信道参数

    SNR = 25:1:60;           % 信噪比 

    %% 参数合理性判断

    if (mod(bit_total, len_turbo)~=0)

        error('总比特数必须是Turbo编码长度的整数倍');

    end

    if (mod((3*len_turbo+12)*bit_total/len_turbo, N_data)~=0)

        error('总比特数必须保证OFDM符号完整');

    end

    if (N_ofdma_u1+N_ofdma_u2~=N_data)

        error('OFDMA中两用户的子载波数目之和必须等于数据载波总数');

    end

    if (p1+p2~=1)

        error('功率系数p1与p2之和必须等于1');

    end

    %% 生成两个用户的发射符号序列,加入Turbo编码

    [sym_seq_u1, bit_seq_u1] = data_gen(bit_total, len_turbo, order_psk(order));

    [sym_seq_u2, bit_seq_u2] = data_gen(bit_total, len_turbo, order_psk(order));

    % mean(abs(sym_seq_u1).^2)

    % mean(abs(sym_seq_u2).^2)

    %% NOMA和OFDMA

    sym_seq_noma = noma_enc(sym_seq_u1, sym_seq_u2, p1, p2);

    % mean(abs(sym_seq_noma).^2)

    % 对两用户数据进行NOMA编码

    sym_seq_ofdma = ofdma_enc(sym_seq_u1, sym_seq_u2, N_ofdma_u1, N_ofdma_u2);

    % mean(abs(sym_seq_ofdma).^2)

    % 对两用户数据进行OFDMA编码

    %% OFDM调制

    num_ofdmsym_noma = length(sym_seq_noma)/N_data;

    mod_ofdm_noma = comm.OFDMModulator(...

    'FFTLength',N_ofdm,...

    'NumGuardBandCarriers',N_GB,...

    'PilotInputPort',true,...

    'PilotCarrierIndices',N_P,...

    'NumSymbols',num_ofdmsym_noma,...

    'CyclicPrefixLength',N_ofdm*CP,...

    'InsertDCNull',true);

    % 构造NOMA的OFDM调制器

    num_ofdmsym_ofdma = length(sym_seq_ofdma)/N_data;

    mod_ofdm_ofdma = comm.OFDMModulator(...

    'FFTLength',N_ofdm,...

    'NumGuardBandCarriers',N_GB,...

    'PilotInputPort',true,...

    'PilotCarrierIndices',N_P,...

    'NumSymbols',num_ofdmsym_ofdma,...

    'CyclicPrefixLength',N_ofdm*CP,...

    'InsertDCNull',true);

    % 构造OFDMA的OFDM调制器

    tx_noma = ofdm_tx(sym_seq_noma, mod_ofdm_noma);

    % tx_noma = sym_seq_noma;

    tx_ofdma = ofdm_tx(sym_seq_ofdma, mod_ofdm_ofdma);

    % OFDM调制

    % mean(abs(tx_noma).^2)

    % mean(abs(tx_ofdma).^2)

    for snr = 1:length(SNR)

        %% 瑞利信道

    %     crl = rayleighchan(Ts, FD);

    %     tx_noma = filter(crl, tx_noma);

    %     tx_ofdma = filter(crl, tx_ofdma);

        cawgn = comm.AWGNChannel('NoiseMethod', 'Signal to noise ratio (SNR)');

        cawgn.SNR = SNR(snr);

        rx_noma = step(cawgn, tx_noma);

        rx_ofdma = step(cawgn, tx_ofdma);

        % mean(abs(rx_noma).^2)

        % mean(abs(rx_ofdma).^2)

        % 接收信号经过瑞利信道与加入高斯噪声

        %% OFDM解调

        sym_seq_noma_mat = ofdm_rx(rx_noma, mod_ofdm_noma);

        sym_seq_noma = reshape(sym_seq_noma_mat, numel(sym_seq_noma_mat), 1);

    %     sym_seq_noma = rx_noma;

        sym_seq_ofdma_mat = ofdm_rx(rx_ofdma, mod_ofdm_ofdma);

        sym_seq_ofdma = reshape(sym_seq_ofdma_mat, numel(sym_seq_ofdma_mat), 1);

        % mean(abs(sym_seq_noma).^2)

        % mean(abs(sym_seq_ofdma).^2)

        %% NOMA和OFDMA解码

        if (p1>p2)

            [bit_u1, bit_u2] = noma_dec(sym_seq_noma, len_turbo, order_psk(order), p1, p2);

        else

            [bit_u2, bit_u1] = noma_dec(sym_seq_noma, len_turbo, order_psk(order), p2, p1);

        end

        [n1,r1(order, snr)] = biterr(bit_u1,bit_seq_u1);

        [n2,r2(order, snr)] = biterr(bit_u2,bit_seq_u2);

        % 按照功率顺序解码用户1和用户2的符号序列

        [bit_u11, bit_u22] = ofdma_dec(sym_seq_ofdma, len_turbo, order_psk(order), N_ofdma_u1, N_ofdma_u2);

        [n11,r11(order,snr)] = biterr(bit_u11,bit_seq_u1(1:length(bit_u11)));

        [n22,r22(order,snr)] = biterr(bit_u22,bit_seq_u2(1:length(bit_u22)));

        [r1(order,snr), r2(order,snr), r11(order,snr), r22(order,snr)]

    end

    

end

save('ber.mat','r1','r2','r11','r22');

plot_ber(order_psk, SNR, N_data, p1, p2, N_ofdma_u1, N_ofdma_u2);

% rmpath('.\comm');

% rmpath('.\lte');

3 运行结果

​4 参考文献

[1]张德坤. 非正交多址系统功率分配及干扰消除算法研究[D]. 哈尔滨工业大学.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机、雷达通信、无线传感器等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

相关文章:

  • 深入理解控制反转IOC和依赖注入
  • micropython 可视化音频 频谱解析(应该是全网首家)(预告,还没研究完成)
  • 网课答案接口平台 系统独立后台
  • stp基本介绍
  • 公众号如何接入查题功能
  • IDC_ISP网络之IDC机房内网络架构及配置
  • ROS1云课→17化繁为简stdr和f1tenth
  • R-CNN(Regions with CNN features)
  • LeetCode 387---First Unique Character in a String
  • 《OpenDRIVE1.6规格文档》1
  • 城市区号查询易语言代码
  • Codeforces Round #818 (Div. 2)(A-E)
  • 【刷题笔记7】LeetCode 54. 螺旋矩阵(数组模拟)
  • 设计模式:代理模式
  • gitlab搭建2(linux搭建,外部windows访问,centos7)
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 2017 年终总结 —— 在路上
  • css系列之关于字体的事
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • HTML5新特性总结
  • JavaScript服务器推送技术之 WebSocket
  • jQuery(一)
  • MySQL QA
  • Ruby 2.x 源代码分析:扩展 概述
  • vue-cli3搭建项目
  • 实战|智能家居行业移动应用性能分析
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 消息队列系列二(IOT中消息队列的应用)
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • - 转 Ext2.0 form使用实例
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • #Linux(Source Insight安装及工程建立)
  • #Linux(帮助手册)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (TOJ2804)Even? Odd?
  • (十八)三元表达式和列表解析
  • (十三)Maven插件解析运行机制
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)关于pipe()的详细解析
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @RequestBody与@ModelAttribute
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [android] 天气app布局练习
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C#][DevPress]事件委托的使用
  • [C/C++]数据结构 循环队列
  • [C++]STL之map
  • [GYCTF2020]Ez_Express
  • [IE 技巧] 显示/隐藏IE 的菜单/工具栏
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句