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

简介: 【通信】非正交多址接入(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代码问题可私信交流。



相关文章
|
19天前
|
数据安全/隐私保护
地震波功率谱密度函数、功率谱密度曲线,反应谱转功率谱,matlab代码
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
19天前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
19天前
|
算法 调度
面向配电网韧性提升的移动储能预布局与动态调度策略(matlab代码)
面向配电网韧性提升的移动储能预布局与动态调度策略(matlab代码)
|
19天前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
|
19天前
|
运维 算法
基于改进遗传算法的配电网故障定位(matlab代码)
基于改进遗传算法的配电网故障定位(matlab代码)
|
19天前
|
Serverless
基于Logistic函数的负荷需求响应(matlab代码)
基于Logistic函数的负荷需求响应(matlab代码)
|
19天前
|
供应链 算法
基于分布式优化的多产消者非合作博弈能量共享(Matlab代码)
基于分布式优化的多产消者非合作博弈能量共享(Matlab代码)
|
19天前
|
算法 调度
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
|
19天前
|
算法 调度 SoC
电动汽车充放电V2G模型(Matlab代码)
电动汽车充放电V2G模型(Matlab代码)

热门文章

最新文章