第【20】期--基于深度学习的非正交多址接入(noma)接收端优化--matlab完整代码

文章目录

摘要

本文对深度学习(DL)在非正交多址接入(NOMA)无线系统中多用户检测的应用进行了初步研究。传统方法需要显式地进行信道估计和串行干扰消除(SIC),而在SIC中由于错误传播效应,检测精度将在很大程度上依赖于对先前用户的正确检测。本文设计了一种基于深度学习的NOMA接收机,通过数据驱动的方式,直接学习从接收信号到发送符号组合的端到端映射关系。初步结果表明,深度学习方法能够优于传统的基于导频的信道估计方法。

1 研究背景和意义

近年来,随着移动互联网、物联网及智能终端的爆炸式增长,无线通信系统面临着频谱资源日益紧缺与用户连接需求指数级上升的双重压力。在此背景下,非正交多址接入(Non-Orthogonal Multiple Access, NOMA) 技术凭借其卓越的频谱效率提升潜力,被视为5G及未来无线通信系统的关键候选技术之一。与传统正交多址(如FDMA、TDMA、OFDMA)将用户分配在互不重叠的时频资源上不同,NOMA在功率域对多个用户进行复用,允许多个用户在相同的时频资源上同时传输。这一设计使NOMA能够服务于更多的并发用户,并显著提升系统频谱利用率。

然而,NOMA的频谱效率增益是以接收机复杂度的提升为代价的。在功率域复用的框架下,接收端接收到的信号是多个用户信号的叠加。为了从叠加信号中区分并恢复各用户的信息,接收机通常采用串行干扰消除(Successive Interference Cancellation, SIC) 技术。SIC按照用户功率由强到弱的顺序,依次解码每个用户的信号,并在解码后将重构的干扰信号从接收信号中剔除,再继续解码下一个用户。这种串行处理机制存在一个致命的缺陷------错误传播(Error Propagation)。若解码顺序中任一环节发生符号判决错误,该错误将在后续所有用户的解码过程中不断传递和累积,导致系统整体误码率性能严重恶化。

与此同时,深度学习技术近年来取得了突破性进展。深度学习凭借其强大的特征提取与非线性映射拟合能力,在计算机视觉、自然语言处理等领域取得了巨大成功,并逐渐向无线通信领域渗透。研究者开始探索利用深度神经网络(Deep Neural Network, DNN)替代传统通信中的某些信号处理模块,例如信道估计、信号检测、信道译码等。这类数据驱动的方法不依赖精确的数学模型,而是通过大量数据学习输入与输出之间的复杂映射关系,在传统方法难以建模或建模不够精确的场景下展现出显著优势。这为突破NOMA-SIC方案中错误传播等经典瓶颈提供了新的解决思路

2 系统模型

考虑一个两用户上行NOMA系统,在相同的时频资源上同时发送信号,接收端收到的信号是两路信号的叠加

在功率域NOMA中,不同用户通常以不同功率发送信号(例如,信道条件较差的远端用户分配更高功率),以便在接收端通过功率差异进行区分。

传统方法的sic过程:

1、先解码功率最强的用户信号(假设为用户1)

2、再从叠加信号中减去该用户信号

3、再解码用户2:

如果第一步 x1解码出错,误差 会传递到第二步,导致x2 的准确率严重下降

加粗样式

最大似然检测:

通过遍历所有可能的发送符号组合,寻找使欧氏距离最小的组合,其判决准则为

该方案假设接收端已知完美的信道状态信息,在理论上是性能最优的检测器,但计算复杂度随调制阶数指数增长。

可以看到,上述流程都是先要估计信道(方法有LS,MMSE,方法前文有描述,这里不再介绍),估计完成之后,再进行串行干扰消除。能不能利用深度学习的方法,直接将该两步合并为一步,即:构造一个神经网络,输入是接收信号,输出直接就是两个恢复完成的发射符号了。即:

相当于通过神经网络f,隐式的完成了信道估计和信号检测的任务。

3 算法设计

  • 数据集:根据信道统计特性仿真生成数据对

损失函数,多分类任务,使用交叉熵损失函数

4 仿真

采用QPSK(4个符号),NOMA考虑两个用户,故在接收端的某一个目标子载波上,两个用户的符号组合总数为:共有16种组合。

层名称 输出尺寸 说明
输入层 384 × 1 接收信号特征向量(3个OFDM符号 × 64子载波 × 实虚部)
LSTM层 128 × 1 深度特征提取,捕捉信号时空相关性
全连接层 16 × 1 映射到16类符号组合
Softmax层 16 × 1 输出概率分布,和为1
输出层 --- 输出预测类别

这种设计将信道估计、干扰消除、符号判决三个传统模块合并为一个端到端的可学习系统,输入原始接收信号,直接输出解码结果。

c 复制代码
clear variables;
close all;

% 加载训练数据和必要参数
load('trainData.mat','h','numPSC','lengthCP','idx_sc','fixedPilot');
% 加载神经网络
load('NN.mat','net');
% 加载信道协方差矩阵
% load('Rhh.mat','Rhh');

% 系统参数
[numPath,numUE] = size(h);
numSC = 64; % 子载波数
numPSym = numUE; % 每个数据包中导频OFDM符号数
numDSym = 1; % 每个数据包中数据OFDM符号数
numSym = numPSym+numDSym; % 每个数据包中OFDM符号总数
pilotSpacing = numSC/numPSC;
pilotStart = [1,1]; % 两个用户的导频起始子载波

% QPSK调制
constQPSK = [1-1j;1+1j;-1+1j;-1-1j]; % QPSK星座点
a = constQPSK(1);
b = constQPSK(2);
c = constQPSK(3);
d = constQPSK(4);
% 标签
symClass = [a a;a b;a c;a d;b a;b b;b c;b d;c a;c b;c c;c d;d a;d b;d c;d d]; % 16 x 2
labelClass = 1:1:size(symClass,1);

% 测试数据大小
numPacket = 1000;
fixedPilot = repmat(fixedPilot,1,1,1,numPacket);

% 功率分配
targetSNR_1 = 12; % dB,强用户目标信噪比
targetSNR_2 = 12; % dB,弱用户目标信噪比
targetSNR_linear_1 = 10^(targetSNR_1/10);
targetSNR_linear_2 = 10^(targetSNR_2/10);
H = fft(h,numSC,1); 
gainH = (abs(H).^2).';

% 噪声计算
EsN0_dB = 4:2:28; % 总接收信噪比
EsN0 = 10.^(EsN0_dB./10);
symRate = 2; % 符号速率,2 符号/秒,两个用户同时发送
Es = 1; % 符号能量,焦耳/符号
sigPower = Es*symRate; % 总信号功率(2 符号/秒),焦耳/秒 = 瓦
symPower = sigPower/numUE; % 每符号信号功率 
N0 = sigPower./EsN0; % 噪声功率,瓦/赫兹,假设子载波间隔为 1 Hz
bw = 1; % 每子载波带宽,Hz
nPower = N0*bw; % 总噪声功率,频域,瓦
nVar = nPower./2; % 噪声方差,频域

% 生成信道协方差矩阵(或加载已保存的数据)
Rhh = getRhh(numPath,numSC,1e5);

% 测试阶段
ITER = 1; % 蒙特卡洛迭代次数
numErr_ML = zeros(numUE,numel(EsN0_dB),ITER);
numErr_LS = zeros(numUE,numel(EsN0_dB),ITER);
numErr_MMSE = zeros(numUE,numel(EsN0_dB),ITER);
numErr_DL = zeros(numUE,numel(EsN0_dB),ITER);
tic;
for it = 1:ITER
    for snr = 1:numel(nVar)
        
        % 发送数据包(与生成训练数据过程相同)
        pilotFrame = zeros(numPSym,numSC,numUE,numPacket);
        pilotFrame(1,:,1,:) = 1/sqrt(2)*complex(sign(rand(1,numSC,1,numPacket)-0.5),sign(rand(1,numSC,1,numPacket)-0.5));
        pilotFrame(2,:,2,:) = 1/sqrt(2)*complex(sign(rand(1,numSC,1,numPacket)-0.5),sign(rand(1,numSC,1,numPacket)-0.5));
        pilotFrame(:,pilotStart(1):pilotSpacing:end,1,:) = fixedPilot(:,:,1,:);
        pilotFrame(:,pilotStart(2):pilotSpacing:end,2,:) = fixedPilot(:,:,2,:);
        dataFrame = complex(sign(rand(numDSym,numSC,numUE,numPacket)-0.5),sign(rand(numDSym,numSC,numUE,numPacket)-0.5));
        transmitPacket = zeros(numSym,numSC,numUE,numPacket);
        transmitPacket(1:2,:,:,:) = pilotFrame;
        transmitPacket(end,:,:,:) = 1/sqrt(2)*dataFrame;

        % 收集发送数据符号的标签
        tLabel = zeros(1,numPacket);
        for b = 1:numel(labelClass)
            tLabel(logical(squeeze(dataFrame(1,idx_sc,1,:))==symClass(b,1) & squeeze(dataFrame(1,idx_sc,2,:))==symClass(b,2))) = b;
        end
        
        % 功率分配
        [powerFactor,decOrder] = allocatePower(symPower,gainH,targetSNR_linear_1,targetSNR_linear_2,nVar(snr));
        h_all = repmat(h,1,1,numPacket);
        powerFactor_all = repmat(powerFactor,1,1,numPacket);
        decOrder_all = repmat(decOrder,1,1,numPacket);
        
        % 接收数据包
        [receivePacket,randomPhase] = dataTransmissionReception(transmitPacket,powerFactor_all,lengthCP,h_all,nVar(snr));
        receivePilot = receivePacket(1:2,:,:); 
        receiveData = receivePacket(end,:,:);

        % ML检测(假设完美信道估计)
        decOrder_sc = squeeze(decOrder_all(idx_sc,:,:));
        idx_1 = decOrder_sc(1,:).';
        idx_2 = decOrder_sc(2,:).';
        H_sc = repmat(H(idx_sc,:),numPacket,1).';
        pF_sc = squeeze(powerFactor_all(idx_sc,:,:)); 
        rData = squeeze(receiveData(1,idx_sc,:)); % numPacket x 1
        tData = squeeze(transmitPacket(end,idx_sc,:,:)); % numUE x numPacket
        [numErr_ML(:,snr,it),rLabel_ML] = detectML(H_sc,randomPhase,constQPSK,pF_sc,rData,idx_1,idx_2,tData,symClass);
        
        % LS和MMSE估计
        [H_LS,H_MMSE] = channelEstimation(receivePilot,pilotFrame,powerFactor_all,pilotStart,Rhh,nVar(snr),numPSC,H);
        [numErr_LS(:,snr,it),rLabel_LS] = symbolDecodeSIC(rData,H_LS(idx_sc,:,:),decOrder_sc,pF_sc,constQPSK,tData);
        [numErr_MMSE(:,snr,it),rLabel_MMSE] = symbolDecodeSIC(rData,H_MMSE(idx_sc,:,:),decOrder_sc,pF_sc,constQPSK,tData);
    
        % DL检测
        numErr_DL(:,snr,it) = symbolDecodeDL(labelClass,receivePacket,tLabel,net,decOrder_sc,symClass,constQPSK);
        
    end
    
end
toc;
 
numErr_LS = mean(numErr_LS,3);
numErr_MMSE = mean(numErr_MMSE,3);
numErr_ML = mean(numErr_ML,3);
numErr_DL = mean(numErr_DL,3);

figure();
semilogy(EsN0_dB, numErr_DL(1,:), 'r-o', 'LineWidth', 1.5); hold on;
semilogy(EsN0_dB, numErr_DL(2,:), 'r-x', 'LineWidth', 1.5);
semilogy(EsN0_dB, numErr_LS(1,:), 'b--o', 'LineWidth', 1.5);
semilogy(EsN0_dB, numErr_LS(2,:), 'b--x', 'LineWidth', 1.5);
semilogy(EsN0_dB, numErr_MMSE(1,:), 'k--o', 'LineWidth', 1.5);
semilogy(EsN0_dB, numErr_MMSE(2,:), 'k--x', 'LineWidth', 1.5);
semilogy(EsN0_dB, numErr_ML(1,:), 'g-o', 'LineWidth', 1.5);
semilogy(EsN0_dB, numErr_ML(2,:), 'g-x', 'LineWidth', 1.5);
hold off;

legend('用户1 - DL', '用户2 - DL', '用户1 - LS', '用户2 - LS', ...
       '用户1 - MMSE', '用户2 - MMSE', '用户1 - ML', '用户2 - ML', ...
       'Location', 'southwest', 'FontSize', 11);
xlabel('信噪比 Es/N0 (dB)', 'FontSize', 12);
ylabel('BER', 'FontSize', 12);
grid on;
set(gca, 'FontSize', 11);

function Rhh = getRhh(numPaths,numSC,numChan)
% 生成信道协方差矩阵
Rhh = zeros(numSC,numSC,numChan);
for i = 1:numChan    
    h = 1/sqrt(2)/sqrt(numPaths)*complex(randn(numPaths,1),randn(numPaths,1)); % L x 1
    H = fft(h,numSC); % numSC x 1
    Rhh(:,:,i) = H*H';    
end
Rhh = mean(Rhh,3); % numSC x numSC
end

总结

本文探索了一种有别于传统方案的新思路:通过深度学习将NOMA接收端的信道估计与信号检测融合为一个端到端的可学习系统,使接收机能够直接从原始接收信号中提取多用户信息,绕过串行干扰消除的固有缺陷。为未来通信系统在复杂或难以精确建模的环境下的接收端设计,提供了有益的参考和借鉴。

参考文献: Narengerile and J. Thompson, "Deep Learning for Signal Detection in Non-Orthogonal Multiple Access Wireless Systems," 2019 UK/ China Emerging Technologies (UCET), Glasgow, United Kingdom, 2019, pp. 1-4.