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)

待补充

相关推荐
一只小小汤圆8 分钟前
opencascade源码学习之BRepOffsetAPI包 -BRepOffsetAPI_DraftAngle
c++·学习·opencascade
虾球xz16 分钟前
游戏引擎学习第20天
前端·学习·游戏引擎
LateBloomer77725 分钟前
FreeRTOS——信号量
笔记·stm32·学习·freertos
legend_jz29 分钟前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
Komorebi.py30 分钟前
【Linux】-学习笔记04
linux·笔记·学习
weiabc1 小时前
学习electron
javascript·学习·electron
HackKong2 小时前
小白怎样入门网络安全?
网络·学习·安全·web安全·网络安全·黑客
Bald Baby2 小时前
JWT的使用
java·笔记·学习·servlet
心怀梦想的咸鱼3 小时前
UE5 第一人称射击项目学习(四)
学习·ue5
AI完全体3 小时前
【AI日记】24.11.22 学习谷歌数据分析初级课程-第2/3课
学习·数据分析