Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

5G チャネル推定用の深層学習データの合成

この例では、Deep Learning Toolbox™、および 5G Toolbox™ で生成されたデータを使用し、チャネル推定用の畳み込みニューラル ネットワーク (CNN) に学習させる方法を示します。物理ダウンリンク共有チャネル (PDSCH) 復調基準信号 (DM-RS) を利用し、学習済みの CNN を使って単入力単出力 (SISO) モードのチャネル推定を実行します。

はじめに

チャネル推定の一般的なアプローチは、既知の基準パイロット シンボルを送信信号に挿入し、このパイロット シンボルを使用してチャネル応答の残りの部分を内挿するというものです。

このチャネル推定アプローチを使用する方法の例については、NR PDSCH スループットを参照してください。

深層学習手法を使用してチャネル推定を実行することもできます。たとえば、リソース グリッドを 2 次元イメージとみなすことで、チャネル推定の問題を CNN が威力を発揮するノイズ除去や超解像化といったイメージ処理の問題に置き換えることができます。

5G Toolbox を使用すると、学習データとして使用できるように、規格に準拠した波形とチャネル モデルをカスタマイズして生成することができます。Deep Learning Toolbox を使用すると、この学習データを使用してチャネル推定 CNN に学習させることができます。この例では、そのような学習データを生成する方法、およびチャネル推定 CNN に学習させる方法を示します。また、この例では、チャネル推定 CNN を使用し、線形補間された受信パイロット シンボルを含むイメージを処理する方法についても示します。この例では、最後に、ニューラル ネットワーク チャネル推定器の結果を可視化し、実用的な推定器および完全な推定器と比較します。

ニューラル ネットワークの学習

ニューラル ネットワークの学習は次の手順で行います。

  • データの生成

  • 生成されたデータから学習セットと検証セットへの分割

  • CNN アーキテクチャの定義

  • 学習オプション、オプティマイザー、学習率の指定

  • ネットワークの学習

信号の数および想定されるシナリオの数が膨大であるため、学習には数分かかることがあります。既定では学習が無効になっており、事前学習済みのモデルが使用されます。学習を有効にするには、trainModel を true に設定します。

trainModel = false;

Parallel Computing Toolbox™ がインストールされており、サポートされている CUDA 対応 NVIDIA® GPU 環境が設定されている場合、ネットワークの学習において GPU による高速化が既定で使用されます。関数trainNetwork (Deep Learning Toolbox)を使用すると、この既定の動作をオーバーライドできます。サポートされている GPU のリストについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。

データの生成では、256 個の学習サンプル (学習データ セット) を生成するように設定します。CPU を使用して妥当な時間内に実用的なチャネル推定ネットワークの学習を行う場合、このデータ量で十分です。参考までに、事前学習済みのモデルは 16,384 個のサンプルを使用しています。

CNN モデルの学習データの次元はサイズが固定されており、このネットワークは 612×14×1 のグリッドのみを受け取ることができます。これは、612 個のサブキャリア、14 個の OFDM シンボル、1 つのアンテナを意味します。そのため、このモデルは、固定の帯域幅割り当て、固定のサイクリック プレフィックス長、および 1 つの受信アンテナでのみ機能します。

この CNN はリソース グリッドを 2 次元イメージとして処理するため、グリッドの各要素は実数でなければなりません。チャネル推定のシナリオでは、リソース グリッドは複素数のデータをもちます。そのため、これらのグリッドの実数部と虚数部を CNN に個別に入力します。この例では、学習データを 612 行 14 列の複素行列から 612×14×2 の実数行列に変換します。ここで、3 番目の次元は実数部と虚数部を表します。この例では、予測を行う際に実数と虚数のグリッドをニューラル ネットワークに個別に入力する必要があるため、学習データを 612×14×1×2N の形式の 4 次元配列に変換します。ここで、N は学習サンプルの数です。

CNN が学習データに過適合するのを確実に防ぐため、学習データを検証セットと学習セットに分割します。検証データは、valFrequency で定義した間隔 (1 エポックあたり約 5 回) で学習済みのニューラル ネットワークのパフォーマンスを定期的に監視するのに使用します。検証損失の改善が止まった時点で学習を停止します。今回の場合、データ セットのサイズが小さいため、検証データのサイズは単一ミニバッチのサイズと同じになります。

さまざまな遅延スプレッド、ドップラー シフト、および 0 ~ 10 dB の SNR 範囲に基づく各種チャネル構成を使用し、返されたチャネル推定 CNN に学習させます。

% 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'             2-D Convolution     64 9x9x1 convolutions with stride [1  1] and padding [4  4  4  4]
     3   'relu_1'             ReLU                ReLU
     4   'conv_2'             2-D Convolution     64 5x5x64 convolutions with stride [1  1] and padding [2  2  2  2]
     5   'relu_2'             ReLU                ReLU
     6   'conv_3'             2-D Convolution     64 5x5x64 convolutions with stride [1  1] and padding [2  2  2  2]
     7   'relu_3'             ReLU                ReLU
     8   'conv_4'             2-D Convolution     32 5x5x64 convolutions with stride [1  1] and padding [2  2  2  2]
     9   'relu_4'             ReLU                ReLU
    10   'conv_5'             2-D Convolution     1 5x5x32 convolutions with stride [1  1] and padding [2  2  2  2]
    11   'regressionoutput'   Regression Output   mean-squared-error with response 'Response'

シミュレーション用のチャネル モデルの作成

シミュレーションのノイズ レベルを dB 単位で設定します。この例で使用している SNR 定義の説明については、リンク シミュレーションで使用する SNR の定義を参照してください。

SNRdB = 10;

PDSCH パラメーターや DM-RS 構成などの事前定義されたシミュレーション パラメーターを読み込みます。

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

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 = chInfo.MaximumChannelDelay;

PDSCH DM-RS の送信のシミュレーション

次の手順を実行し、PDSCH DM-RS の送信をシミュレートします。

  • リソース グリッドの生成

  • DM-RS シンボルの挿入

  • OFDM 変調の実行

  • チャネル モデルを使った変調波形の送信

  • ホワイト ガウス ノイズの付加

  • 完全なタイミング同期の実行

  • OFDM 復調の実行

グリッド内の DM-RS シンボルを使用してチャネルを推定します。この例では何もデータを送信しません。そのため、リソース グリッドには PDSCH シンボルが含まれません。

% Generate DM-RS indices and symbols
dmrsSymbols = nrPDSCHDMRS(carrier,pdsch);
dmrsIndices = nrPDSCHDMRSIndices(carrier,pdsch);

% Create resource grid
pdschGrid = nrResourceGrid(carrier);

% Map PDSCH DM-RS symbols to the grid
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) ごとに SNR を定義します (3GPP TS 38.101-4)。この例で使用している SNR 定義の説明については、リンク シミュレーションで使用する SNR の定義を参照してください。

SNR = 10^(SNRdB/10); % Calculate linear SNR
N0 = 1/sqrt(2.0*simParameters.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',pdsch.DMRS.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. van de Beek, Jan–Jaap, Ove Edfors, Magnus Sandell, Sarah Kate Wilson, and Per Ola Borjesson. “On Channel Estimation in OFDM Systems.” In 1995 IEEE 45th Vehicular Technology Conference. Countdown to the Wireless Twenty–First Century, 2:815–19, July 1995.

  2. Ye, Hao, Geoffrey Ye Li, and Biing-Hwang Juang. “Power of Deep Learning for Channel Estimation and Signal Detection in OFDM Systems.” IEEE Wireless Communications Letters 7, no. 1 (February 2018): 114–17.

  3. Soltani, Mehran, Vahid Pourahmadi, Ali Mirzaei, and Hamid Sheikhzadeh. “Deep Learning–Based Channel Estimation.” Preprint, submitted October 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 resource 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 = hDeepLearningChanEstSimParameters();
    carrier = simParameters.Carrier;
    pdsch = simParameters.PDSCH;

    % 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 channel delay.
    chInfo = info(channel);
    maxChDelay = chInfo.MaximumChannelDelay;

    % Return DM-RS indices and symbols
    dmrsSymbols = nrPDSCHDMRS(carrier,pdsch);
    dmrsIndices = nrPDSCHDMRSIndices(carrier,pdsch);

    % Create resource grid
    grid = nrResourceGrid(carrier,nTxAnts);

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

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

    % Acquire linear interpolator coordinates for neural net preprocessing
    [rows,cols] = find(grid ~= 0);
    dmrsSubs = [rows, cols, ones(size(cols))];
    hest = zeros(size(grid));
    [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/10);    % Calculate linear SNR
        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 simParameters = hDeepLearningChanEstSimParameters()
% Set simulation parameters for Deep Learning Data Synthesis for 5G Channel Estimation example

    % Carrier configuration
    simParameters.Carrier = nrCarrierConfig;
    simParameters.Carrier.NSizeGrid = 51;            % Bandwidth in number of resource blocks (51 RBs at 30 kHz SCS for 20 MHz BW)
    simParameters.Carrier.SubcarrierSpacing = 30;    % 15, 30, 60, 120, 240 (kHz)
    simParameters.Carrier.CyclicPrefix = 'Normal';   % 'Normal' or 'Extended' (Extended CP is relevant for 60 kHz SCS only)
    simParameters.Carrier.NCellID = 2;               % Cell identity

    % Number of transmit and receive antennas
    simParameters.NTxAnts = 1;                      % Number of PDSCH transmission antennas
    simParameters.NRxAnts = 1;                      % Number of UE receive antennas

    % PDSCH and DM-RS configuration
    simParameters.PDSCH = nrPDSCHConfig;
    simParameters.PDSCH.PRBSet = 0:simParameters.Carrier.NSizeGrid-1; % PDSCH PRB allocation
    simParameters.PDSCH.SymbolAllocation = [0, simParameters.Carrier.SymbolsPerSlot];           % PDSCH symbol allocation in each slot
    simParameters.PDSCH.MappingType = 'A';     % PDSCH mapping type ('A'(slot-wise),'B'(non slot-wise))
    simParameters.PDSCH.NID = simParameters.Carrier.NCellID;
    simParameters.PDSCH.RNTI = 1;
    simParameters.PDSCH.VRBToPRBInterleaving = 0; % Disable interleaved resource mapping
    simParameters.PDSCH.NumLayers = 1;            % Number of PDSCH transmission layers
    simParameters.PDSCH.Modulation = '16QAM';                       % 'QPSK', '16QAM', '64QAM', '256QAM'

    % DM-RS configuration
    simParameters.PDSCH.DMRS.DMRSPortSet = 0:simParameters.PDSCH.NumLayers-1; % DM-RS ports to use for the layers
    simParameters.PDSCH.DMRS.DMRSTypeAPosition = 2;      % Mapping type A only. First DM-RS symbol position (2,3)
    simParameters.PDSCH.DMRS.DMRSLength = 1;             % Number of front-loaded DM-RS symbols (1(single symbol),2(double symbol))
    simParameters.PDSCH.DMRS.DMRSAdditionalPosition = 1; % Additional DM-RS symbol positions (max range 0...3)
    simParameters.PDSCH.DMRS.DMRSConfigurationType = 2;  % DM-RS configuration type (1,2)
    simParameters.PDSCH.DMRS.NumCDMGroupsWithoutData = 1;% Number of CDM groups without data
    simParameters.PDSCH.DMRS.NIDNSCID = 1;               % Scrambling identity (0...65535)
    simParameters.PDSCH.DMRS.NSCID = 0;                  % Scrambling initialization (0,1)
end

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

    figure;
    cmax = max(abs([estChannelGrid(:); estChannelGridNN(:); estChannelGridPerfect(:)]));

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

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

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

    subplot(1,4,4)
    imagesc(abs(estChannelGridPerfect));
    xlabel('OFDM Symbol');
    ylabel('Subcarrier');
    title({'Actual Channel'});
    clim([0 cmax]);

end

参考

関数

関連するトピック