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