主要内容

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

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

介绍

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

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

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

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

神经网络训练

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

  • 数据生成

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

  • 定义CNN架构

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

  • 培训网络

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

trainModel = FALSE;

如果您安装了Parallel Computing Toolbox™,并设置了支持cuda的NVIDIA®GPU,万博1manbetx则网络训练默认使用GPU加速。的trainNetwork(深度学习工具箱)函数允许您覆盖此默认行为。有关支持的GPU的列表,请参阅万博1manbetxGPU支万博1manbetx持情况(并行计算工具箱).

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

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

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

为确保CNN不会过度拟合训练数据,将训练数据分为验证集和训练集。验证数据用于定期监控训练神经网络的性能,如valFrequency,大约每个epoch 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:结束);trainLabels = trainLabels (:,:,:, batchSize + 1:结束);%每个历元大约验证5次valFrequency =圆(大小(trainData 4) / batchSize / 5);%定义CNN结构层= [...imageInputLayer([612 14 1],“归一化”,“没有”64年)convolution2dLayer(9日,“填充”,4)reluLayer卷积2层(5,64,“填充”2,“NumChannels”,64)reluLayer卷积2层(5,64,“填充”2,“NumChannels”,64)reluLayer convolution2dLayer(5,32,“填充”2,“NumChannels”, 64) reluLayer convolution2dLayer(5、1“填充”2,“NumChannels”32) regressionLayer];%制定培训政策选择= trainingOptions (“亚当”,...“InitialLearnRate”3的军医,...'maxepochs'5,...“洗牌”,“每个历元”,...“详细”,错误的,...“情节”,'培训 - 进步',...“MiniBatchSize”batchSize,...“ValidationData”,{valData,valLabels},...'ValidationFrequency'valFrequency,...“ValidationPatience”,5);%培训网络。保存的结构trainingInfo包含以便稍后进行检查%训练进度。这种结构是有用的比较不同优化方法的最优收敛速度%方法。[channelEstimationCNN, trainingInfo] = trainNetwork (trainData,...trainLabels层,选项);其他的%如果trainModel设置为false,则加载预训练网络加载(“trainedChannelEstimationNetwork.mat”)结束

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

channelEstimationCNN。层
ANS = 11×1层阵列层:1 'imageinput' 图像输入612x14x1图像2 'conv_1' 卷积64个9x9x1卷积步幅[1 1]和填充[4 4 4 4 3 'relu_1' RELU RELU 4 'conv_2' 卷积645x5x64卷积步幅[1 1]和填充[2 2 2 2] 5 'relu_2' RELU RELU 6 'conv_3' 卷积64个5x5x64卷积步幅[1 1]和填充[2 2 2 2] 7 'relu_3' RELU RELU8 'conv_4' 卷积32个5x5x64卷积步幅[1 1]和填充[2 2 2 2] 9 'relu_4' RELU RELU 10 'conv_5' 卷积1个5x5x32卷积步幅[1 1]和填充[2 2 2 2]11“regressionoutput”回归输出均方误差与响应“响应”

对于仿真建立信道模型

设置模拟噪音级别,分贝。有关此示例使用的信噪比定义的解释,请参见SNR定义中使用的链路仿真.

SNRdB=10;

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

simParameters = hDeepLearningChanEstSimParameters ();载体= simParameters.Carrier;pdsch = simParameters.PDSCH;

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

频道= nrTDLChannel;通道。种子= 0;通道。DelayProfile =“TDL-A”;channel.DelaySpread = 3E-7;channel.MaximumDopplerShift = 50;%该实施例仅支持SISO配置万博1manbetx通道。NumTransmitAntennas = 1;通道。NumReceiveAntennas = 1;waveformInfo=nrOFDMInfo(载波);channel.SampleRate=waveformInfo.SampleRate;

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

chInfo =信息(渠道);maxChDelay =小区(MAX(chInfo.PathDelays * channel.SampleRate))+ chInfo.ChannelFilterDelay;

模拟PDSCH DM-RS传输

通过执行这些步骤模拟PDSCH DM-RS发送:

  • 生成资源网格

  • 插入DM-RS符号

  • 执行OFDM调制

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

  • 加上高斯白噪声

  • 执行完美的定时同步

  • 执行OFDM解调

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

%生成DM-RS的索引和符号DMRSSYMBOL=NRPDSCHRS(载波,pdsch);dmrsIndices=NRPDSCHRSDMRSICES(载波,pdsch);创建资源网格pdschGrid = nrResourceGrid(载体);%将PDSCH DM-RS符号映射到网格pdschGrid (dmrsIndices) = dmrsSymbols;ofdm -调制相关资源元素%txWaveform = nrOFDMModulate(载体、pdschGrid);

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

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

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

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

将加性高斯白噪声(AWGN)添加到接收的时域波形中。为了考虑采样率,对噪声功率进行归一化。SNR是为每个接收天线(3GPP TS 38.101-4)的每个资源元素(RE)定义的。有关此示例使用的SNR定义的解释,请参阅SNR定义中使用的链路仿真.

信噪比= 10 ^ (SNRdB / 10);计算线性信噪比N0=1/sqrt(2.0*simParameters.NRxAnts*double(waveformInfo.Nfft)*信噪比);噪声=N0*complex(randn(size(rxWaveform)),randn(size(rxWaveform));rxWaveform=rxWaveform+噪声;

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

获得完美的信道估计路径滤波器pathFilters = getPathFilters(渠道);(抵消,~)= nrPerfectTimingEstimate (pathGains pathFilters);rx波形= rx波形(1+偏移:结束,:);

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

rxGrid = nrOFDMDemodulate(载体、rxWaveform);%垫与壳体零网格的不完整时隙已经被解调[K, L R] =大小(rxGrid);如果(L结束

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

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

为了实现完美的信道估计,使用nrPerfectChannelEstimate使用由所述信道提供的路径增益的值的作用。

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

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

[estChannelGrid, ~] = nrChannelEstimate(载体、rxGrid dmrsIndices,...dmrsSymbols,'CDMLengths', pdsch.DMRS.CDMLengths);

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

%使用导频符号位置插入接收的资源网格interpChannelGrid = hPreprocessInput (rxGrid dmrsIndices dmrsSymbols);沿批尺寸连接实网格和虚网格nnInput =猫(4、真实(interpChannelGrid),图像放大(interpChannelGrid));使用神经网络估计信道estChannelGridNN =预测(channelEstimationCNN nnInput);%转换结果为复杂estChannelGridNN=complex(estChannelGridNN(:,:,:,1),estChannelGridNN(:,:,:,2));

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

neural_mse = mean(abs(estChannelGridPerfect(:) - estchannelgriddnn (:)).^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届车辆技术会议。无线二十一世纪倒计时,1995年7月2:815–19日。

  2. 叶浩,杰弗里叶莉和Biing,黄某壮。“深度学习的信道估计和信号检测OFDM系统中的电源。”IEEE无线通信信7,没有。1(二月2018):114-17。

  3. Soltani, Mehran, Vahid Pourahmadi, Ali Mirzaei,和Hamid Sheikhzadeh。“基于深度学习的信道估计”。预印本,2018年10月13日提交。

本地函数

函数命令= hPreprocessInput (rxGrid dmrsIndices dmrsSymbols)对网格进行线性插值并将结果输入这个辅助函数提取DM-RS符号在接收到的网格rxGrid和执行线性%dmrsIndices位置%插值提取的导频。获得导频符号估计值dmrsRx=rxGrid(dmrsIndices);dmrsEsts=dmrsRx.*conj(dmrsSymbols);%创建空网格线性插值后填写[rxDMRSGrid,HEST] =交易(零(大小(rxGrid)));rxDMRSGrid(dmrsIndices)= dmrsSymbols;%查找给定DMRS配置的行和列坐标[rows,cols] = find(rxDMRSGrid ~= 0);dmrsSubs =[行、关口的(大小(关口)));[l_hest, k_hest] = meshgrid(1:尺寸(命令,2),1:尺寸(命令,1));%执行线性插值f=散射极性(dmrsSubs(:,2),dmrsSubs(:,1),dmrsEsts);hest=f(l_hest,k_hest);结束函数[trainData,trainLabels]=hGenerateTrainingData(数据大小)%生成训练数据的例子的信道估计。运行数据尺寸迭代的数目%创建随机信道配置,并通过一个% ofdm调制固定资源网格,只插入DM-RS符号。%执行完美的定时同步和OFDM解调、提取%导频符号和在每次迭代时执行线性插值。%使用完美通道信息创建标签数据。功能%返回2个阵列 - 训练数据和标签。fprintf(“从数据生成…\ 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;频道= nrTDLChannel;TDL通道对象channel.NumTransmitAntennas=nTxAnts;channel.numreceiveantners=nRxAnts;<:编辑( 'nrOFDMInfo')nrOFDMInfo MATLAB>到%使用值从返回%设置通道模型采样率waveformInfo=nrOFDMInfo(载波);channel.SampleRate=waveformInfo.SampleRate;%获取信道多路径的最大延迟采样数%的组件。这个数字是从最大的通道路径计算出来的%延迟和信道滤波器的实现延迟,并且是必需的%刷新通道滤波器以获取接收的信号。chInfo =信息(渠道);maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate)) + chInfo.ChannelFilterDelay;%返回DM-RS索引和符号DMRSSYMBOL=NRPDSCHRS(载波,pdsch);dmrsIndices=NRPDSCHRSDMRSICES(载波,pdsch);创建资源网格格= nrResourceGrid(载体,nTxAnts);% PDSCH DM-RS预编码和映射[~, dmrsAntIndices] = nrExtractResources (dmrsIndices、网格);网格(dmrsAntIndices) = dmrsSymbols;相关联的资源元素的%OFDM调制txWaveform_original = nrOFDMModulate(载体,网格);%获取用于神经网络预处理的线性插值器坐标[rows,cols]=find(grid~=0);dmrsSubs=[行、列、一(大小(列))];hest=零(大小(网格));[l_hest,k_hest]=meshgrid(1:size(hest,2),1:size(hest,1));%预分配记忆训练数据和标签numExamples =命令datasize;[trainData,trainLabels] =交易(零([612个14 2 numExamples]));%用于数据生成的主循环,迭代示例数%在函数调用中指定。循环的每次迭代都会产生一个%新的信道实现了随机时延扩展,多普勒频移,%和延迟配置文件。每一个被干扰的版本%波形与DM-RS符号存储在trainData中%列车标签中完美的通道实现。我= 1:numExamples%释放信道改变nontunable属性channel.release%随机选择一个种子来创建不同的通道实现通道。种子= randi([1001 2000]);%选择一个随机延迟轮廓,延迟扩展和最大多普勒频移通道。DelayProfile = string(delayProfiles(randi([1 numel(delayProfiles)]))); / /指定一个字符串通道。DelaySpread = randi([1 300])*1e-9;通道。MaximumDopplerShift = randi([5 400]);%通过通道模型发送数据。在末尾加0%用于刷新信道内容的传输波形。这些零%考虑信道中引入的任何延迟,例如%多路径延迟和实现延迟。这个值取决于%采样率、延迟分布和延迟扩展txWaveform = [txWaveform_original;零(maxChDelay,尺寸(txWaveform_original,2))];[rxWaveform,pathGains,sampleTimes] =信道(txWaveform);%将加性高斯白噪声(AWGN)添加到接收的时域%波形。考虑到采样率,规范的噪声功率。%每个接收天线的信噪比按RE定义(3GPP TS 38.101-4)。SNRdB = randi([0 10]);%随机信噪比介于0到10 dB之间信噪比= 10 ^ (SNRdB / 10);计算线性信噪比N0 = 1 / SQRT(2.0 * * nRxAnts双(waveformInfo.Nfft)* SNR);噪声= N0 *复合物(randn(大小(rxWaveform)),randn(大小(rxWaveform)));rxWaveform = rxWaveform +噪声;%完美同步。使用频道提供的信息%以找到最强的多路径组件pathFilters = getPathFilters(渠道);获得完美的信道估计路径滤波器(抵消,~)= nrPerfectTimingEstimate (pathGains pathFilters);rx波形= rx波形(1+偏移:结束,:);%对接收到的数据进行OFDM解调,重新创建%资源网格,其中包括在实际情况下填充%同步导致一个不完整的槽被解调rxGrid = nrOFDMDemodulate(载体、rxWaveform);[K, L R] =大小(rxGrid);如果(L结束%完美信道估计,使用所述路径增益的值%由通道提供。这个信道估计没有%包括发射机预编码的影响estChannelGridPerfect=nrPerfectChannelEstimate(载波、路径增益、,...抵消,pathFilters sampleTimes);%线性插值dmrsRx=rxGrid(dmrsIndices);dmrsEsts=dmrsRx.*conj(dmrsSymbols);f=散射极性(dmrsSubs(:,2),dmrsSubs(:,1),dmrsEsts);hest=f(l_hest,k_hest);将插值网格分割成实的和虚的分量%将它们沿第三维连接起来,以及%真实的信道响应rx_网格=cat(3,真实(最远),imag(最远));est_网格=cat(3,真实(最远),...图像放大(estChannelGridPerfect));%将生成的培训示例和标签添加到相应的阵列中trainData (::,:, i) = rx_grid;trainLabels (::,:, i) = est_grid;数据生成跟踪器如果mod(i,round(numExamples/25)) == 0' % 3.2 f % % \ n的,我/ numExamples * 100);结束结束fprintf(“数据生成完毕!\ n”)结束函数plotChEstimates(interpChannelGrid,estChannelGrid,estChannelGridNN,estChannelGridPerfect,...interp_mse、practical_mse neural_mse)绘制不同信道估计并显示测量的MSE图次要情节(1,4,1)显示亮度图像(abs (interpChannelGrid));包含(“OFDM符号”);ylabel(副载波的);标题({'线性插值', (“MSE:”,num2str(interp_mse)]};子批次(1,4,2)图像SC(abs(estChannelGrid));xlabel(“OFDM符号”);ylabel(副载波的);标题({“实用估计器”, (“MSE:”num2str (practical_mse)]});次要情节(1,4,3)显示亮度图像(abs (estChannelGridNN));包含(“OFDM符号”);ylabel(副载波的);标题({“神经网络”, (“MSE:”num2str (neural_mse)]});次要情节(1,4,4)显示亮度图像(abs (estChannelGridPerfect));包含(“OFDM符号”);ylabel(副载波的);标题({“实际通道”});结束

另请参阅

功能

相关话题