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在总功率约束的情况下,进行功率分配的过程。

  % 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

接下来是叠加编码:

   %%%%%%叠加编码 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

对于接受端:

 % 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)

待补充

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值