NOMA学习

NOMA(非正交多址接入技术)

NOMA基本概念

NOMA,全称是Non-Orthgonal Multiple Access,对应中文是非正交多址接入。

基本思想是在发送端采用非正交发送,主动引入干扰信息,在接收端通过串行干扰消除(SIC)接收机实现正确解调。

NOMA是非正交多址,而并非非正交频分,即NOMA的子信道传输仍然采用OFDM ,子信道之间是正交的。但是一个子信道上不再只分配给一个用户,而是多个用户共享,同一子信道上不同用户之间是非正交传输。

在发送端,对同一子信道上的不同用户采用功率复用技术进行发送,不同用户的信号功率按照相关的算法进行分配,这样到达接受端每个用户的信号功率都不一样,SIC接收机再根据不同用户信号功率大小按照一定的顺序进行干扰消除,实现正确解调,同时也达到了区分用户的目的。

上行NOMA与下行NOMA

上行NOMA(MAC信道)

特点:多点发送、单点接收,单用户功率受限,同时发送的用户数越多则总功率越高,发送端难以联合处理而接收端可以联合处理。

下行NOMA(BC广播信道)

特点:单点发送、多点接收,总发送功率受限,发送端可以联合处理而接收端难以联合处理。

对于信道质量差即信道增益低的用户,给之分配更高的功率,反之,分配更低的功率。这便引出了功率分配问题。

可行的优化目标:

  • 总功率受限,最大化下行速率

SIC解码顺序

下行NOMA中,基站将不同用户的信号叠加在一起,UE来实现连续干扰消除技术;而在上行中,基站来实现多用户检测和连续干扰消除技术。

NOMA下行场景 中,基站侧将用户1和2的信号叠加在一起,即

对于User1,接收信号y1=h1x+n1,对于User2,接收信号y2=h2x+n2。

弱用户User1直接解出自己的信号即可,此时将User2的信号当做干扰。

强用户User2先解出User1的信号,然后User2从其接收信号中减去User1的信号,再解自己的信号。

由于基站进行功率分配时,需要用到下行信道状态信息h1和h2,那基站是怎么知道下行CSI的?可以利用信道互易性或者UE利用上行信道进行反馈。

NOMA上行场景 中,基站侧解码顺序:
基站先解码出强用户User2的信号,然后从接收信号减去恢复出来的强用户的信号,之后再解弱用户User1的信号。

UE侧的处理能力有限,且缺少中心处理单元,因此上行链路相较于下行链路中更容易实现。

叠加编码(SC)与串行干扰消除(SIC)

叠加编码(superposition code,SC)

基站侧将不同用户信号进行叠加:

手机侧进行解码:

对于User1来说,收到叠加信号时,先进行均衡(即通过信道估计出h1,并对接收信号乘以h1的逆),然后直接解调出自己信号即可。

对于User2来说,收到叠加信号时,先进行均衡(即通过信道估计出h2,并对接收信号乘以h2的逆),先解调出User1的信号,随后重构出User1的信号,再从接收信号减去重构的User1信号,然后解调出User2的信号。

下面这段代码,是下行NOMA中,User1和User2在总功率约束的情况下,进行功率分配的过程。

matlab 复制代码
  % Calculate Power coefficients for each pair
    txParams.powerCoeffs = zeros(txParams.numUsers, 1);
    
    if (txParams.pwrAllocMthd == 1)
        for iter_pairs = 1: txParams.numUsers / 2
            txParams.powerCoeffs(txParams.userPairs(iter_pairs, 1), 1) = (sqrt(1 + txParams.sysPower * abs(txParams.est_CSI(txParams.userPairs(iter_pairs, 2), 1)) .^ 2) - 1) / (txParams.sysPower * abs(txParams.est_CSI(txParams.userPairs(iter_pairs, 2), 1)));
            txParams.powerCoeffs(txParams.userPairs(iter_pairs, 2), 1) = txParams.sysPower - txParams.powerCoeffs(txParams.userPairs(iter_pairs, 1), 1);
        end
    elseif (txParams.pwrAllocMthd == 2)
        for iter_pairs = 1: txParams.numUsers / 2
            txParams.powerCoeffs(txParams.userPairs(iter_pairs, 1), 1) = (sqrt(1 + txParams.sysPower * abs(txParams.est_CSI(txParams.userPairs(iter_pairs, 2), 1)) .^ 2) - 1) / (txParams.sysPower * abs(txParams.est_CSI(txParams.userPairs(iter_pairs, 2), 1)));
            txParams.powerCoeffs(txParams.userPairs(iter_pairs, 2), 1) = txParams.sysPower - txParams.powerCoeffs(txParams.userPairs(iter_pairs, 1), 1);
        end        
    end

接下来是叠加编码:

matlab 复制代码
   %%%%%%叠加编码 superposition code
    for iter_pairs = 1: txParams.numUsers / 2
        modDataMat(iter_pairs, :) = sqrt(txParams.powerCoeffs(txParams.userPairs(iter_pairs, 1), 1)) * modData(:, txParams.userPairs(iter_pairs, 1));
        modDataMat(iter_pairs, :) = modDataMat(iter_pairs, :) + sqrt(txParams.powerCoeffs(txParams.userPairs(iter_pairs, 2), 1)) * modData(:, txParams.userPairs(iter_pairs, 2))';
    end

对于接受端:

matlab 复制代码
 % SIC
    for iter_pairs = 1: txParams.numUsers / 2
        pair_data = modDataMat(iter_pairs, :)';
        for iter_user = 1: 2
            H = txParams.CSI(txParams.userPairs(iter_pairs, iter_user));
            H_hat = txParams.est_CSI(txParams.userPairs(iter_pairs, iter_user));
            
            pair_data = H * pair_data; % Adding Channel effect
            pair_data = pair_data / H_hat; % Equalising Channel effect
            for iter_sic = 1: iter_user
                P = txParams.powerCoeffs(txParams.userPairs(iter_pairs, iter_sic), 1);
                %%%%解调、信道译码 -> 信道质量好的强用户
                demodData = qamdemod(pair_data ./ sqrt(P), txParams.QAM, 'UnitAveragePower', 1, 'OutputType', 'approxllr');
                usr_data = channelDecoding(demodData, txParams);
                
                %%%%信道编码、调制 -> 重构强用户的信号
                enc_data = channelEncoding(usr_data, txParams);
                modData = qammod(enc_data, txParams.QAM, 'UnitAveragePower', 1, 'InputType', 'bit');
                
                %%%%接收信号-强用户信号 == 弱用户信号,准备解调
                pair_data = pair_data - H_hat * sqrt(P) * modData;
            end
            data(:, txParams.userPairs(iter_pairs, iter_user)) = usr_data;
        end
    end

串行干扰消除(SIC)

待补充

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习