主要内容

深度学习数据合成5G信道估计

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

介绍

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

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

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

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

神经网络培训

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

  • 数据生成

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

  • 定义CNN架构

  • 指定培训选项,优化器和学习率

  • 培训网络

由于信号数量和可能的场景,培训可能需要几分钟。默认情况下,禁用培训,使用备用模型。您可以通过设置启用培训TrainModel.为真。

trainmodel = false;

如果安装了并行计算工具箱™,并且支持支持的CUDA的NVIDIA®GPU,则网络培训默认使用GPU加速。金宝app这Trainnetwork.(深度学习工具箱)函数允许您覆盖此默认行为。有关支持的GPU列表,请参阅金宝appGPU版金宝app本支持(并行计算工具箱)

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

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

CNN将资源网格视为2-D图像,因此网格的每个元素必须是实数。在信道估计场景中,资源网格具有复杂的数据。因此,这些网格的真实和虚部被分开输入到CNN。在该示例中,训练数据从复合612×14矩阵转换为真实值的612×14×2矩阵,其中第三维度表示真实和虚部。因为在进行预测时必须单独将真实和虚构的网格分别输入神经网络,所以该示例将训练数据转换为表格612-×14-×1-of-2n的4-d阵列,其中n是训练示例的数量。

为确保CNN没有过度措施,培训数据被分成验证和培训集。验证数据用于监视培训的神经网络的性能,定期定期定义瓦尔法雷,约每纪元5个。当验证损失停止改善时,停止培训。在本例中,由于数据集较小,验证数据大小与单个小批量的大小相同。

返回的信道估计CNN在基于不同的延迟扩展,多普勒频移和0到10dB之间的SNR范围的各种信道配置上培训。

%设置随机种子以进行再现性(如果GPU是没有影响%(已使用)RNG(42)如果TrainModel.%生成培训数据[trainData,trainLabels]=hGenerateTrainingData(256);%设置每个小批量的示例数batchSize = 32;%将真实和虚构的网格分成2个图像集,然后连接TrainData = Cat(4,TrainData(:::1,:),TrainData(::,:,2,:));Trainlabels = Cat(4,Trainlabels(:,:1,:),TrainLabels(:,2,:));%分为培训和验证集valdata = trainData(:::::1:批量化);vallabels = trainlabels(::,:,1:批量化);traindata = traindata(:::,批量化+ 1:结束);TrainLabels = Trainlabels(:::,批量化+ 1:结束);%每纪元大约5次验证valFrequency=圆形(尺寸(列车数据,4)/批次尺寸/5);%定义CNN结构层=[...imageInputLayer ([612 14 1],“正常化”'没有任何')卷积2dlayer(9,64,“填充”,4)Rublayer Convolution2dlayer(5,64,“填充”2,“NumChannels”,64)Ruilulayer卷积2dlayer(5,64,“填充”2,“NumChannels”,64)Rufulayer卷积2dlayer(5,32,“填充”2,“NumChannels”,64)reluLayer卷积2层(5,1,“填充”2,“NumChannels”,32)回归层];%建立培训政策选项=培训选项(“亚当”...'italllearnrate',3e-4,...“MaxEpochs”,5,...“洗牌”“every-epoch”...“冗长”,错误的,...'plots'“训练进步”...“MiniBatchSize”,批量化,...'vightationdata',{valdata,vallabels},...“ValidationFrequency”,瓦尔复克,...“ValidationPatience”5);%培训网络。保存的结构培训信息包含%培训进度,以便日后检查。这个结构是有用的%不同优化方法的最优收敛速度比较% 方法。[channelestimationcnn,traininginfo] = trainnetwork(traindata,...Trainlabels,层数,选项);别的如果TRACTMODEL设置为FALSE,则%加载备用网络负载('trouscanchannelestimationnetwork.mat'结尾

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

channelestimationcnn.layers.
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 '卷积1 5 x5x32旋转步[1]和填充[2 2 2 2]11“regressionoutput”回归的输出均方误差响应“响应”

为仿真创建信道模型

在DB中设置模拟噪声级别。

SNRDB = 10;

加载预定义的模拟参数,包括PDSCH参数和DM-RS配置。返回的对象载体是一个有效的载体配置对象和PDSCH.是用于SISO传输的PDSCH配置结构。

[gnb,carrier,pdsch]=hDeepLearningChanEstSimParameters();

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

channel = nrtdlchannel;channel.seed = 0;channel.delayprofile ='tdl-a';通道。DelaySpread = 3 e;通道。MaximumDopplerShift = 50;%此示例仅支持SISO配置金宝appchannel.NumTransmitAntennas=1;channel.numreceive天线=1;波形信息=nrOFDMInfo(载波);channel.SampleRate=波形信息SampleRate;

通过通道多径组件获取最大延迟样本数。该数字是根据具有最大延迟和信​​道滤波器的实现延迟的通道路径计算的。当获得接收信号时,需要该号码来刷新信道滤波器。

Chinfo = Info(频道);maxchdelay = ceil(max(chinfo.pathdelays * channel.samplerate))+ chinfo.channelfilterdelay;

模拟PDSCH传输

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

  • 生成PDSCH资源网格

  • 插入DM-RS符号

  • 执行OFDM调制

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

  • 添加白色高斯噪音

  • 执行完美的时序同步

  • 执行OFDM解调

%生成DM-RS指数和符号[~, dmrsIndices dmrsSymbols pdschIndicesInfo] = hPDSCHResources (gnb pdsch);%创建PDSCH资源网格pdschGrid = nrResourceGrid(载体);%将PDSCH DM-RS符号映射到网格pdschgrid(dmrsindices)= pdschgrid(dmrsindices)+ dmrssymbols;%OFDM调制相关的资源元素txwaveform = nrofdmodulate(载体,pdschgrid);

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

TX波形=[TX波形;零(最大延迟,大小(TX波形,2));

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

[rxWaveform, pathGains sampleTimes] =通道(txWaveform);

将添加剂白色高斯噪声(AWGN)添加到接收的时域波形。要考虑采样率,使噪声功率正常化。每个Resource元素(RE)定义SNR,每个接收天线(3GPP TS 38.18-4)。

SNR = 10 ^(SNRDB / 20);计算线性噪声增益N0 = 1 /(SQRT(2.0 * Gnb.nrxants * Double(WaveformInfo.nfft)* SNR);噪音= N0 *复杂(randn(大小(rxWaveform)), randn(大小(rxWaveform)));rxwaveform = rxwaveform +噪声;

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

%获取Path滤波器,用于完美的通道估计pathFilters=getPathFilters(通道)[偏移量,~]=nrpertimingestimate(路径增益、路径过滤器);rxWaveform=rxWaveform(1+偏移量:结束,:);

OFDM-解调接收的数据以重建资源网格。

rxgrid = nrofdmdemodulate(载体,rxwaveform);如果已解调不完整的插槽,则用零填充网格[k,l,r] =尺寸(rxgrid);如果(l 结尾

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

您可以执行并比较相同频道模型的完美,实用和神经网络估计的结果。

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

Estchannelgridperfect = NrperfectChannelestimate(承运人,携带载体,...Pathfilters,偏移,采样);

要执行实用的信道估计,请使用nrchannelestimate功能。

[EstchannelGrid,〜] = nrchannelestimate(运营商,rxgrid,dmrsindices,...dmrssymbols,“CDMLengths”,pdschindicsefo.cdmlengths);

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

%使用导频符号位置插入所接收的资源网格interpChannelGrid=HPR输入(rxGrid、dmrsIndices、dmrsSymbols);%沿批次维度连接实栅格和虚栅格nninput = cat(4,真实(interpchannelgrid),imag(interpchannelgrid));%使用神经网络来估计频道EstChannelGridn=预测(channelEstimationCNN,nnInput);%将结果转换为复杂EstchannelGridnnn =复杂的(Estchannelgridnn(:::::1),Estchannelgridnn(::::,2));

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

neural_mse =均值(abs(abs(estchannelgridperfect(:)  -  estchannelgridnnn(:))。^ 2);interp_mse =均值(abs(abs(estchannelgridperfect(:)  -  Interpchannelgrid(:))。^ 2);permanical_mse =均值(abs(abs(estchannelgridperfect(:)  -  estchannelgrid(:))。^ 2);

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

plotChEstimates (interpChannelGrid estChannelGrid、estChannelGridNN estChannelGridPerfect,...Interp_mse,permaning_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. 叶浩,李晔,庄炳煌。深度学习在OFDM系统中信道估计和信号检测中的作用。IEEE无线通信通讯7,no。1(2018年2月):114-17。

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

本地功能

功能hest = hpreprocessinput(rxgrid,dmrsindices,dmrssymbols)%执行网格的线性插值并将结果输入到这个辅助函数提取DM-RS符号% dmrsIndices接收网格rxGrid中的位置,并执行线性%对提取的导频进行插值。%获得导频符号估计dmrsrx = rxgrid(dmrsindices);dmrsests = dmrsrx。*结合(dmrssymbols);在线性插值后创建空网格来填充[rxDMRSGrid, hest] = deal(0 (size(rxGrid)));rxDMRSGrid (dmrsIndices) = dmrsSymbols;%查找给定DMRS配置的行和列坐标[行,cols] =查找(rxdmrsgrid〜= 0);dmrssubs = [行,cols,one(大小(cols))];[l_hest,k_hest] = meshgrid(1:size(hest,2),1:size(hest,1));%执行线性插值f =散射interpolant(dmrssubs(:,2),dmrssubs(:,1),dmrsests);hest = f(l_hest,k_hest);结尾功能[TrainData,TrainLabels] = HggeneratetrationData(数据化)%生成频道估计的培训数据示例%运行数据化迭代的数量以创建随机通道配置%并通过DM-RS符号通过OFDM调制的固定PDSCH网格%插入。实现完美的定时同步和OFDM解调,%提取导频符号并对每个符号进行线性插值%迭代。使用完美的频道信息来创建%标签数据。函数返回2个数组-训练数据和标签。fprintf('开始数据生成... \ n'%可能的信道配置文件列表delayprofiles = {'tdl-a''tdl-b''tdl-c''tdl-d''tdl-e'};[SimParameters,Carrier,PDSCH] = HDEEPLEARNINGNCHANESTSIMPARMERES();%创建通道模型对象nTxAnts=simParameters.nTxAnts;nRxAnts=simParameters.nRxAnts;信道=NRTDL信道;%信道对象channel.numtransmitantennas = ntxants;channel.numreceiveantennas = nrxants;%使用从返回的值%设置频道模型采样率waveforminfo = nrofdminfo(载体);Channel.Samplerve = WaveformInfo.Sampleate;%通过通道多径获得最大延迟样本数% 成分。此号码由具有最大的通道路径计算%延迟和通道过滤器的实现延迟,是必需的刷新信道滤波器以获得接收信号。Chinfo = Info(频道);maxchdelay = ceil(max(chinfo.pathdelays * channel.samplerate))+ chinfo.channelfilterdelay;%返回DM-RS索引和符号[~,dmrsIndices,dmrsSymbols,~]=hPDSCHResources(simParameters,pdsch);与PDSCH传输周期相关联的网格中的%PDSCH映射pdschGrid=nrResourceGrid(运营商,nTxAnts);%PDSCH DM-RS预编码和映射[~,dmrsantidices]=nRectractResources(dmrsIndices,pdschGrid);pdschGrid(DMRSantidices)=pdschGrid(DMRSantidices)+dmrsSymbols;相关资源元件OFDM调制百分比txWaveform_original=nrOFDMModulate(载波,pdschGrid);%获取用于神经网络预处理的线性插值器坐标[行,cols] =查找(pdschgrid〜= 0);dmrssubs = [行,cols,one(大小(cols))];hest = zeros(尺寸(pdschgrid));[l_hest,k_hest] = meshgrid(1:size(hest,2),1:size(hest,1));%预先利用培训数据和标签的内存numExamples = dataSize;[trainData, trainLabels] = deal(0 ([612 14 2 numExamples]));数据生成的%主循环,迭代示例的数量%在函数调用中指定。循环的每次迭代都会产生一个新信道实现与随机延迟扩展,多普勒频移,%和延迟配置文件。每个扰动版本的传输版本%带有DM-RS符号的波形存储在列车数据中,并且Trainlabels中的%完美渠道实现。为了i = 1:numexamples%释放通道以更改不可调优属性Channel.Release.%选择一个随机种子来创建不同的频道实现channel.Seed=randi([1001 2000]);%选择随机延迟配置文件,延迟扩展和最大多普勒换档channel.delayprofile =string(delayProfiles(randi([1 numel(delayProfiles)]))); channel.DelaySpread = randi([1 300])*1e-9; channel.MaximumDopplerShift = randi([5 400]);%通过频道模型发送数据。在结束时附加零%用于刷新频道内容的传输波形。这些零%考虑到频道中引入的任何延迟,例如%多径延迟和实现延迟。此值取决于%采样率,延迟配置文件和延迟传播txWaveform = [txWaveform_original;0 (maxChDelay、尺寸(txWaveform_original 2)));[rxWaveform, pathGains sampleTimes] =通道(txWaveform);%将添加剂白色高斯噪声(AWGN)添加到接收的时域%波形。要考虑采样率,使噪声功率正常化。%SNR是针对每个接收天线(3GPP TS 38.101-4)的每RE定义的。snrdb = randi([0 10]);%随机SNR值介于0和10 dB之间SNR = 10 ^(SNRDB / 20);计算线性噪声增益N0 = 1 /(√(2.0 * nRxAnts *双(waveformInfo.Nfft)) *信噪比);噪音= N0 *复杂(randn(大小(rxWaveform)), randn(大小(rxWaveform)));rxwaveform = rxwaveform +噪声;%完美的同步。使用频道提供的信息%以找到最强的多路径组件pathfilters = getpathfilters(频道);%获取Path滤波器,用于完美的通道估计[offset,〜] = nrperfecttimingestimate(pathgains,pathfilters);rxwaveform = rxwaveform(1 + offset:结束,:);%在接收数据上执行OFDM解调以重新创建%资源网格,包括实际情况下的填充%同步导致不完整的插槽被解调rxgrid = nrofdmdemodulate(载体,rxwaveform);[k,l,r] =尺寸(rxgrid);如果(l 结尾完美信道估计,使用路径增益的值%由频道提供。此信道估计值不适用%包括发射器预编码的效果Estchannelgridperfect = NrperfectChannelestimate(承运人,携带载体,...Pathfilters,偏移,采样);%线性插值dmrsrx = rxgrid(dmrsindices);dmrsests = dmrsrx。*结合(dmrssymbols);f =散射interpolant(dmrssubs(:,2),dmrssubs(:,1),dmrsests);hest = f(l_hest,k_hest);%将内插网格分成真实和虚部的组件%沿第三维度连接,以及%真实频道响应rx_grid = cat(3,真实(hest),imag(hest));est_grid =猫(3,真实(Estchannelgridperfect),...imag(完美的);%将生成的训练示例和标签添加到相应的数组TRAINDATA(::::,i)= rx_grid;TrainLabels(::,:,i)= est_grid;%数据生成跟踪器如果mod(i,round(numExamples/25)) == 0' % 3.2 f % % \ n的,i/numExamples*100);结尾结尾fprintf('数据生成完整!\ n'结尾功能plotChEstimates (interpChannelGrid estChannelGrid、estChannelGridNN estChannelGridPerfect,...interp_mse,plusital_mse,neural_mse)%绘制不同的信道估计并显示测量的MSE图形子图(1,4,1)ImageC(ABS(InterpChannElgrid));Xlabel('OFDM符号');ylabel ('subcarrier');标题({线性插值的,['MSE:',num2str(Interp_mse)]});子图(1,4,2)ImageC(ABS(EstchannelGrid));Xlabel('OFDM符号');ylabel ('subcarrier');标题({'实用估算器',['MSE:',num2str(permanical_mse)]});子图(1,4,3)ImageC(ABS(EstchannelGridnn));Xlabel('OFDM符号');ylabel ('subcarrier');标题({'神经网络',['MSE:',num2str(neural_mse)]};子批次(1,4,4)图像SC(abs(estChannelGridPerfect));xlabel('OFDM符号');ylabel ('subcarrier');标题({'实际频道'});结尾

也可以看看

功能