Main Content

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

NR PUSCH スループット

この参照シミュレーションでは、3GPP NR 規格で定義されているように、5G New Radio (NR) リンクの物理アップリンク共有チャネル (PUSCH) のスループットを測定する方法を示します。この例では、PUSCH とアップリンク トランスポート チャネル (UL-SCH) を実装します。送信機モデルには、PUSCH 復調基準信号 (DM-RS) が含まれます。この例では、クラスター遅延線 (CDL) とタップ付き遅延線 (TDL) の両方の伝播チャネルをサポートします。完全な同期と完全なチャネル推定、あるいは実用的な同期と実用的なチャネル推定を実行できます。シミュレーションの合計時間を短縮するために、Parallel Computing Toolbox™ を使用して、SNR ループの SNR 点を並列に処理できます。

はじめに

この例では、3GPP NR 規格 [ 1 ]、[ 2 ]、[ 3 ]、[ 4 ] で定義されているように、5G リンクの PUSCH スループットを測定します。

この例では、次の 5G NR の機能をモデル化します。

  • UL-SCH トランスポート チャネル符号化

  • PUSCH と PUSCH DM-RS の生成

  • 可変サブキャリア間隔とフレーム numerology (2^n * 15 kHz)

  • ノーマル サイクリック プレフィックスと拡張サイクリック プレフィックス

  • TDL と CDL の伝播チャネル モデル

シミュレーションのその他の機能は、次のとおりです。

  • コードブック ベースおよび非コードブック ベースの PUSCH トランスミッション スキーム

  • オプションの PUSCH トランスフォーム プリコーディング

  • スロット単位および非スロット単位での PUSCH と DM-RS のマッピング

  • 完全な同期と完全なチャネル推定、あるいは実用的な同期と実用的なチャネル推定

  • 16 個のプロセスを使用する HARQ 操作

次の図は、実装される処理チェーンを示しています。わかりやすくするために、DM-RS の生成は省略しています。

この例には、チャネル条件に応じた MIMO プリコーディングの閉ループ適用が含まれていないことに注意してください。この例で使用する PUSCH MIMO プリコーディングは以下のとおりです。

  • コードブック ベースの送信の場合、PUSCH 変調の内部で使用される MIMO プリコーディング行列は、TPMI パラメーターを使用して選択できる。

  • 実装固有の MIMO プリコーディング行列 (非コードブック ベースの送信の場合、またはコードブック ベースの送信で送信アンテナ ポートとアンテナの間で MIMO プリコーディングを行う場合) は、単位行列になる。

シミュレーションの合計を短縮するために、Parallel Computing Toolbox を使用して、SNR ループの SNR 点を並列に処理できます。

シミュレーションの長さと SNR 点

シミュレーションの長さを 10 ms のフレームの数で設定します。有意なスループットの結果を得るためには、多数の NFrame を使用する必要があります。シミュレーションを行うための SNR 点を設定します。SNR は RE ごとに定義され、それぞれの受信アンテナに適用されます。この例で使用している SNR 定義の説明については、リンク シミュレーションで使用する SNR の定義を参照してください。

simParameters = struct();       % Clear simParameters variable to contain all key simulation parameters
simParameters.NFrames = 2;      % Number of 10 ms frames
simParameters.SNRIn = [-5 0 5]; % SNR range (dB)

チャネル推定器の構成

logical 変数 PerfectChannelEstimator は、チャネル推定と同期の動作を制御します。true に設定すると、完全なチャネル推定と同期が使用されます。それ以外の場合、受信した PUSCH DM-RS の値に基づいて、実用的なチャネル推定と同期が使用されます。

simParameters.PerfectChannelEstimator = true;

シミュレーション診断

変数 DisplaySimulationInformation は、各サブフレームに使用される HARQ プロセス ID などのシミュレーション情報の表示を制御します。CRC エラーの場合、RV シーケンスへのインデックスの値も表示されます。

simParameters.DisplaySimulationInformation = true;

DisplayDiagnostics フラグは、レイヤーごとの EVM のプロットを有効にします。このプロットは、イコライズ後の受信信号の品質を監視します。レイヤーごとの EVM の Figure は以下を表示します。

  • スロット単位でのレイヤーごとの EVM。これは時間とともに変化する EVM を表示します。

  • リソース ブロック単位でのレイヤーごとの EVM。これは EVM の周波数を示します。

この Figure はシミュレーションとともに変化し、スロットごとに更新されます。通常、低い SNR またはチャネル フェージングは、信号品質の低下 (高 EVM) につながる可能性があります。チャネルは各レイヤーに異なる影響を与えるため、EVM 値はレイヤー間で異なる場合があります。

場合によっては、一部のレイヤーの EVM が他のレイヤーよりもはるかに高くなることがあります。そのような低品質のレイヤーは、CRC エラーを引き起こす可能性があります。この動作は、SNR が低いか、チャネル条件に対して使用するレイヤーが多すぎることが原因である可能性があります。この状況は、SNR を高くし、レイヤー数を減らし、アンテナ数を増やし、送信の堅牢性を高める (変調スキームとターゲット符号化率を低くする) ことを組み合わせることで回避できます。

simParameters.DisplayDiagnostics = false;

キャリアと PUSCH の構成

シミュレーションの主なパラメーターを設定します。これには、次が含まれます。

  • リソース ブロックの帯域幅 (リソース ブロックごとに 12 個のサブキャリア)

  • サブキャリア間隔: 15、30、60、120 (kHz)

  • サイクリック プレフィックス長: normal または extended

  • セル ID

  • 送信アンテナ数と受信アンテナ数

UL-SCH と PUSCH のパラメーターを含むサブ構造体も指定します。これには、次が含まれます。

  • ターゲット符号化率

  • 割り当て済みリソース ブロック数 (PRBSet)

  • 変調スキーム: 'pi/2-BPSK'、'QPSK'、'16QAM'、'64QAM'、'256QAM'

  • レイヤーの数

  • トランスフォーム プリコーディング (有効/無効)

  • PUSCH トランスミッション スキームと MIMO のプリコーディング行列指標 (TPMI)

  • アンテナ ポート数

  • PUSCH マッピング タイプ

  • DM-RS 構成パラメーター

その他のシミュレーション全体のパラメーターは、次のとおりです。

  • 伝播チャネル モデル遅延プロファイル (TDL または CDL)

トランスフォーム プリコーディングが有効な場合は、レイヤーの数を 1 に設定する必要があることに注意してください。

% Set waveform type and PUSCH numerology (SCS and CP type)
simParameters.Carrier = nrCarrierConfig;        % Carrier resource grid configuration
simParameters.Carrier.NSizeGrid = 52;           % Bandwidth in number of resource blocks (52 RBs at 15 kHz SCS for 10 MHz BW)
simParameters.Carrier.SubcarrierSpacing = 15;   % 15, 30, 60, 120 (kHz)
simParameters.Carrier.CyclicPrefix = 'Normal';  % 'Normal' or 'Extended' (Extended CP is relevant for 60 kHz SCS only)
simParameters.Carrier.NCellID = 0;              % Cell identity

% PUSCH/UL-SCH parameters
simParameters.PUSCH = nrPUSCHConfig;      % This PUSCH definition is the basis for all PUSCH transmissions in the BLER simulation
simParameters.PUSCHExtension = struct();  % This structure is to hold additional simulation parameters for the UL-SCH and PUSCH

% Define PUSCH time-frequency resource allocation per slot to be full grid (single full grid BWP)
simParameters.PUSCH.PRBSet =  0:simParameters.Carrier.NSizeGrid-1; % PUSCH PRB allocation
simParameters.PUSCH.SymbolAllocation = [0,simParameters.Carrier.SymbolsPerSlot]; % PUSCH symbol allocation in each slot
simParameters.PUSCH.MappingType = 'A'; % PUSCH mapping type ('A'(slot-wise),'B'(non slot-wise))

% Scrambling identifiers
simParameters.PUSCH.NID = simParameters.Carrier.NCellID;
simParameters.PUSCH.RNTI = 1;

% Define the transform precoding enabling, layering and transmission scheme
simParameters.PUSCH.TransformPrecoding = false; % Enable/disable transform precoding
simParameters.PUSCH.NumLayers = 1;              % Number of PUSCH transmission layers
simParameters.PUSCH.TransmissionScheme = 'nonCodebook'; % Transmission scheme ('nonCodebook','codebook')
simParameters.PUSCH.NumAntennaPorts = 1;        % Number of antenna ports for codebook based precoding
simParameters.PUSCH.TPMI = 0;                   % Precoding matrix indicator for codebook based precoding

% Define codeword modulation
simParameters.PUSCH.Modulation = 'QPSK'; % 'pi/2-BPSK', 'QPSK', '16QAM', '64QAM', '256QAM'

% PUSCH DM-RS configuration
simParameters.PUSCH.DMRS.DMRSTypeAPosition = 2;       % Mapping type A only. First DM-RS symbol position (2,3)
simParameters.PUSCH.DMRS.DMRSLength = 1;              % Number of front-loaded DM-RS symbols (1(single symbol),2(double symbol))
simParameters.PUSCH.DMRS.DMRSAdditionalPosition = 1;  % Additional DM-RS symbol positions (max range 0...3)
simParameters.PUSCH.DMRS.DMRSConfigurationType = 1;   % DM-RS configuration type (1,2)
simParameters.PUSCH.DMRS.NumCDMGroupsWithoutData = 2; % Number of CDM groups without data
simParameters.PUSCH.DMRS.NIDNSCID = 0;                % Scrambling identity (0...65535)
simParameters.PUSCH.DMRS.NSCID = 0;                   % Scrambling initialization (0,1)
simParameters.PUSCH.DMRS.NRSID = 0;                   % Scrambling ID for low-PAPR sequences (0...1007)
simParameters.PUSCH.DMRS.GroupHopping = 0;            % Group hopping (0,1)
simParameters.PUSCH.DMRS.SequenceHopping = 0;         % Sequence hopping (0,1)

% Additional simulation and UL-SCH related parameters
%
% Target code rate
simParameters.PUSCHExtension.TargetCodeRate = 193 / 1024; % Code rate used to calculate transport block size
%
% HARQ process and rate matching/TBS parameters
simParameters.PUSCHExtension.XOverhead = 0;       % Set PUSCH rate matching overhead for TBS (Xoh)
simParameters.PUSCHExtension.NHARQProcesses = 16; % Number of parallel HARQ processes to use
simParameters.PUSCHExtension.EnableHARQ = true;   % Enable retransmissions for each process, using RV sequence [0,2,3,1]

% LDPC decoder parameters
% Available algorithms: 'Belief propagation', 'Layered belief propagation', 'Normalized min-sum', 'Offset min-sum'
simParameters.PUSCHExtension.LDPCDecodingAlgorithm = 'Normalized min-sum';
simParameters.PUSCHExtension.MaximumLDPCIterationCount = 6;

% Define the overall transmission antenna geometry at end-points
% If using a CDL propagation channel then the integer number of antenna elements is
% turned into an antenna panel configured when the channel model object is created
simParameters.NTxAnts = 1; % Number of transmit antennas
simParameters.NRxAnts = 2; % Number of receive antennas

% Define the general CDL/TDL propagation channel parameters
simParameters.DelayProfile = 'TDL-A'; % Use TDL-A model (Indoor hotspot model)
simParameters.DelaySpread = 30e-9;
simParameters.MaximumDopplerShift = 10;

% Cross-check the PUSCH layering against the channel geometry
validateNumLayers(simParameters);

このシミュレーションは、サンプル レートなどのベースバンド波形に関するさまざまな情報に依存しています。

waveformInfo = nrOFDMInfo(simParameters.Carrier); % Get information about the baseband waveform after OFDM modulation step

伝播チャネル モデルの構築

シミュレーション用のチャネル モデル オブジェクトを作成します。CDL と TDL の両方のチャネル モデルをサポートします [ 5 ]。

% Constructed the CDL or TDL channel model object
if contains(simParameters.DelayProfile,'CDL','IgnoreCase',true)

    channel = nrCDLChannel; % CDL channel object

    % Swap transmit and receive sides as the default CDL channel is
    % configured for downlink transmissions.
    swapTransmitAndReceive(channel);

    % Turn the number of antennas into antenna panel array layouts. If
    % NRxAnts is not one of (1,2,4,8,16,32,64,128,256,512,1024), its value
    % is rounded up to the nearest value in the set. If NTxAnts is not 1 or
    % even, its value is rounded up to the nearest even number.
    channel = hArrayGeometry(channel,simParameters.NTxAnts,simParameters.NRxAnts,'uplink');
    simParameters.NTxAnts = prod(channel.TransmitAntennaArray.Size);
    simParameters.NRxAnts = prod(channel.ReceiveAntennaArray.Size);
else
    channel = nrTDLChannel; % TDL channel object

    % Swap transmit and receive sides as the default TDL channel is
    % configured for downlink transmissions
    swapTransmitAndReceive(channel);

    % Set the channel geometry
    channel.NumTransmitAntennas = simParameters.NTxAnts;
    channel.NumReceiveAntennas = simParameters.NRxAnts;
end

% Assign simulation channel parameters and waveform sample rate to the object
channel.DelayProfile = simParameters.DelayProfile;
channel.DelaySpread = simParameters.DelaySpread;
channel.MaximumDopplerShift = simParameters.MaximumDopplerShift;
channel.SampleRate = waveformInfo.SampleRate;

最大チャネル遅延を取得します。

chInfo = info(channel);
maxChDelay = chInfo.MaximumChannelDelay;

処理ループ

各 SNR 点でのスループットを測定するために、以下の手順に従って、送信インスタンスごとの PUSCH データを解析します。

  • 現在の HARQ プロセスの更新。提供された HARQ プロセスの送信ステータスをチェックし、再送が必要かどうかを決定します。そうでない場合は、新しいデータを生成します。

  • リソース グリッドの生成。チャネル符号化は、nrULSCHによって実行されます。指定された入力のトランスポート ブロックに対して動作します。再送が必要な場合はトランスポート ブロックのコピーを内部的に保持します。符号化されたビットは、nrPUSCHによって変調されます。結果として得られた信号に実装固有の MIMO プリコーディングを適用します。TxScheme='codebook' の場合、nrPUSCH 内でコードブック ベースの MIMO プリコーディングが適用済みとなるため、実装固有の MIMO プリコーディングが MIMO プリコーディングの追加の段階となることに注意してください。

  • 波形の生成。次に、生成されたグリッドを OFDM 変調します。

  • ノイズを含むチャネルのモデル化。CDL または TDL のフェージング チャネルに波形を渡します。AWGN を付加します。各レイヤーの SNR は、受信アンテナ単位で RE ごとに定義されます。

  • 同期と OFDM 復調の実行。完全な同期では、チャネル インパルス応答を再構築し、それを使用して受信波形を同期させます。実用的な同期では、受信波形と PUSCH DM-RS の相関をとります。次に、同期した信号を OFDM 復調します。

  • チャネル推定の実行。完全なチャネル推定では、チャネル インパルス応答を再構築して OFDM 復調を実行し、チャネル推定を提供します。実用的なチャネル推定では、PUSCH DM-RS を使用します。

  • PUSCH の抽出とイコライズの実行。受信した OFDM リソース グリッドとnrExtractResourcesを使用したチャネル推定に基づいて、PUSCH 割り当てに対応するリソース エレメントを抽出します。次に、受信した PUSCH リソース エレメントを、nrEqualizeMMSEを使用して MMSE イコライズします。

  • PUSCH の復号化。nrPUSCHDecodeを使用して、イコライズされた PUSCH シンボルをノイズ推定とともに復調してデスクランブルし、受信コードワードの推定を取得します。

  • アップリンク共有チャネル (UL-SCH) の復号化およびブロック CRC エラーのある HARQ プロセスの更新。復号化されたソフト ビットのベクトルをnrULSCHDecoderに渡します。これは、コードワードを復号化し、システムのスループットを測定するために使用されるブロック CRC エラーを返します。

% Array to store the maximum throughput for all SNR points
maxThroughput = zeros(length(simParameters.SNRIn),1);
% Array to store the simulation throughput for all SNR points
simThroughput = zeros(length(simParameters.SNRIn),1);

% Set up redundancy version (RV) sequence for all HARQ processes
if simParameters.PUSCHExtension.EnableHARQ
    % From PUSCH demodulation requirements in RAN WG4 meeting #88bis (R4-1814062)
    rvSeq = [0 2 3 1];
else
    % HARQ disabled - single transmission with RV=0, no retransmissions
    rvSeq = 0;
end

% Create UL-SCH encoder System object to perform transport channel encoding
encodeULSCH = nrULSCH;
encodeULSCH.MultipleHARQProcesses = true;
encodeULSCH.TargetCodeRate = simParameters.PUSCHExtension.TargetCodeRate;

% Create UL-SCH decoder System object to perform transport channel decoding
% Use layered belief propagation for LDPC decoding, with half the number of
% iterations as compared to the default for belief propagation decoding
decodeULSCH = nrULSCHDecoder;
decodeULSCH.MultipleHARQProcesses = true;
decodeULSCH.TargetCodeRate = simParameters.PUSCHExtension.TargetCodeRate;
decodeULSCH.LDPCDecodingAlgorithm = simParameters.PUSCHExtension.LDPCDecodingAlgorithm;
decodeULSCH.MaximumLDPCIterationCount = simParameters.PUSCHExtension.MaximumLDPCIterationCount;

for snrIdx = 1:numel(simParameters.SNRIn)    % comment out for parallel computing
% parfor snrIdx = 1:numel(simParameters.SNRIn) % uncomment for parallel computing
% To reduce the total simulation time, you can execute this loop in
% parallel by using the Parallel Computing Toolbox. Comment out the 'for'
% statement and uncomment the 'parfor' statement. If the Parallel Computing
% Toolbox is not installed, 'parfor' defaults to normal 'for' statement.
% Because parfor-loop iterations are executed in parallel in a
% nondeterministic order, the simulation information displayed for each SNR
% point can be intertwined. To switch off simulation information display,
% set the 'displaySimulationInformation' variable above to false

    % Reset the random number generator so that each SNR point will
    % experience the same noise realization
    rng('default');

    % Take full copies of the simulation-level parameter structures so that they are not
    % PCT broadcast variables when using parfor
    simLocal = simParameters;
    waveinfoLocal = waveformInfo;

    % Take copies of channel-level parameters to simplify subsequent parameter referencing
    carrier = simLocal.Carrier;
    pusch = simLocal.PUSCH;
    puschextra = simLocal.PUSCHExtension;
    decodeULSCHLocal = decodeULSCH;  % Copy of the decoder handle to help PCT classification of variable
    decodeULSCHLocal.reset();        % Reset decoder at the start of each SNR point
    pathFilters = [];

    % Create PUSCH object configured for the non-codebook transmission
    % scheme, used for receiver operations that are performed with respect
    % to the PUSCH layers
    puschNonCodebook = pusch;
    puschNonCodebook.TransmissionScheme = 'nonCodebook';

    % Prepare simulation for new SNR point
    SNRdB = simLocal.SNRIn(snrIdx);
    fprintf('\nSimulating transmission scheme 1 (%dx%d) and SCS=%dkHz with %s channel at %gdB SNR for %d 10ms frame(s)\n', ...
        simLocal.NTxAnts,simLocal.NRxAnts,carrier.SubcarrierSpacing, ...
        simLocal.DelayProfile,SNRdB,simLocal.NFrames);

    % Specify the fixed order in which we cycle through the HARQ process IDs
    harqSequence = 0:puschextra.NHARQProcesses-1;

    % Initialize the state of all HARQ processes
    harqEntity = HARQEntity(harqSequence,rvSeq);

    % Reset the channel so that each SNR point will experience the same
    % channel realization
    reset(channel);

    % Total number of slots in the simulation period
    NSlots = simLocal.NFrames * carrier.SlotsPerFrame;

    % Timing offset, updated in every slot for perfect synchronization and
    % when the correlation is strong for practical synchronization
    offset = 0;

    % Loop over the entire waveform length
    for nslot = 0:NSlots-1

        % Update the carrier slot numbers for new slot
        carrier.NSlot = nslot;

        % Calculate the transport block size for the transmission in the slot
        [puschIndices,puschIndicesInfo] = nrPUSCHIndices(carrier,pusch);
        MRB = numel(puschIndicesInfo.PRBSet);
        trBlkSize = nrTBS(pusch.Modulation,pusch.NumLayers,MRB,puschIndicesInfo.NREPerPRB,puschextra.TargetCodeRate,puschextra.XOverhead);

        % HARQ processing
        % If new data for current process then create a new UL-SCH transport block
        if harqEntity.NewData
            trBlk = randi([0 1],trBlkSize,1);
            setTransportBlock(encodeULSCH,trBlk,harqEntity.HARQProcessID);
            % If new data because of previous RV sequence time out then flush decoder soft buffer explicitly
            if harqEntity.SequenceTimeout
                resetSoftBuffer(decodeULSCHLocal,harqEntity.HARQProcessID);
            end
        end

        % Encode the UL-SCH transport block
        codedTrBlock = encodeULSCH(pusch.Modulation,pusch.NumLayers, ...
            puschIndicesInfo.G,harqEntity.RedundancyVersion,harqEntity.HARQProcessID);

        % Create resource grid for a slot
        puschGrid = nrResourceGrid(carrier,simLocal.NTxAnts);

        % PUSCH modulation, including codebook based MIMO precoding if TxScheme = 'codebook'
        puschSymbols = nrPUSCH(carrier,pusch,codedTrBlock);

        % Implementation-specific PUSCH MIMO precoding and mapping. This
        % MIMO precoding step is in addition to any codebook based
        % MIMO precoding done during PUSCH modulation above
        if (strcmpi(pusch.TransmissionScheme,'codebook'))
            % Codebook based MIMO precoding, F precodes between PUSCH
            % transmit antenna ports and transmit antennas
            F = eye(pusch.NumAntennaPorts,simLocal.NTxAnts);
        else
            % Non-codebook based MIMO precoding, F precodes between PUSCH
            % layers and transmit antennas
            F = eye(pusch.NumLayers,simLocal.NTxAnts);
        end
        [~,puschAntIndices] = nrExtractResources(puschIndices,puschGrid);
        puschGrid(puschAntIndices) = puschSymbols * F;

        % Implementation-specific PUSCH DM-RS MIMO precoding and mapping.
        % The first DM-RS creation includes codebook based MIMO precoding if applicable
        dmrsSymbols = nrPUSCHDMRS(carrier,pusch);
        dmrsIndices = nrPUSCHDMRSIndices(carrier,pusch);
        for p = 1:size(dmrsSymbols,2)
            [~,dmrsAntIndices] = nrExtractResources(dmrsIndices(:,p),puschGrid);
            puschGrid(dmrsAntIndices) = puschGrid(dmrsAntIndices) + dmrsSymbols(:,p) * F(p,:);
        end

        % OFDM modulation
        txWaveform = nrOFDMModulate(carrier,puschGrid);

        % Pass data through 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. This is a mix
        % of multipath delay and implementation delay. This value may
        % change depending on the sampling rate, delay profile and delay
        % spread
        txWaveform = [txWaveform; zeros(maxChDelay,size(txWaveform,2))]; %#ok<AGROW>
        [rxWaveform,pathGains,sampleTimes] = channel(txWaveform);

        % Add AWGN to the received time domain waveform
        % Normalize noise power by the IFFT size used in OFDM modulation,
        % as the OFDM modulator applies this normalization to the
        % transmitted waveform. Also normalize by the number of receive
        % antennas, as the channel model applies this normalization to the
        % received waveform, by default
        SNR = 10^(SNRdB/10);
        N0 = 1/sqrt(simLocal.NRxAnts*double(waveinfoLocal.Nfft)*SNR);
        noise = N0*randn(size(rxWaveform),"like",rxWaveform);
        rxWaveform = rxWaveform + noise;

        if (simLocal.PerfectChannelEstimator)
            % Perfect synchronization. Use information provided by the
            % channel to find the strongest multipath component
            pathFilters = getPathFilters(channel);
            [offset,mag] = nrPerfectTimingEstimate(pathGains,pathFilters);
        else
            % Practical synchronization. Correlate the received waveform
            % with the PUSCH DM-RS to give timing offset estimate 't' and
            % correlation magnitude 'mag'. The function
            % hSkipWeakTimingOffset is used to update the receiver timing
            % offset. If the correlation peak in 'mag' is weak, the current
            % timing estimate 't' is ignored and the previous estimate
            % 'offset' is used
            [t,mag] = nrTimingEstimate(carrier,rxWaveform,dmrsIndices,dmrsSymbols);
            offset = hSkipWeakTimingOffset(offset,t,mag);
            % Display a warning if the estimated timing offset exceeds the
            % maximum channel delay
            if offset > maxChDelay
                warning(['Estimated timing offset (%d) is greater than the maximum channel delay (%d).' ...
                    ' This will result in a decoding failure. This may be caused by low SNR,' ...
                    ' or not enough DM-RS symbols to synchronize successfully.'],offset,maxChDelay);
            end
        end
        rxWaveform = rxWaveform(1+offset:end,:);

        % Perform OFDM demodulation on the received data to recreate the
        % resource grid, including padding in the event that 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

        if (simLocal.PerfectChannelEstimator)
            % Perfect channel estimation, use the value of the path gains
            % provided by the channel
            estChannelGrid = nrPerfectChannelEstimate(carrier,pathGains,pathFilters,offset,sampleTimes);

            % Get perfect noise estimate (from the noise realization)
            noiseGrid = nrOFDMDemodulate(carrier,noise(1+offset:end,:));
            noiseEst = var(noiseGrid(:));

            % Apply MIMO deprecoding to estChannelGrid to give an estimate
            % per transmission layer
            K = size(estChannelGrid,1);
            estChannelGrid = reshape(estChannelGrid,K*carrier.SymbolsPerSlot*simLocal.NRxAnts,simLocal.NTxAnts);
            estChannelGrid = estChannelGrid * F.';
            if (strcmpi(pusch.TransmissionScheme,'codebook'))
                W = nrPUSCHCodebook(pusch.NumLayers,pusch.NumAntennaPorts,pusch.TPMI,pusch.TransformPrecoding);
                estChannelGrid = estChannelGrid * W.';
            end
            estChannelGrid = reshape(estChannelGrid,K,carrier.SymbolsPerSlot,simLocal.NRxAnts,[]);
        else
            % Practical channel estimation between the received grid and
            % each transmission layer, using the PUSCH DM-RS for each layer
            % which are created by specifying the non-codebook transmission
            % scheme
            dmrsLayerSymbols = nrPUSCHDMRS(carrier,puschNonCodebook);
            dmrsLayerIndices = nrPUSCHDMRSIndices(carrier,puschNonCodebook);
            [estChannelGrid,noiseEst] = nrChannelEstimate(carrier,rxGrid,dmrsLayerIndices,dmrsLayerSymbols,'CDMLengths',pusch.DMRS.CDMLengths);
        end

        % Get PUSCH resource elements from the received grid
        [puschRx,puschHest] = nrExtractResources(puschIndices,rxGrid,estChannelGrid);

        % Equalization
        [puschEq,csi] = nrEqualizeMMSE(puschRx,puschHest,noiseEst);

        % Decode PUSCH physical channel
        [ulschLLRs,rxSymbols] = nrPUSCHDecode(carrier,puschNonCodebook,puschEq,noiseEst);

        % Display EVM per layer, per slot and per RB. Reference symbols for
        % each layer are created by specifying the non-codebook
        % transmission scheme
        if (simLocal.DisplayDiagnostics)
            refSymbols = nrPUSCH(carrier,puschNonCodebook,codedTrBlock);
            plotLayerEVM(NSlots,nslot,puschNonCodebook,size(puschGrid),puschIndices,refSymbols,puschEq);
        end

        % Apply channel state information (CSI) produced by the equalizer,
        % including the effect of transform precoding if enabled
        if (pusch.TransformPrecoding)
            MSC = MRB * 12;
            csi = nrTransformDeprecode(csi,MRB) / sqrt(MSC);
            csi = repmat(csi((1:MSC:end).'),1,MSC).';
            csi = reshape(csi,size(rxSymbols));
        end
        csi = nrLayerDemap(csi);
        Qm = length(ulschLLRs) / length(rxSymbols);
        csi = reshape(repmat(csi{1}.',Qm,1),[],1);
        ulschLLRs = ulschLLRs .* csi;

        % Decode the UL-SCH transport channel
        decodeULSCHLocal.TransportBlockLength = trBlkSize;
        [decbits,blkerr] = decodeULSCHLocal(ulschLLRs,pusch.Modulation,pusch.NumLayers,harqEntity.RedundancyVersion,harqEntity.HARQProcessID);

        % Store values to calculate throughput
        simThroughput(snrIdx) = simThroughput(snrIdx) + (~blkerr * trBlkSize);
        maxThroughput(snrIdx) = maxThroughput(snrIdx) + trBlkSize;

        % Update current process with CRC error and advance to next process
        procstatus = updateAndAdvance(harqEntity,blkerr,trBlkSize,puschIndicesInfo.G);
        if (simLocal.DisplaySimulationInformation)
            fprintf('\n(%3.2f%%) NSlot=%d, %s',100*(nslot+1)/NSlots,nslot,procstatus);
        end

    end

    % Display the results dynamically in the command window
    if (simLocal.DisplaySimulationInformation)
        fprintf('\n');
    end
    fprintf('\nThroughput(Mbps) for %d frame(s) = %.4f\n',simLocal.NFrames,1e-6*simThroughput(snrIdx)/(simLocal.NFrames*10e-3));
    fprintf('Throughput(%%) for %d frame(s) = %.4f\n',simLocal.NFrames,simThroughput(snrIdx)*100/maxThroughput(snrIdx));

end
Simulating transmission scheme 1 (1x2) and SCS=15kHz with TDL-A channel at -5dB SNR for 2 10ms frame(s)

(5.00%) NSlot=0, HARQ Proc 0: CW0: Initial transmission failed (RV=0,CR=0.190705).
(10.00%) NSlot=1, HARQ Proc 1: CW0: Initial transmission failed (RV=0,CR=0.190705).
(15.00%) NSlot=2, HARQ Proc 2: CW0: Initial transmission failed (RV=0,CR=0.190705).
(20.00%) NSlot=3, HARQ Proc 3: CW0: Initial transmission failed (RV=0,CR=0.190705).
(25.00%) NSlot=4, HARQ Proc 4: CW0: Initial transmission failed (RV=0,CR=0.190705).
(30.00%) NSlot=5, HARQ Proc 5: CW0: Initial transmission failed (RV=0,CR=0.190705).
(35.00%) NSlot=6, HARQ Proc 6: CW0: Initial transmission failed (RV=0,CR=0.190705).
(40.00%) NSlot=7, HARQ Proc 7: CW0: Initial transmission failed (RV=0,CR=0.190705).
(45.00%) NSlot=8, HARQ Proc 8: CW0: Initial transmission failed (RV=0,CR=0.190705).
(50.00%) NSlot=9, HARQ Proc 9: CW0: Initial transmission failed (RV=0,CR=0.190705).
(55.00%) NSlot=10, HARQ Proc 10: CW0: Initial transmission failed (RV=0,CR=0.190705).
(60.00%) NSlot=11, HARQ Proc 11: CW0: Initial transmission failed (RV=0,CR=0.190705).
(65.00%) NSlot=12, HARQ Proc 12: CW0: Initial transmission failed (RV=0,CR=0.190705).
(70.00%) NSlot=13, HARQ Proc 13: CW0: Initial transmission failed (RV=0,CR=0.190705).
(75.00%) NSlot=14, HARQ Proc 14: CW0: Initial transmission failed (RV=0,CR=0.190705).
(80.00%) NSlot=15, HARQ Proc 15: CW0: Initial transmission failed (RV=0,CR=0.190705).
(85.00%) NSlot=16, HARQ Proc 0: CW0: Retransmission #1 passed (RV=2,CR=0.190705).
(90.00%) NSlot=17, HARQ Proc 1: CW0: Retransmission #1 passed (RV=2,CR=0.190705).
(95.00%) NSlot=18, HARQ Proc 2: CW0: Retransmission #1 passed (RV=2,CR=0.190705).
(100.00%) NSlot=19, HARQ Proc 3: CW0: Retransmission #1 passed (RV=2,CR=0.190705).

Throughput(Mbps) for 2 frame(s) = 0.5712
Throughput(%) for 2 frame(s) = 20.0000

Simulating transmission scheme 1 (1x2) and SCS=15kHz with TDL-A channel at 0dB SNR for 2 10ms frame(s)

(5.00%) NSlot=0, HARQ Proc 0: CW0: Initial transmission passed (RV=0,CR=0.190705).
(10.00%) NSlot=1, HARQ Proc 1: CW0: Initial transmission passed (RV=0,CR=0.190705).
(15.00%) NSlot=2, HARQ Proc 2: CW0: Initial transmission passed (RV=0,CR=0.190705).
(20.00%) NSlot=3, HARQ Proc 3: CW0: Initial transmission passed (RV=0,CR=0.190705).
(25.00%) NSlot=4, HARQ Proc 4: CW0: Initial transmission passed (RV=0,CR=0.190705).
(30.00%) NSlot=5, HARQ Proc 5: CW0: Initial transmission passed (RV=0,CR=0.190705).
(35.00%) NSlot=6, HARQ Proc 6: CW0: Initial transmission passed (RV=0,CR=0.190705).
(40.00%) NSlot=7, HARQ Proc 7: CW0: Initial transmission passed (RV=0,CR=0.190705).
(45.00%) NSlot=8, HARQ Proc 8: CW0: Initial transmission passed (RV=0,CR=0.190705).
(50.00%) NSlot=9, HARQ Proc 9: CW0: Initial transmission passed (RV=0,CR=0.190705).
(55.00%) NSlot=10, HARQ Proc 10: CW0: Initial transmission passed (RV=0,CR=0.190705).
(60.00%) NSlot=11, HARQ Proc 11: CW0: Initial transmission passed (RV=0,CR=0.190705).
(65.00%) NSlot=12, HARQ Proc 12: CW0: Initial transmission passed (RV=0,CR=0.190705).
(70.00%) NSlot=13, HARQ Proc 13: CW0: Initial transmission passed (RV=0,CR=0.190705).
(75.00%) NSlot=14, HARQ Proc 14: CW0: Initial transmission passed (RV=0,CR=0.190705).
(80.00%) NSlot=15, HARQ Proc 15: CW0: Initial transmission passed (RV=0,CR=0.190705).
(85.00%) NSlot=16, HARQ Proc 0: CW0: Initial transmission passed (RV=0,CR=0.190705).
(90.00%) NSlot=17, HARQ Proc 1: CW0: Initial transmission passed (RV=0,CR=0.190705).
(95.00%) NSlot=18, HARQ Proc 2: CW0: Initial transmission passed (RV=0,CR=0.190705).
(100.00%) NSlot=19, HARQ Proc 3: CW0: Initial transmission passed (RV=0,CR=0.190705).

Throughput(Mbps) for 2 frame(s) = 2.8560
Throughput(%) for 2 frame(s) = 100.0000

Simulating transmission scheme 1 (1x2) and SCS=15kHz with TDL-A channel at 5dB SNR for 2 10ms frame(s)

(5.00%) NSlot=0, HARQ Proc 0: CW0: Initial transmission passed (RV=0,CR=0.190705).
(10.00%) NSlot=1, HARQ Proc 1: CW0: Initial transmission passed (RV=0,CR=0.190705).
(15.00%) NSlot=2, HARQ Proc 2: CW0: Initial transmission passed (RV=0,CR=0.190705).
(20.00%) NSlot=3, HARQ Proc 3: CW0: Initial transmission passed (RV=0,CR=0.190705).
(25.00%) NSlot=4, HARQ Proc 4: CW0: Initial transmission passed (RV=0,CR=0.190705).
(30.00%) NSlot=5, HARQ Proc 5: CW0: Initial transmission passed (RV=0,CR=0.190705).
(35.00%) NSlot=6, HARQ Proc 6: CW0: Initial transmission passed (RV=0,CR=0.190705).
(40.00%) NSlot=7, HARQ Proc 7: CW0: Initial transmission passed (RV=0,CR=0.190705).
(45.00%) NSlot=8, HARQ Proc 8: CW0: Initial transmission passed (RV=0,CR=0.190705).
(50.00%) NSlot=9, HARQ Proc 9: CW0: Initial transmission passed (RV=0,CR=0.190705).
(55.00%) NSlot=10, HARQ Proc 10: CW0: Initial transmission passed (RV=0,CR=0.190705).
(60.00%) NSlot=11, HARQ Proc 11: CW0: Initial transmission passed (RV=0,CR=0.190705).
(65.00%) NSlot=12, HARQ Proc 12: CW0: Initial transmission passed (RV=0,CR=0.190705).
(70.00%) NSlot=13, HARQ Proc 13: CW0: Initial transmission passed (RV=0,CR=0.190705).
(75.00%) NSlot=14, HARQ Proc 14: CW0: Initial transmission passed (RV=0,CR=0.190705).
(80.00%) NSlot=15, HARQ Proc 15: CW0: Initial transmission passed (RV=0,CR=0.190705).
(85.00%) NSlot=16, HARQ Proc 0: CW0: Initial transmission passed (RV=0,CR=0.190705).
(90.00%) NSlot=17, HARQ Proc 1: CW0: Initial transmission passed (RV=0,CR=0.190705).
(95.00%) NSlot=18, HARQ Proc 2: CW0: Initial transmission passed (RV=0,CR=0.190705).
(100.00%) NSlot=19, HARQ Proc 3: CW0: Initial transmission passed (RV=0,CR=0.190705).

Throughput(Mbps) for 2 frame(s) = 2.8560
Throughput(%) for 2 frame(s) = 100.0000

結果

測定したスループットを表示します。これは、使用可能なリソースを所与とするリンクの最大スループットがデータ伝送に占める割合として計算されます。

figure;
plot(simParameters.SNRIn,simThroughput*100./maxThroughput,'o-.')
xlabel('SNR (dB)'); ylabel('Throughput (%)'); grid on;
if (simParameters.PUSCH.TransformPrecoding)
    ofdmType = 'DFT-s-OFDM';
else
    ofdmType = 'CP-OFDM';
end
title(sprintf('%s / NRB=%d / SCS=%dkHz / %s %d/1024 / %dx%d', ...
    ofdmType,simParameters.Carrier.NSizeGrid,simParameters.Carrier.SubcarrierSpacing, ...
    simParameters.PUSCH.Modulation, ...
    round(simParameters.PUSCHExtension.TargetCodeRate*1024),simParameters.NTxAnts,simParameters.NRxAnts));

% Bundle key parameters and results into a combined structure for recording
simResults.simParameters = simParameters;
simResults.simThroughput = simThroughput;
simResults.maxThroughput = maxThroughput;

次の Figure は、10,000 サブフレーム (NFrames = 1000SNRIn = -16:2:6) のシミュレーションで取得したスループットの結果を示しています。

参考文献

  1. 3GPP TS 38.211. "NR; Physical channels and modulation." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  2. 3GPP TS 38.212. "NR; Multiplexing and channel coding." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  3. 3GPP TS 38.213. "NR; Physical layer procedures for control." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  4. 3GPP TS 38.214. "NR; Physical layer procedures for data." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  5. 3GPP TR 38.901. "Study on channel model for frequencies from 0.5 to 100 GHz." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

ローカル関数

function validateNumLayers(simParameters)
% Validate the number of layers, relative to the antenna geometry

    numlayers = simParameters.PUSCH.NumLayers;
    ntxants = simParameters.NTxAnts;
    nrxants = simParameters.NRxAnts;
    antennaDescription = sprintf('min(NTxAnts,NRxAnts) = min(%d,%d) = %d',ntxants,nrxants,min(ntxants,nrxants));
    if numlayers > min(ntxants,nrxants)
        error('The number of layers (%d) must satisfy NumLayers <= %s', ...
            numlayers,antennaDescription);
    end

    % Display a warning if the maximum possible rank of the channel equals
    % the number of layers
    if (numlayers > 2) && (numlayers == min(ntxants,nrxants))
        warning(['The maximum possible rank of the channel, given by %s, is equal to NumLayers (%d).' ...
            ' This may result in a decoding failure under some channel conditions.' ...
            ' Try decreasing the number of layers or increasing the channel rank' ...
            ' (use more transmit or receive antennas).'],antennaDescription,numlayers); %#ok<SPWRN>
    end

end

function plotLayerEVM(NSlots,nslot,pusch,siz,puschIndices,puschSymbols,puschEq)
% Plot EVM information

    persistent slotEVM;
    persistent rbEVM
    persistent evmPerSlot;

    if (nslot==0)
        slotEVM = comm.EVM;
        rbEVM = comm.EVM;
        evmPerSlot = NaN(NSlots,pusch.NumLayers);
        figure;
    end
    evmPerSlot(nslot+1,:) = slotEVM(puschSymbols,puschEq);
    subplot(2,1,1);
    plot(0:(NSlots-1),evmPerSlot,'o-');
    xlabel('Slot number');
    ylabel('EVM (%)');
    legend("layer " + (1:pusch.NumLayers),'Location','EastOutside');
    title('EVM per layer per slot');

    subplot(2,1,2);
    [k,~,p] = ind2sub(siz,puschIndices);
    rbsubs = floor((k-1) / 12);
    NRB = siz(1) / 12;
    evmPerRB = NaN(NRB,pusch.NumLayers);
    for nu = 1:pusch.NumLayers
        for rb = unique(rbsubs).'
            this = (rbsubs==rb & p==nu);
            evmPerRB(rb+1,nu) = rbEVM(puschSymbols(this),puschEq(this));
        end
    end
    plot(0:(NRB-1),evmPerRB,'x-');
    xlabel('Resource block');
    ylabel('EVM (%)');
    legend("layer " + (1:pusch.NumLayers),'Location','EastOutside');
    title(['EVM per layer per resource block, slot #' num2str(nslot)]);

    drawnow;

end

参考

オブジェクト

関数

関連するトピック