Синтез данных о глубоком обучении для оценки канала 5G

В этом примере показано, как обучить сверточную нейронную сеть (CNN) оценке канала с помощью Deep Learning Toolbox™ и данных, сгенерированных с 5G Toolbox™. Используя обученный CNN, вы выполняете оценку канала режим одно входа одно выхода (SISO), используя физический нисходящий канал совместно использованный канал (PDSCH) опорный сигнал демодуляции (DM-RS).

Введение

Общий подход, чтобы образовать канал оценка должен вставить известные ссылочные экспериментальные символы в передачу и затем интерполировать остальную часть ответа канала при помощи этих экспериментальных символов.

Для примера, показывающего, как использовать этот подход оценки канала, смотрите Пропускную способность NR PDSCH.

Можно также использовать методы глубокого обучения, чтобы выполнить оценку канала. Например, путем просмотра сетки ресурса PDSCH как 2D изображение, можно превратить проблему оценки канала в проблему обработки изображений, похожую на шумоподавление или суперразрешение, где CNNs являются эффективными.

Используя 5G Toolbox, можно настроить и сгенерировать стандартно-совместимые формы волны и модели канала, чтобы использовать в качестве обучающих данных. Используя Deep Learning Toolbox, можно использовать это обучающие данные, чтобы обучить CNN оценки канала. В этом примере показано, как сгенерировать такие обучающие данные и как обучить CNN оценки канала. Пример также показывает, как использовать CNN оценки канала, чтобы обработать изображения, которые содержат линейно интерполированные полученные экспериментальные символы. Пример завершает путем визуализации результатов средства оценки канала нейронной сети по сравнению с практическими и совершенными средствами оценки.

Обучение нейронной сети

Обучение нейронной сети состоит из этих шагов:

  • Генерация данных

  • Разделение сгенерированных данных в наборы обучения и валидации

  • Определение архитектуры CNN

  • Задавая опции обучения, оптимизатор и скорость обучения

  • Обучение сети

Из-за большого количества сигналов и возможных сценариев, обучение может занять несколько минут. По умолчанию обучение отключено, предварительно обученная модель используется. Можно включить обучение установкой trainModel к истине.

trainModel = false;

Обучайтесь на графическом процессоре, если вы доступны. Это требует Parallel Computing Toolbox™, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Можно изменить это путем установки опций обучения при вызове trainNetwork (Deep Learning Toolbox) функция.

Генерация данных собирается произвести 256 учебных примеров или обучающие наборы данных. Этот объем данных достаточен, чтобы обучить функциональную сеть оценки канала на центральном процессоре в соответствующее время. Для сравнения предварительно обученная модель основана на 16 384 учебных примерах.

Обучающие данные модели CNN имеют размерность фиксированного размера, сеть может только принять 612 14 1 сеткой, i.e. 612 поднесущих, 14 символов OFDM и 1 антенна. Поэтому модель может только работать с фиксированным выделением пропускной способности, длиной циклического префикса, и сингл получает антенну.

CNN обрабатывает сетки ресурса как 2D изображения, следовательно каждым элементом сетки должно быть вещественное число. В сценарии оценки канала сетки ресурса имеют комплексные данные. Поэтому действительные и мнимые части этих сеток вводятся отдельно к CNN. В этом примере обучающие данные преобразованы от комплекса 612 14 матрица в 612 с действительным знаком 14 2 матрицами, где третья размерность обозначает действительные и мнимые компоненты. Поскольку необходимо ввести действительные и мнимые сетки в нейронную сеть отдельно при создании предсказаний, пример преобразует обучающие данные в 4-D массивы формы 612 14 1 2N, где N является количеством учебных примеров.

Чтобы гарантировать, что CNN не сверхсоответствует обучающим данным, обучающие данные разделены в валидацию и наборы обучающих данных. Данные о валидации используются для контроля эффективности обученной нейронной сети равномерно, как задано valFrequency, приблизительно 5 в эпоху. Остановите обучение, когда потеря валидации прекратит улучшаться. В этом экземпляре размер данных валидации совпадает с размером одного мини-пакета из-за небольшого размера набора данных.

Возвращенный CNN оценки канала обучен на различных настройках канала на основе различных распространений задержки, эффектов Доплера и областей значений ОСШ между 0 и 10 дБ.

% Set the random seed for reproducibility (this has no effect if a GPU is
% used)
rng(42)

if trainModel
    % Generate the training data
    [trainData,trainLabels] = hGenerateTrainingData(256);

    % Set the number of examples per mini-batch
    batchSize = 32;

    % Split real and imaginary grids into 2 image sets, then concatenate
    trainData = cat(4,trainData(:,:,1,:),trainData(:,:,2,:));
    trainLabels = cat(4,trainLabels(:,:,1,:),trainLabels(:,:,2,:));

    % Split into training and validation sets
    valData = trainData(:,:,:,1:batchSize);
    valLabels = trainLabels(:,:,:,1:batchSize);

    trainData = trainData(:,:,:,batchSize+1:end);
    trainLabels = trainLabels(:,:,:,batchSize+1:end);

    % Validate roughly 5 times every epoch
    valFrequency = round(size(trainData,4)/batchSize/5);

    % Define the CNN structure
    layers = [ ...
        imageInputLayer([612 14 1],'Normalization','none')
        convolution2dLayer(9,64,'Padding',4)
        reluLayer
        convolution2dLayer(5,64,'Padding',2,'NumChannels',64)
        reluLayer
        convolution2dLayer(5,64,'Padding',2,'NumChannels',64)
        reluLayer
        convolution2dLayer(5,32,'Padding',2,'NumChannels',64)
        reluLayer
        convolution2dLayer(5,1,'Padding',2,'NumChannels',32)
        regressionLayer
    ];

    % Set up a training policy
    options = trainingOptions('adam', ...
        'InitialLearnRate',3e-4, ...
        'MaxEpochs',5, ...
        'Shuffle','every-epoch', ...
        'Verbose',false, ...
        'Plots','training-progress', ...
        'MiniBatchSize',batchSize, ...
        'ValidationData',{valData, valLabels}, ...
        'ValidationFrequency',valFrequency, ...
        'ValidationPatience',5);

    % Train the network. The saved structure trainingInfo contains the
    % training progress for later inspection. This structure is useful for
    % comparing optimal convergence speeds of different optimization
    % methods.
    [channelEstimationCNN,trainingInfo] = trainNetwork(trainData, ...
        trainLabels,layers,options);

else
    % Load pretrained network if trainModel is set to false
    load('trainedChannelEstimationNetwork.mat')
end

Смотрите состав и отдельные слои модели. Модель имеет 5 сверточных слоев. Входной слой ожидает матрицы размера 612 14, где 612 количество поднесущих, и 14 количество символов OFDM. Каждым элементом является вещественное число, поскольку действительные и мнимые части комплексных сеток вводятся отдельно.

channelEstimationCNN.Layers
ans = 

  11x1 Layer array with layers:

     1   'imageinput'         Image Input         612x14x1 images
     2   'conv_1'             Convolution         64 9x9x1 convolutions with stride [1  1] and padding [4  4  4  4]
     3   'relu_1'             ReLU                ReLU
     4   'conv_2'             Convolution         64 5x5x64 convolutions with stride [1  1] and padding [2  2  2  2]
     5   'relu_2'             ReLU                ReLU
     6   'conv_3'             Convolution         64 5x5x64 convolutions with stride [1  1] and padding [2  2  2  2]
     7   'relu_3'             ReLU                ReLU
     8   'conv_4'             Convolution         32 5x5x64 convolutions with stride [1  1] and padding [2  2  2  2]
     9   'relu_4'             ReLU                ReLU
    10   'conv_5'             Convolution         1 5x5x32 convolutions with stride [1  1] and padding [2  2  2  2]
    11   'regressionoutput'   Regression Output   mean-squared-error with response 'Response'

Создайте модель канала для симуляции

Установите уровень шума симуляции в дБ.

SNRdB = 10;

Загрузите предопределенные параметры симуляции, включая параметры PDSCH и настройку DM-RS. Возвращенный объект carrier допустимый объект настройки поставщика услуг и pdsch набор конфигурационной структуры PDSCH для передачи SISO.

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

Создайте модель канала TDL и установите параметры канала. Чтобы сравнить различные ответы канала средств оценки, можно изменить эти параметры позже.

channel = nrTDLChannel;
channel.Seed = 0;
channel.DelayProfile = 'TDL-A';
channel.DelaySpread = 3e-7;
channel.MaximumDopplerShift = 50;

% This example supports only SISO configuration
channel.NumTransmitAntennas = 1;
channel.NumReceiveAntennas = 1;

waveformInfo = nrOFDMInfo(carrier);
channel.SampleRate = waveformInfo.SampleRate;

Получите максимальное количество задержанных выборок каналом многопутевой компонент. Этот номер вычисляется от пути к каналу с самой большой задержкой и задержкой реализации фильтра канала. Этот номер необходим, чтобы сбросить фильтр канала при получении полученного сигнала.

chInfo = info(channel);
maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate))+chInfo.ChannelFilterDelay;

Симулируйте передачу PDSCH

Симулируйте передачу PDSCH путем выполнения этих шагов:

  • Сгенерируйте сетку ресурса PDSCH

  • Вставьте символы DM-RS

  • Выполните модуляцию OFDM

  • Отправьте модулируемую форму волны через модель канала

  • Добавьте белый Гауссов шум

  • Выполните совершенную временную синхронизацию

  • Выполните демодуляцию OFDM

% Generate DM-RS indices and symbols
[~,dmrsIndices,dmrsSymbols,pdschIndicesInfo] = hPDSCHResources(gnb,pdsch);

% Create PDSCH resource grid
pdschGrid = nrResourceGrid(carrier);

% Map PDSCH DM-RS symbols to the grid
pdschGrid(dmrsIndices) = pdschGrid(dmrsIndices)+dmrsSymbols;

% OFDM-modulate associated resource elements
txWaveform = nrOFDMModulate(carrier,pdschGrid);

Чтобы сбросить содержимое канала, добавьте нули в конце переданной формы волны. Эти нули учитывают любую задержку, введенную в канале, такой как многопутевые и задержку реализации. Количество нулей зависит от частоты дискретизации, профиля задержки и распространения задержки.

txWaveform = [txWaveform; zeros(maxChDelay,size(txWaveform,2))];

Отправьте данные через модель канала TDL.

[rxWaveform,pathGains,sampleTimes] = channel(txWaveform);

Добавьте аддитивный белый Гауссов шум (AWGN) в полученную форму волны временного интервала. Чтобы учесть частоту дискретизации, нормируйте шумовую степень. ОСШ задан на элемент ресурса (RE) для каждого, получают антенну (3GPP TS 38.101-4).

SNR = 10^(SNRdB/20); % Calculate linear noise gain
N0 = 1/(sqrt(2.0*gnb.NRxAnts*double(waveformInfo.Nfft))*SNR);
noise = N0*complex(randn(size(rxWaveform)),randn(size(rxWaveform)));
rxWaveform = rxWaveform + noise;

Выполните совершенную синхронизацию. Чтобы найти самый сильный многопутевой компонент, используйте информацию, предоставленную каналом.

% Get path filters for perfect channel estimation
pathFilters = getPathFilters(channel);
[offset,~] = nrPerfectTimingEstimate(pathGains,pathFilters);

rxWaveform = rxWaveform(1+offset:end, :);

OFDM-демодулируйте полученные данные, чтобы воссоздать сетку ресурса.

rxGrid = nrOFDMDemodulate(carrier,rxWaveform);

% Pad the grid with zeros in case an incomplete slot has been demodulated
[K,L,R] = size(rxGrid);
if (L < carrier.SymbolsPerSlot)
    rxGrid = cat(2,rxGrid,zeros(K,carrier.SymbolsPerSlot-L,R));
end

Сравните и визуализируйте различные оценки канала

Можно выполнить и сравнить результаты совершенных, практических оценок, и нейронной сети той же модели канала.

Чтобы выполнить совершенную оценку канала, используйте nrPerfectChannelEstimate функция с помощью значения усилений пути, обеспеченных каналом.

estChannelGridPerfect = nrPerfectChannelEstimate(carrier,pathGains, ...
    pathFilters,offset,sampleTimes);

Чтобы выполнить практическую оценку канала, используйте nrChannelEstimate функция.

[estChannelGrid,~] = nrChannelEstimate(carrier,rxGrid,dmrsIndices, ...
    dmrsSymbols,'CDMLengths',pdschIndicesInfo.CDMLengths);

Чтобы выполнить оценку канала с помощью нейронной сети, необходимо интерполировать полученную сетку. Затем разделите интерполированное изображение в его действительные и мнимые части и введите эти изображения вместе в нейронную сеть как единый пакет. Используйте predict (Deep Learning Toolbox) функция, чтобы сделать предсказания на действительных и мнимых изображениях. Наконец, конкатенируйте и преобразуйте результаты назад в комплексные данные.

% Interpolate the received resource grid using pilot symbol locations
interpChannelGrid = hPreprocessInput(rxGrid,dmrsIndices,dmrsSymbols);

% Concatenate the real and imaginary grids along the batch dimension
nnInput = cat(4,real(interpChannelGrid),imag(interpChannelGrid));

% Use the neural network to estimate the channel
estChannelGridNN = predict(channelEstimationCNN,nnInput);

% Convert results to complex
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. ван де Бик, Ян-Яап, Ове Эдфорс, Магнус Сэнделл, Сара Кейт Вильсон, и На Олу Борджессона. “На Оценке Канала Системы OFDM”. В 1 995 IEEE 45-я Автомобильная Технологическая Конференция. Countdown к Беспроводному Двадцать первому веку, 2:815–19, июлю 1995.

  2. Вы, Хао, Джеффри Е Ли и Биинг-Хван Джуэнг. “Степень Глубокого обучения для Оценки Канала и Обнаружения Сигнала в Системах OFDM”. Буквы Радиосвязей IEEE 7, № 1 (февраль 2018): 114–17.

  3. Soltani, Mehran, Вахид Поурамади, Али Мирзэеи и Хамид Шейхзэдех. “Основанная на глубоком обучении Оценка Канала”. Предварительно распечатайте, представленный 13 октября 2018.

Локальные функции

function hest = hPreprocessInput(rxGrid,dmrsIndices,dmrsSymbols)
% Perform linear interpolation of the grid and input the result to the
% neural network This helper function extracts the DM-RS symbols from
% dmrsIndices locations in the received grid rxGrid and performs linear
% interpolation on the extracted pilots.

    % Obtain pilot symbol estimates
    dmrsRx = rxGrid(dmrsIndices);
    dmrsEsts = dmrsRx .* conj(dmrsSymbols);

    % Create empty grids to fill after linear interpolation
    [rxDMRSGrid, hest] = deal(zeros(size(rxGrid)));
    rxDMRSGrid(dmrsIndices) = dmrsSymbols;

    % Find the row and column coordinates for a given DMRS configuration
    [rows,cols] = find(rxDMRSGrid ~= 0);
    dmrsSubs = [rows,cols,ones(size(cols))];
    [l_hest,k_hest] = meshgrid(1:size(hest,2),1:size(hest,1));

    % Perform linear interpolation
    f = scatteredInterpolant(dmrsSubs(:,2),dmrsSubs(:,1),dmrsEsts);
    hest = f(l_hest,k_hest);

end

function [trainData,trainLabels] = hGenerateTrainingData(dataSize)
% Generate training data examples for channel estimation
% Run dataSize number of iterations to create random channel configurations
% and pass an OFDM-modulated fixed PDSCH grid with only the DM-RS symbols
% inserted. Perform perfect timing synchronization and OFDM demodulation,
% extracting the pilot symbols and performing linear interpolation at each
% iteration. Use perfect channel information to create the
% label data. The function returns 2 arrays - the training data and labels.

    fprintf('Starting data generation...\n')

    % List of possible channel profiles
    delayProfiles = {'TDL-A', 'TDL-B', 'TDL-C', 'TDL-D', 'TDL-E'};

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

    % Create the channel model object
    nTxAnts = simParameters.NTxAnts;
    nRxAnts = simParameters.NRxAnts;

    channel = nrTDLChannel; % TDL channel object
    channel.NumTransmitAntennas = nTxAnts;
    channel.NumReceiveAntennas = nRxAnts;

    % Use the value returned from <matlab:edit('nrOFDMInfo') nrOFDMInfo> to
    % set the channel model sample rate
    waveformInfo = nrOFDMInfo(carrier);
    channel.SampleRate = waveformInfo.SampleRate;

    % Get the maximum number of delayed samples by a channel multipath
    % component. This number is calculated from the channel path with the largest
    % delay and the implementation delay of the channel filter, and is required
    % to flush the channel filter to obtain the received signal.
    chInfo = info(channel);
    maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate)) + chInfo.ChannelFilterDelay;

    % Return DM-RS indices and symbols
    [~,dmrsIndices,dmrsSymbols,~] = hPDSCHResources(simParameters,pdsch);

    % PDSCH mapping in grid associated with PDSCH transmission period
    pdschGrid = nrResourceGrid(carrier,nTxAnts);

    % PDSCH DM-RS precoding and mapping
    [~,dmrsAntIndices] = nrExtractResources(dmrsIndices,pdschGrid);
    pdschGrid(dmrsAntIndices) = pdschGrid(dmrsAntIndices) + dmrsSymbols;

    % OFDM modulation of associated resource elements
    txWaveform_original = nrOFDMModulate(carrier,pdschGrid);

    % Acquire linear interpolator coordinates for neural net preprocessing
    [rows,cols] = find(pdschGrid ~= 0);
    dmrsSubs = [rows, cols, ones(size(cols))];
    hest = zeros(size(pdschGrid));
    [l_hest,k_hest] = meshgrid(1:size(hest,2),1:size(hest,1));

    % Preallocate memory for the training data and labels
    numExamples = dataSize;
    [trainData, trainLabels] = deal(zeros([612 14 2 numExamples]));

    % Main loop for data generation, iterating over the number of examples
    % specified in the function call. Each iteration of the loop produces a
    % new channel realization with a random delay spread, doppler shift,
    % and delay profile. Every perturbed version of the transmitted
    % waveform with the DM-RS symbols is stored in trainData, and the
    % perfect channel realization in trainLabels.
    for i = 1:numExamples
        % Release the channel to change nontunable properties
        channel.release

        % Pick a random seed to create different channel realizations
        channel.Seed = randi([1001 2000]);

        % Pick a random delay profile, delay spread, and maximum doppler shift
        channel.DelayProfile = string(delayProfiles(randi([1 numel(delayProfiles)])));
        channel.DelaySpread = randi([1 300])*1e-9;
        channel.MaximumDopplerShift = randi([5 400]);

        % Send data through the channel model. Append zeros at the end of
        % the transmitted waveform to flush channel content. These zeros
        % take into account any delay introduced in the channel, such as
        % multipath delay and implementation delay. This value depends on
        % the sampling rate, delay profile, and delay spread
        txWaveform = [txWaveform_original; zeros(maxChDelay, size(txWaveform_original,2))];
        [rxWaveform,pathGains,sampleTimes] = channel(txWaveform);

        % Add additive white Gaussian noise (AWGN) to the received time-domain
        % waveform. To take into account sampling rate, normalize the noise power.
        % The SNR is defined per RE for each receive antenna (3GPP TS 38.101-4).
        SNRdB = randi([0 10]);  % Random SNR values between 0 and 10 dB
        SNR = 10^(SNRdB/20);    % Calculate linear noise gain
        N0 = 1/(sqrt(2.0*nRxAnts*double(waveformInfo.Nfft))*SNR);
        noise = N0*complex(randn(size(rxWaveform)),randn(size(rxWaveform)));
        rxWaveform = rxWaveform + noise;

        % Perfect synchronization. Use information provided by the channel
        % to find the strongest multipath component
        pathFilters = getPathFilters(channel); % Get path filters for perfect channel estimation
        [offset,~] = nrPerfectTimingEstimate(pathGains,pathFilters);

        rxWaveform = rxWaveform(1+offset:end, :);

        % Perform OFDM demodulation on the received data to recreate the
        % resource grid, including padding in case practical
        % synchronization results in an incomplete slot being demodulated
        rxGrid = nrOFDMDemodulate(carrier,rxWaveform);
        [K,L,R] = size(rxGrid);
        if (L < carrier.SymbolsPerSlot)
            rxGrid = cat(2,rxGrid,zeros(K,carrier.SymbolsPerSlot-L,R));
        end

        % Perfect channel estimation, using the value of the path gains
        % provided by the channel. This channel estimate does not
        % include the effect of transmitter precoding
        estChannelGridPerfect = nrPerfectChannelEstimate(carrier,pathGains, ...
            pathFilters,offset,sampleTimes);

        % Linear interpolation
        dmrsRx = rxGrid(dmrsIndices);
        dmrsEsts = dmrsRx .* conj(dmrsSymbols);
        f = scatteredInterpolant(dmrsSubs(:,2),dmrsSubs(:,1),dmrsEsts);
        hest = f(l_hest,k_hest);

        % Split interpolated grid into real and imaginary components and
        % concatenate them along the third dimension, as well as for the
        % true channel response
        rx_grid = cat(3, real(hest), imag(hest));
        est_grid = cat(3, real(estChannelGridPerfect), ...
            imag(estChannelGridPerfect));

        % Add generated training example and label to the respective arrays
        trainData(:,:,:,i) = rx_grid;
        trainLabels(:,:,:,i) = est_grid;

        % Data generation tracker
        if mod(i,round(numExamples/25)) == 0
            fprintf('%3.2f%% complete\n',i/numExamples*100);
        end
    end
    fprintf('Data generation complete!\n')
end

function plotChEstimates(interpChannelGrid,estChannelGrid,estChannelGridNN,estChannelGridPerfect,...
                         interp_mse,practical_mse,neural_mse)
% Plot the different channel estimates and display the measured MSE

    figure

    subplot(1,4,1)
    imagesc(abs(interpChannelGrid));
    xlabel('OFDM Symbol');
    ylabel('Subcarrier');
    title({'Linear Interpolation', ['MSE: ', num2str(interp_mse)]});

    subplot(1,4,2)
    imagesc(abs(estChannelGrid));
    xlabel('OFDM Symbol');
    ylabel('Subcarrier');
    title({'Practical Estimator', ['MSE: ', num2str(practical_mse)]});

    subplot(1,4,3)
    imagesc(abs(estChannelGridNN));
    xlabel('OFDM Symbol');
    ylabel('Subcarrier');
    title({'Neural Network', ['MSE: ', num2str(neural_mse)]});

    subplot(1,4,4)
    imagesc(abs(estChannelGridPerfect));
    xlabel('OFDM Symbol');
    ylabel('Subcarrier');
    title({'Actual Channel'});
end

Смотрите также

Функции