主要内容

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

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

介绍

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

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

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

使用5G工具箱,您可以自定义并生成标准兼容波形和通道模型,以用作培训数据。使用深度学习工具箱,您可以使用此训练数据来训练信道估计。此示例显示如何生成此类训练数据以及如何训练信道估计CNN。该示例还显示了如何使用信道估计CNN处理包含线性插值接收导频符号的图像。通过将神经网络信道估计器的结果与实际和完美的估计器进行比较,该示例得出结论。

神经网络训练

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

  • 数据生成

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

  • 定义CNN架构

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

  • 培训网络

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

trainModel = false;

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

数据生成设置为生成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,大约每个历元5次。当验证丢失停止改善时,停止训练。在本例中,由于数据集较小,验证数据大小与单个小批量的大小相同。

返回的信道估计CNN根据不同的信道配置进行训练,基于不同的时延扩展、多普勒频移和信噪比范围在0到10 dB之间。

%设置随机种子的重现性(如果GPU是,这没有影响%(已使用)rng (42)如果trainModel%生成训练数据[trainData, trainLabels] = hGenerateTrainingData (256);%设置每个小批量的示例数批量大小=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:结束);每个epoch大约验证5次valFrequency=圆形(尺寸(列车数据,4)/批次尺寸/5);定义CNN结构层=[...imageInputLayer ([612 14 1],“正常化”“没有”64年)convolution2dLayer(9日,“填充”64年,4)reluLayer convolution2dLayer(5日,“填充”2,“NumChannels”64年,64年)reluLayer convolution2dLayer(5日,“填充”2,“NumChannels”32岁的,64)reluLayer convolution2dLayer (5“填充”2,“NumChannels”,64)reluLayer卷积2层(5,1,“填充”2,“NumChannels”32) regressionLayer];制定培训政策选择= trainingOptions (“亚当”...“InitialLearnRate”3的军医,...“MaxEpochs”,5,...“洗牌”“every-epoch”...“冗长”假的,...“阴谋”“训练进步”...“MiniBatchSize”batchSize,...“ValidationData”{valData, valLabels},...“ValidationFrequency”valFrequency,...“验证耐心”5);%训练网络。保存的结构训练信息包含%培训进度,以便日后检查。这个结构是有用的%不同优化方法的最优收敛速度比较%的方法。[channelEstimationCNN, trainingInfo] = trainNetwork (trainData,...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 '卷积1 5 x5x32旋转步[1]和填充[2 2 2 2]11“regressionoutput”回归的输出均方误差响应“响应”

为仿真创建信道模型

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

SNRdB = 10;

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

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

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

频道= nrTDLChannel;通道。种子= 0;通道。DelayProfile =“TDL-A”;通道。DelaySpread = 3 e;通道。MaximumDopplerShift = 50;%本示例仅支持SISO配置金宝appchannel.NumTransmitAntennas=1;channel.numreceive天线=1;波形信息=nrOFDMInfo(载波);channel.SampleRate=波形信息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索引和符号dmrsSymbols = nrPDSCHDMRS(载体、pdsch);dmrsIndices = nrPDSCHDMRSIndices(载体、pdsch);%创建资源网格pdschGrid = nrResourceGrid(载体);%将PDSCH DM-RS符号映射到网格pdschGrid (dmrsIndices) = dmrsSymbols;ofdm -调制相关资源元素%txWaveform = nrOFDMModulate(载体、pdschGrid);

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

txWaveform=[txWaveform;零(maxChDelay,大小(txWaveform,2))];

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

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

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

信噪比= 10 ^ (SNRdB / 10);计算线性信噪比N0 = 1 /√(2.0 * simParameters.NRxAnts *双(waveformInfo.Nfft) *信噪比);噪音= N0 *复杂(randn(大小(rxWaveform)), randn(大小(rxWaveform)));rx波形= rx波形+噪声;

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

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

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

rxGrid = nrOFDMDemodulate(载体、rxWaveform);%如果一个不完整的槽已经被解调,用零填充网格[K, L R] =大小(rxGrid);如果(L < carrier.SymbolsPerSlot) rxGrid = cat(2,rxGrid,zeros(K,carrier.SymbolsPerSlot-L,R));结束

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

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

为了实现完美的信道估计,使用nrPerfectChannelEstimate函数使用信道提供的路径增益值。

pathGains estChannelGridPerfect = nrPerfectChannelEstimate(载体,...抵消,pathFilters sampleTimes);

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

[estChannelGrid, ~] = nrChannelEstimate(载体、rxGrid dmrsIndices,...dmrsSymbols,“CDM长度”, pdsch.DMRS.CDMLengths);

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

%使用导频符号位置插入接收的资源网格interpChannelGrid=HPR输入(rxGrid、dmrsIndices、dmrsSymbols);%沿批次维度连接实栅格和虚栅格nnInput =猫(4、真实(interpChannelGrid),图像放大(interpChannelGrid));使用神经网络估计信道estChannelGridNN =预测(channelEstimationCNN nnInput);%转换结果为复杂estChannelGridNN =复杂(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. 叶浩,李晔,庄炳煌。深度学习在OFDM系统中信道估计和信号检测中的作用。IEEE无线通信通讯7,no。1(2018年2月):114-17。

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

本地函数

函数命令= hPreprocessInput (rxGrid dmrsIndices dmrsSymbols)对网格进行线性插值并将结果输入%神经网络这个辅助函数从中提取DM-RS符号% dmrsIndices接收网格rxGrid中的位置,并执行线性%对提取的导频进行插值。获得导频符号估计值dmrsRx = rxGrid (dmrsIndices);dmrssts = dmrsRx .* conj(dmrsSymbols);在线性插值后创建空网格来填充[rxDMRSGrid, hest] = deal(0 (size(rxGrid)));rxDMRSGrid (dmrsIndices) = dmrsSymbols;%查找给定DMRS配置的行和列坐标[rows,cols] = find(rxDMRSGrid ~= 0);dmrsSubs =[行、关口的(大小(关口)));[l_hest, k_hest] = meshgrid(1:尺寸(命令,2),1:尺寸(命令,1));执行线性插值f = scatteredInterpolant (dmrsSubs (:, 2), dmrsSubs (: 1), dmrsEsts);命令= f (l_hest k_hest);结束函数[trainData, trainLabels] = hGenerateTrainingData (dataSize)%生成用于信道估计的训练数据示例。运行数据大小%创建随机通道配置并通过% ofdm调制固定资源网格,只插入DM-RS符号。%执行完美的定时同步和OFDM解调、提取%导频符号,并在每次迭代时执行线性插值。%使用完美通道信息创建标签数据。这个函数%返回2个数组——训练数据和标签。流(“从数据生成…\ n”%可能的信道配置文件列表delayProfiles = {“TDL-A”“TDL-B”“TDL-C”“TDL-D”“TDL-E”};simParameters = hDeepLearningChanEstSimParameters ();载体= simParameters.Carrier;pdsch = simParameters.PDSCH;%创建通道模型对象nTxAnts = simParameters.NTxAnts;nRxAnts = simParameters.NRxAnts;频道= nrTDLChannel;%信道对象通道。NumTransmitAntennas = nTxAnts;通道。NumReceiveAntennas = nRxAnts;%使用从返回的值%设置通道模型采样率waveformInfo = nrOFDMInfo(载体);通道。SampleRate = waveformInfo.SampleRate;%获取信道多路径的最大延迟采样数%的组件。这个数字是从最大的通道路径计算出来的%延迟和信道滤波器的实现延迟,并且是必需的%刷新通道滤波器以获取接收的信号。chInfo =信息(渠道);maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate)) + chInfo.ChannelFilterDelay;%返回DM-RS索引和符号dmrsSymbols = nrPDSCHDMRS(载体、pdsch);dmrsIndices = nrPDSCHDMRSIndices(载体、pdsch);%创建资源网格网格= nrResourceGrid(载体、nTxAnts);% PDSCH DM-RS预编码和映射[~, dmrsAntIndices] = nrExtractResources (dmrsIndices、网格);网格(dmrsAntIndices) = dmrsSymbols;相关资源元件OFDM调制百分比txWaveform_original = nrOFDMModulate(载体、网格);%获取线性插值器坐标用于神经网络预处理[rows,cols] = find(grid ~= 0);dmrsSubs = [rows, cols, ones(size(cols)))]; / / / / / /命令= 0(大小(网格));[l_hest, k_hest] = meshgrid(1:尺寸(命令,2),1:尺寸(命令,1));%预分配记忆训练数据和标签numExamples = dataSize;[trainData, trainLabels] = deal(0 ([612 14 2 numExamples]));用于生成数据的主循环,遍历示例的数量%在函数调用中指定。循环的每次迭代都会产生一个新信道实现与随机延迟扩展,多普勒频移,%和延迟配置文件。每一个被干扰的版本%带有DM-RS符号的波形存储在列车数据中,并且%完美的通道实现在trainLabels。我= 1:numExamples%释放通道以更改不可调优属性channel.release%随机选择一个种子来创建不同的通道实现channel.Seed=randi([1001 2000]);%选择一个随机延迟轮廓,延迟扩展和最大多普勒频移channel.DelayProfile=字符串(delayProfiles(randi([1 numel(delayProfiles)]));channel.DelaySpread=randi([1300])*1e-9;channel.MaximumDopplerShift=randi([5400]);%通过通道模型发送数据。在末尾加0%用于刷新频道内容的传输波形。这些零%考虑信道中引入的任何延迟,例如%多路径延迟和实现延迟。这个值取决于%采样率,延迟分布和延迟扩展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之间信噪比= 10 ^ (SNRdB / 10);计算线性信噪比N0 = 1 /√(2.0 * nRxAnts *双(waveformInfo.Nfft) *信噪比);噪音= N0 *复杂(randn(大小(rxWaveform)), randn(大小(rxWaveform)));rx波形= rx波形+噪声;%完美同步。使用频道提供的信息%查找最强的多路径组件pathFilters = getPathFilters(渠道);获得完美的信道估计路径滤波器(抵消,~)= nrPerfectTimingEstimate (pathGains pathFilters);rx波形= rx波形(1+偏移:结束,:);%对接收到的数据进行OFDM解调,重新创建%资源网格,包括实际情况下的填充%同步导致一个不完整的槽被解调rxGrid = nrOFDMDemodulate(载体、rxWaveform);[K, L R] =大小(rxGrid);如果(L < carrier.SymbolsPerSlot) rxGrid = cat(2,rxGrid,zeros(K,carrier.SymbolsPerSlot-L,R));结束完美信道估计,使用路径增益的值%由频道提供。此信道估计值不适用%包括发射机预编码的影响pathGains estChannelGridPerfect = nrPerfectChannelEstimate(载体,...抵消,pathFilters sampleTimes);%线性插值dmrsRx = rxGrid (dmrsIndices);dmrssts = dmrsRx .* conj(dmrsSymbols);f = scatteredInterpolant (dmrsSubs (:, 2), dmrsSubs (: 1), dmrsEsts);命令= f (l_hest k_hest);将插值网格分割成实的和虚的分量%将它们沿第三维连接起来,以及真信道响应百分比Rx_grid = cat(3, real(hst), imagag (hst)); / /显示图片est_grid = cat(3, real(estChannelGridPerfect)),...imag(完美的);%将生成的训练示例和标签添加到相应的数组中trainData (::,:, i) = rx_grid;trainLabels (::,:, i) = est_grid;%数据生成跟踪器如果mod(i,圆形(numExamples/25))==0 fprintf(“%3.2f%%完成\n”,i/numExamples*100);结束结束流(“数据生成完成!\ 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)显示亮度图像(abs (estChannelGrid));包含(OFDM符号的);ylabel (副载波的);标题({实际的估计量的, (“MSE:”num2str (practical_mse)]});次要情节(1,4,3)显示亮度图像(abs (estChannelGridNN));包含(OFDM符号的);ylabel (副载波的);标题({“神经网络”, (“MSE:”,num2str(neural_mse)]};子批次(1,4,4)图像SC(abs(estChannelGridPerfect));xlabel(OFDM符号的);ylabel (副载波的);标题({“实际通道”});结束

另请参阅

功能

相关的话题