主要内容

基于深度学习的5G信道估计数据综合

这个例子展示了如何使用深度学习工具箱™和5G工具箱™生成的数据来训练卷积神经网络(CNN)进行信道估计。使用训练好的CNN,使用物理下行共享信道(PDSCH)解调参考信号(DM-RS)在单输入单输出(SISO)模式下执行信道估计。

简介

信道估计的一般方法是在传输中插入已知的参考导频符号,然后使用这些导频符号插入其余的信道响应。

有关显示如何使用此信道估计方法的示例,请参见NR PDSCH吞吐量

您还可以使用深度学习技术来执行信道估计。例如,通过将资源网格视为2-D图像,可以将信道估计问题转化为图像处理问题,类似于去噪或超分辨率问题,其中cnn是有效的。

使用5G工具箱,您可以自定义和生成符合标准的波形和信道模型,以用作训练数据。使用深度学习工具箱,您可以使用这些训练数据来训练信道估计CNN。这个例子展示了如何生成这样的训练数据,以及如何训练一个信道估计CNN。该示例还展示了如何使用信道估计CNN来处理包含线性插值接收导频符号的图像。该示例最后通过将神经网络信道估计器的结果与实际的和完美的估计器进行比较进行可视化。

神经网络训练

神经网络训练包括以下步骤:

  • 数据生成

  • 将生成的数据分成训练集和验证集

  • 定义CNN体系结构

  • 指定训练选项、优化器和学习率

  • 培训网络

由于大量的信号和可能的场景,训练可能需要几分钟。默认情况下,训练是禁用的,使用预训练的模型。您可以通过设置启用培训trainModel为true。

trainModel = false;

如果您安装了并行计算工具箱™,并设置了支持cuda的NVIDIA®GPU,则网络训练默认使用GPU加速。金宝app的trainNetwork(深度学习工具箱)函数允许您重写此默认行为。有关支持的gpu的列表,请参金宝app见GPU支金宝app持版本(并行计算工具箱)

数据生成设置为生成256个训练示例或训练数据集。这个数据量足以在合理的时间内在CPU上训练一个功能良好的信道估计网络。为了进行比较,预训练模型基于16,384个训练示例。

CNN模型的训练数据具有固定大小的维数,网络只能接受612 × 14 × 1的栅格,即612个子载波,14个OFDM符号和1个天线。因此,该模型只能在固定带宽分配、循环前缀长度和单个接收天线上运行。

CNN将资源网格视为二维图像,因此网格的每个元素都必须是实数。在信道估计场景中,资源网格的数据比较复杂。因此,这些网格的实部和虚部分别输入到CNN。在本例中,训练数据从一个612 × 14的复矩阵转换为一个612 × 14 × 2的实值矩阵,其中第三维表示实分量和虚分量。由于在进行预测时必须将实网格和虚网格分别输入到神经网络中,因此该示例将训练数据转换为612 × 14 × 1 × 2n形式的4-D数组,其中N是训练示例的数量。

为了确保CNN不会过度拟合训练数据,将训练数据分为验证集和训练集。验证数据用于定期监测训练神经网络的性能,如所定义的valFrequency,大约每个纪元5个。当验证损失停止改善时停止训练。在这种情况下,由于数据集的大小较小,验证数据的大小与单个迷你批的大小相同。

返回的信道估计CNN根据不同的延迟传播、多普勒频移和0到10 dB之间的信噪比范围在各种信道配置上进行训练。

设置可再现性的随机种子(如果GPU是%使用)rng (42)如果trainModel生成训练数据[trainData,trainLabels] = hGenerateTrainingData(256);设置每个迷你批的示例数量batchSize = 32;将实网格和虚网格分割成2个图像集,然后连接trainData =猫(4,trainData (:,: 1:), trainData (:,: 2:));trainLabels =猫(4,trainLabels (:,: 1:), trainLabels (:,: 2:));分成训练集和验证集valData = trainData(:,:,:,1:batchSize);valLabels = trainLabels(:,:,:,1:batchSize);trainData = trainData(:,:,:,batchSize+1:end);trainLabels = trainLabels(:,:,:,batchSize+1:结束);每个纪元大约验证5次valFrequency = round(size(trainData,4)/batchSize/5);定义CNN结构层= [...imageInputLayer([612 14 1],“归一化”“没有”64年)convolution2dLayer(9日,“填充”,4) relullayer卷积2dlayer (5,64,“填充”,2,“NumChannels”,64) reluLayer卷积层(5,64,“填充”,2,“NumChannels”,64) reluLayer卷积2dlayer (5,32,“填充”,2,“NumChannels”,64) reluLayer卷积2dlayer (5,1,“填充”,2,“NumChannels”,32) regressionLayer];制定培训政策选项= trainingOptions(“亚当”...“InitialLearnRate”3的军医,...“MaxEpochs”,5,...“洗牌”“every-epoch”...“详细”假的,...“阴谋”“训练进步”...“MiniBatchSize”batchSize,...“ValidationData”{valData, valLabels},...“ValidationFrequency”valFrequency,...“ValidationPatience”5);培训网络。保存的结构trainingInfo包含%培训进度,以便日后检查。这个结构是有用的%比较不同优化的最优收敛速度%的方法。[channelEstimationCNN,trainingInfo] = trainNetwork(trainData, trainingInfo)...trainLabels层,选项);其他的如果trainModel设置为false,则加载预训练的网络负载(“trainedChannelEstimationNetwork.mat”结束

检查模型的组成层和各个层。该模型有5个卷积层。输入层期望大小为612 × 14的矩阵,其中612是子载波的数量,14是OFDM符号的数量。每个元素都是一个实数,因为复杂网格的实部和虚部是分别输入的。

channelEstimationCNN。层
ans = 11x1带有图层的图层数组:612 x14x1 imageinput的图像输入图像2 conv_1卷积64 9 x9x1旋转步[1]和填充[4 4 4 4]3‘relu_1 ReLU ReLU 4 conv_2卷积64 5 x5x64旋转步[1]和填充[2 2 2 2]5‘relu_2 ReLU ReLU 6 conv_3卷积64 5 x5x64旋转步[1]和填充(2 2 2 2)7的relu_3 ReLU ReLU 8 conv_4的卷积32 5 x5x64旋转步[1]和填充(2 2 2 2)9 ' relu_4 ReLU ReLU 10 conv_5卷积15x5x32卷积与stride[1 1]和padding [2 2 2 2] 11 'regressionoutput'回归输出均方误差与响应' response '

创建用于仿真的通道模型

设置模拟噪声级别,单位为dB。有关本例使用的信噪比定义的解释,请参见链路模拟中使用的信噪比定义

SNRdB = 10;

加载预定义的仿真参数,包括PDSCH参数和DM-RS配置。

simParameters = hDeepLearningChanEstSimParameters();carrier = simParameters.Carrier;pdsch = simParameters.PDSCH;

创建TDL通道模型并设置通道参数。为了比较估计器的不同信道响应,您可以稍后更改这些参数。

channel = nrTDLChannel;通道。Seed = 0;通道。DelayProfile =“TDL-A”;通道。DelaySpread = 3e-7;通道。MaximumDopplerShift = 50;本例只支持ssio配置金宝app通道。numtransmitantenna = 1;通道。numreceiveantenna = 1;waveformInfo = nrOFDMInfo(载波);通道。SampleRate = waveforinfo .SampleRate;

通过通道多路径组件获取延迟采样的最大数量。这个数字是根据具有最大延迟的信道路径和信道滤波器的实现延迟计算得出的。在获取接收到的信号时,需要这个数字来刷新通道滤波器。

chInfo =信息(通道);maxChDelay = ceil(max(chinfo . pathdelayed *channel.SampleRate))+chInfo.ChannelFilterDelay;

模拟PDSCH DM-RS传输

通过执行以下步骤模拟PDSCH DM-RS传输:

  • 生成资源网格

  • 插入DM-RS符号

  • 执行OFDM调制

  • 通过信道模型发送调制波形

  • 添加高斯白噪声

  • 执行完美的定时同步

  • 执行OFDM解调

栅格中的DM-RS符号用于信道估计。本例不传输任何数据,因此,资源网格不包括任何PDSCH符号。

生成DM-RS索引和符号dmrsSymbols = nrPDSCHDMRS(载体,pdsch);dmrsIndices = nrPDSCHDMRSIndices(载体,pdsch);%创建资源网格pdschGrid = nrResourceGrid(carrier);将PDSCH DM-RS符号映射到网格pdschGrid(dmrsIndices) = dmrsSymbols;ofdm调制相关的资源元素tx波形= nrofdm调制(载波,pdschGrid);

若要刷新通道内容,请在传输波形的末尾附加零。这些零考虑了通道中引入的任何延迟,例如多路径和实现延迟。零的数量取决于采样率、延迟配置文件和延迟扩展。

tx波形= [tx波形;0 (maxChDelay、尺寸(txWaveform 2)));

通过TDL通道模型发送数据。

[rx波形,pathgain,sampleTimes] =通道(tx波形);

在接收到的时域波形中添加加性高斯白噪声(AWGN)。考虑采样率,对噪声功率进行归一化处理。信噪比是为每个接收天线(3GPP TS 38.101-4)定义的每个资源单元(RE)。有关本例使用的信噪比定义的解释,请参见链路模拟中使用的信噪比定义

信噪比= 10^(SNRdB/10);计算线性信噪比N0 = 1/√(2.0*simParameters.NRxAnts*double(waveforinfo . nfft)*信噪比);噪声= N0*complex(randn(size(rx波形)),randn(size(rx波形)));rx波形= rx波形+噪声;

执行完美的同步。要找到最强的多路径组件,请使用通道提供的信息。

为完美的信道估计获取路径滤波器pathFilters = getPathFilters(channel);[offset,~] = nrPerfectTimingEstimate(pathgain,pathFilters);rx波形= rx波形(1+offset:end,:);

ofdm -对接收到的数据进行解调,重建资源网格。

rxGrid = nrOFDMDemodulate(载波,rx波形);用零填充网格,以防已解调不完整的槽[K,L,R] = size(rxGrid);如果(L < carrier.SymbolsPerSlot) rxGrid = cat(2,rxGrid, 0 (K,carrier.SymbolsPerSlot-L,R));结束

比较和可视化各种信道估计

您可以执行和比较同一通道模型的完美、实用和神经网络估计的结果。

要执行完美的信道估计,请使用nrPerfectChannelEstimate函数使用通道提供的路径增益值。

estChannelGridPerfect = nrPerfectChannelEstimate(载波,路径增益,...抵消,pathFilters sampleTimes);

要执行实际的信道估计,请使用nrChannelEstimate函数。

[estChannelGrid,~] = nrChannelEstimate(carrier,rxGrid,dmrsIndices,...dmrsSymbols,“CDMLengths”, pdsch.DMRS.CDMLengths);

要使用神经网络进行信道估计,必须对接收到的网格进行插值。然后将插值图像分割为实部和虚部,并将这些图像作为单个批次一起输入到神经网络中。使用预测(深度学习工具箱)函数对实图像和虚图像进行预测。最后,将结果连接并转换回复杂的数据。

使用导频符号位置插入所接收的资源网格interpChannelGrid = hPreprocessInput(rxGrid,dmrsIndices,dmrsSymbols);沿着批处理维度连接实网格和虚网格nnInput = cat(4,real(interpChannelGrid),imag(interpChannelGrid));%利用神经网络估计信道estChannelGridNN = predict(channelEstimationCNN,nnInput);将结果转换为复数estChannelGridNN = complex(estChannelGridNN(:,:,:,1),estChannelGridNN(:,:,:,2));

计算每种估计方法的均方误差(MSE)。

neural_mse = mean(abs(estChannelGridPerfect(:) - estChannelGridNN(:)).^2);interp_mse = mean(abs(estChannelGridPerfect(:) - interpChannelGrid(:)).^2);practical_mse = mean(abs(estChannelGridPerfect(:) - estChannelGrid(:)).^2);

绘制从信道滤波器抽头获得的单个信道估计和实际信道实现。实用估计器和神经网络估计器都优于线性插值。

plotChEstimates (interpChannelGrid estChannelGrid、estChannelGridNN estChannelGridPerfect,...interp_mse、practical_mse neural_mse);

参考文献

  1. van de Beek, Jan-Jaap, Ove Edfors, Magnus Sandell, Sarah Kate Wilson和Per Ola Borjesson。OFDM系统中的信道估计1995年IEEE第45届车辆技术会议。无线二十一世纪倒计时,2:815-19,1995年7月。

  2. Ye, Hao, Geoffrey Ye Li和Biing-Hwang Juang。深度学习在OFDM系统中信道估计和信号检测中的作用IEEE无线通信通讯第7期。1(2018年2月):114-17。

  3. 索尔塔尼,迈赫兰,瓦希德·普尔艾哈迈迪,阿里·米尔扎伊和哈米德·谢赫扎德。“基于深度学习的信道估计。”预印本,2018年10月13日提交。

本地函数

函数hest = hPreprocessInput(rxGrid,dmrsIndices,dmrsSymbols)对网格进行线性插值,并将结果输入这个辅助函数提取DM-RS符号% dmrsIndices在接收的网格rxGrid中的位置并执行线性%插值提取的导频。获取导频符号估计值dmrsRx = rxGrid(dmrsIndices);dmrsEsts = dmrsRx .* conj(dmrsSymbols);在线性插值后创建空网格[rxDMRSGrid, hest] = deal(零(大小(rxGrid)));rxDMRSGrid(dmrsIndices) = dmrsSymbols;查找给定DMRS配置的行坐标和列坐标[rows,cols] = find(rxDMRSGrid ~= 0);dmrsSubs = [rows,cols,ones(size(cols))];[l_hest, k_hest] = meshgrid(1:尺寸(命令,2),1:尺寸(命令,1));执行线性插值f = scatteredInterpolant(dmrsSubs(:,2),dmrsSubs(:,1),dmrsEsts);Hest = f(l_hest,k_hest);结束函数[trainData,trainLabels] = hGenerateTrainingData(dataSize)生成用于信道估计的训练数据示例。运行dataSize用于创建随机通道配置并传递一个仅插入DM-RS符号的ofdm调制固定资源网格。完成完美的定时同步和OFDM解调、提取%导频符号,并在每次迭代中执行线性插值。%使用完美通道信息创建标签数据。这个函数%返回2个数组——训练数据和标签。流(“开始生成数据…\n”%可能的通道配置文件列表delayProfiles = {“TDL-A”“TDL-B”“TDL-C”“TDL-D”“TDL-E”};simParameters = hDeepLearningChanEstSimParameters();carrier = simParameters.Carrier;pdsch = simParameters.PDSCH;创建通道模型对象nTxAnts = simParameters.NTxAnts;nRxAnts = simParameters.NRxAnts;channel = nrTDLChannel;% TDL通道对象通道。numtransmitantenna = nTxAnts;通道。numreceiveantenna = nRxAnts;使用返回的值%设置通道模型采样率waveformInfo = nrOFDMInfo(载波);通道。SampleRate = waveforinfo .SampleRate;获取通道多路径延迟采样的最大数量%的组件。这个数字是从最大的通道路径计算出来的%延迟和信道滤波器的实现延迟,并且是必需的%以刷新通道滤波器以获取接收到的信号。chInfo =信息(通道);maxChDelay = ceil(max(chinfo . pathdelayed *channel.SampleRate)) + chInfo.ChannelFilterDelay;返回DM-RS索引和符号dmrsSymbols = nrPDSCHDMRS(载体,pdsch);dmrsIndices = nrPDSCHDMRSIndices(载体,pdsch);%创建资源网格grid = nrResourceGrid(carrier,nTxAnts);DM-RS预编码和映射[~,dmrsAntIndices] = nrExtractResources(dmrsIndices,grid);grid(dmrsAntIndices) = dmrsSymbols;OFDM调制的相关资源元素txWaveform_original = nrofdm调制(载波,网格);获取神经网络预处理的线性插值坐标[rows,cols] = find(grid ~= 0);dmrsSubs = [rows, cols, ones(size(cols))];Hest =零(大小(网格));[l_hest, k_hest] = meshgrid(1:尺寸(命令,2),1:尺寸(命令,1));为训练数据和标签预分配内存numExamples = dataSize;[trainData, trainLabels] = deal(零([612 14 2 numExamples]));用于生成数据的主循环,遍历示例的数量在函数调用中指定的%。循环的每次迭代产生一个%新信道实现与随机延迟传播,多普勒频移,%和延迟配置文件。每一个被传送的扰动版本包含DM-RS符号的%波形存储在trainData中%完美的通道实现在trainLabels。i = 1:numExamples释放通道以更改不可调属性channel.release选择一个随机的种子来创建不同的渠道实现通道。种子= randi([1001 2000]);选择一个随机的延迟配置文件,延迟扩散,和最大多普勒频移通道。DelayProfile = string(delayProfiles(randi([1 numel(delayProfiles)])));通道。DelaySpread = randi([1 300])*1e-9;通道。MaximumDopplerShift = randi([5 400]);通过通道模型发送数据。的末尾加0%发送的波形以刷新通道内容。这些零%考虑到任何延迟引入的通道,如%多路径延迟和实现延迟。这个值取决于%采样率,延迟分布和延迟分布tx波形= [txWaveform_original;0 (maxChDelay、尺寸(txWaveform_original 2)));[rx波形,pathgain,sampleTimes] =通道(tx波形);在接收的时域添加加性高斯白噪声(AWGN)%波形。考虑采样率,对噪声功率进行归一化处理。信噪比定义为每个接收天线的每RE (3GPP TS 38.101-4)。SNRdB = randi([0 10]);%在0到10 dB之间的随机信噪比值信噪比= 10^(SNRdB/10);计算线性信噪比N0 = 1/√(2.0*nRxAnts*double(waveforinfo . nfft)*信噪比);噪声= N0*complex(randn(size(rx波形)),randn(size(rx波形)));rx波形= rx波形+噪声;%完美同步。使用通道提供的信息%来查找最强的多路径分量pathFilters = getPathFilters(channel);为完美的信道估计获取路径滤波器[offset,~] = nrPerfectTimingEstimate(pathgain,pathFilters);rx波形= rx波形(1+offset:end,:);对接收到的数据进行OFDM解调以重建数据%资源网格,包括填充以防实际情况%同步将导致不完整的插槽被解调rxGrid = nrOFDMDemodulate(载波,rx波形);[K,L,R] = size(rxGrid);如果(L < carrier.SymbolsPerSlot) rxGrid = cat(2,rxGrid, 0 (K,carrier.SymbolsPerSlot-L,R));结束完美信道估计,使用路径增益的值%由频道提供。这个渠道估计没有包括发射机预编码的影响estChannelGridPerfect = nrPerfectChannelEstimate(载波,路径增益,...抵消,pathFilters sampleTimes);线性插值dmrsRx = rxGrid(dmrsIndices);dmrsEsts = dmrsRx .* conj(dmrsSymbols);f = scatteredInterpolant(dmrsSubs(:,2),dmrsSubs(:,1),dmrsEsts);Hest = f(l_hest,k_hest);将插值网格分割为实分量和虚分量%连接他们沿第三维度,以及%真实信道响应Rx_grid = cat(3, real(hest), imag(hest));est_grid = cat(3, real(estChannelGridPerfect),...图像放大(estChannelGridPerfect));将生成的训练示例和标签添加到相应的数组中trainData(:,:,:,i) = rx_grid;trainLabels(:,:,:,i) = est_grid;%数据生成跟踪器如果mod(i,round(numExamples/25)) == 0 fprintf(' % 3.2 f % % \ n的,我/ numExamples * 100);结束结束流(“数据生成完成!”\ n”结束函数simParameters = hDeepLearningChanEstSimParameters()以5G信道估计为例,设置深度学习数据综合仿真参数运营商配置simParameters。Carrier = nrCarrierConfig;simParameters.Carrier.NSizeGrid = 51;资源块数量的带宽%(在30 kHz SCS下为20 MHz BW提供51个RBs)simParameters.Carrier.SubcarrierSpacing = 30;% 15, 30, 60, 120, 240 (kHz)simParameters.Carrier.CyclicPrefix =“正常”%“正常”或“扩展”(扩展CP仅适用于60 kHz SCS)simParameters.Carrier.NCellID = 2;细胞标识发送和接收天线数量%simParameters。NTxAnts = 1;% PDSCH传输天线个数simParameters。NRxAnts = 1;UE接收天线数量%% PDSCH和DM-RS配置simParameters。PDSCH = nrPDSCHConfig;simParameters.PDSCH.PRBSet = 0: simparameters . carrier . nsizgrid -1;% PDSCH PRB分配simParameters.PDSCH.SymbolAllocation = [0, simParameters.Carrier.SymbolsPerSlot];% PDSCH符号分配在每个插槽simParameters.PDSCH.MappingType =“一个”% PDSCH映射类型('A'(插槽),'B'(非插槽))simParameters.PDSCH.NID = simParameters.Carrier.NCellID;simParameters.PDSCH.RNTI = 1;simParameters.PDSCH.VRBToPRBInterleaving = 0;禁用交叉资源映射simParameters.PDSCH.NumLayers = 1;% PDSCH传输层数simParameters.PDSCH.Modulation =16 qam的' qpsk ', ' 16qam ', ' 64qam ', ' 256qam '% DM-RS配置simParameters.PDSCH.DMRS.DMRSPortSet = 0:simParameters.PDSCH.NumLayers-1;% DM-RS端口用于层simparameters . pdsch . dmrs . dmrstypeposition = 2;仅支持映射类型A。第一个DM-RS符号位置(2,3)simParameters.PDSCH.DMRS.DMRSLength = 1;前装DM-RS符号的百分比(1(单符号),2(双符号))simParameters.PDSCH.DMRS.DMRSAdditionalPosition = 1;%额外的DM-RS符号位置(最大范围0…3)simParameters.PDSCH.DMRS.DMRSConfigurationType = 2;% DM-RS配置类型(1,2)simParameters.PDSCH.DMRS.NumCDMGroupsWithoutData = 1;%没有数据的CDM组数simParameters.PDSCH.DMRS.NIDNSCID = 1;%置乱标识(0…65535)simParameters.PDSCH.DMRS.NSCID = 0;%置乱初始化(0,1)结束函数plotChEstimates (interpChannelGrid estChannelGrid、estChannelGridNN estChannelGridPerfect,...interp_mse、practical_mse neural_mse)绘制不同通道估计并显示测量的MSE图subplot(1,4,1) imagesc(abs(interpChannelGrid));包含(OFDM符号的);ylabel (副载波的);标题({线性插值的, (“MSE:”num2str (interp_mse)]});次要情节(1,4,2)显示亮度图像(abs (estChannelGrid));包含(OFDM符号的);ylabel (副载波的);标题({实际的估计量的, (“MSE:”num2str (practical_mse)]});次要情节(1,4,3)显示亮度图像(abs (estChannelGridNN));包含(OFDM符号的);ylabel (副载波的);标题({“神经网络”, (“MSE:”num2str (neural_mse)]});次要情节(1,4,4)显示亮度图像(abs (estChannelGridPerfect));包含(OFDM符号的);ylabel (副载波的);标题({“实际通道”});结束

另请参阅

功能

相关的话题