Main Content

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

HARQ を使用した 5G NR トランスポート チャネルのモデル化

この例では、ダウンリンク共有チャネル (DL-SCH) の符号化器と復号化器の 5G Toolbox™ System object を使用し、複数のハイブリッド自動再送要求 (HARQ) プロセスで 5G NR トランスポート チャネルをモデル化する方法を示します。

はじめに

次の図は、5G ダウンリンク リンクのコンテキストのうち、この例においてモデル化されるリンク要素を示しています。その要素は以下のとおりです。

  • DL-SCH の符号化と復号化

  • 物理ダウンリンク共有チャネル (PDSCH) の符号化と復号化

  • HARQ 管理

他のリンク要素は、この例でモデル化されていません。

TrChannelsAndHARQProcChain.png

この例では、AWGN チャネルを使用してブロック エラー レート (BLER) も測定します。次の図は、この例でモデル化されるすべてのリンク要素とそれに続く BLER の計算を示しています。

TrChannelsAndHARQModelDiagram.png

次の図は、DL-SCH 符号化器が内部バッファーを使用して各 HARQ プロセスのトランスポート ブロックを保存し、次にアクティブな HARQ プロセス バッファー コンテンツを選択して符号化することを示しています。DL-SCH 復号化器は、同様のバッファリング メカニズムを使用して、HARQ プロセスを保存および選択します。

TrChannelsAndHARQEncoderDiagram.png

DL-SCH 符号化器および復号化器は、HARQ プロセスを内部的に管理しません。この例では、HARQ プロセスの管理に HARQ エンティティ オブジェクト HARQEntity.m を使用します。次の図は、HARQ エンティティ オブジェクトの構造を示しています。

TrChannelsAndHARQEntity.png

シミュレーション パラメーター

シミュレーションするトランスポート ブロックの数と S/N 比 (SNR) を指定します。

noTransportBlocks = 100;
SNRdB = 7; % SNR in dB

再現性を確保するために乱数発生器をリセットします。

rng("default");

DL-SCH 構成

符号化率、HARQ プロセスの数、および冗長値 (RV) シーケンスを指定します。このシーケンスは、エラーが発生した場合の冗長バージョンの再送信を制御します。

% DL-SCH parameters
codeRate = 490/1024;
NHARQProcesses = 16; % Number of parallel HARQ processes to use
rvSeq = [0 2 3 1];

DL-SCH の符号化器オブジェクトおよび復号化器オブジェクトを作成します。複数のプロセスを使用するには、両方のオブジェクトで MultipleHARQProcesses プロパティを true に設定します。複数の HARQ プロセスで再送信を有効にするために、符号化器は入力ビットをバッファリングします。復号化器でも、各 HARQ プロセスで再送信のソフト結合を有効にする同様のメカニズムが必要です。

% Create DL-SCH encoder object
encodeDLSCH = nrDLSCH;
encodeDLSCH.MultipleHARQProcesses = true;
encodeDLSCH.TargetCodeRate = codeRate;

% Create DL-SCH decoder object
decodeDLSCH = nrDLSCHDecoder;
decodeDLSCH.MultipleHARQProcesses = true;
decodeDLSCH.TargetCodeRate = codeRate;
decodeDLSCH.LDPCDecodingAlgorithm = "Normalized min-sum";
decodeDLSCH.MaximumLDPCIterationCount = 6;

DL-SCH の符号化器オブジェクトおよび復号化器オブジェクトは、最大 16 個の HARQ プロセスをモデル化できます。符号化器および復号化器のオブジェクトは、以下の操作のいずれかを実行するときに、HARQ エンティティ オブジェクトの HARQprocessID プロパティを使用してアクティブな HARQ プロセスを特定します。

  • 送信する新しいトランスポート ブロックの設定

  • データの符号化

  • ソフト バッファーのリセット

  • データの復号化

キャリアと PDSCH の構成

キャリアと PDSCH パラメーターを指定します。これらのパラメーターは、PDSCH の符号化と復号化、およびトランスポート ブロック サイズの計算に使用されます。

サブキャリア間隔 (SCS) と帯域幅 (BW) を指定して、キャリア オブジェクトを作成します。

% Numerology
SCS = 15;                         % SCS: 15, 30, 60, 120 or 240 (kHz)
NRB = 52;                         % BW in number of RBs (52 RBs at 15 kHz SCS for 10 MHz BW)

carrier = nrCarrierConfig;
carrier.NSizeGrid = NRB;
carrier.SubcarrierSpacing = SCS;
carrier.CyclicPrefix = "Normal";  % "Normal" or "Extended"

PDSCH 構成オブジェクトを作成します。PDSCH パラメーターは、使用可能なビット容量とトランスポート ブロック サイズを決定します。

modulation = "16QAM";             % Modulation scheme

pdsch = nrPDSCHConfig;
pdsch.Modulation = modulation;
pdsch.PRBSet = 0:NRB-1;           % Assume full band allocation
pdsch.NumLayers = 1;              % Assume only one layer and one codeword

HARQ 管理

HARQ プロセスを管理する HARQ エンティティ オブジェクトを作成します。HARQ プロセスごとに、オブジェクトは以下の要素を保存します。

  • HARQ ID 番号。

  • RV。

  • 特定のトランスポート ブロックが何回送信されたかを示す送信番号。

  • 新しいデータが必要かどうかを示すフラグ。トランスポート ブロックが正常に受信された場合、またはシーケンス タイムアウトが発生した場合 (すべての RV 送信が失敗した場合) は、新しいデータが必要です。

  • シーケンス タイムアウトが発生した (すべての RV 送信が失敗した) かどうかを示すフラグ。

harqEntity = HARQEntity(0:NHARQProcesses-1,rvSeq,pdsch.NumCodewords);

HARQ エンティティは、DL-SCH 符号化器および復号化器でバッファーを管理するために使用されます。

BER シミュレーション

トランスポート ブロックの数だけループ処理します。各トランスポート ブロックで、次を行います。

  • トランスポート ブロック サイズをビット数で計算。

  • 新しいデータ ブロックを生成するか、復号化器でバッファーをリセット。

  • DL-SCH 符号化を適用。

  • ビットをシンボルに変調。

  • AWGN を適用。

  • ソフト ビットを復調 (シンボルからソフト ビット)。

  • DL-SCH を復号化。

  • HARQ プロセスを更新。

% Initialize loop variables
noiseVar = 1./(10.^(SNRdB/10)); % Noise variance
numBlkErr = 0;                  % Number of block errors
numRxBits = [];                 % Number of successfully received bits per transmission
txedTrBlkSizes = [];            % Number of transmitted info bits per transmission

for nTrBlk = 1:noTransportBlocks
    % A transport block or transmission time interval (TTI) corresponds to
    % one slot
    carrier.NSlot = carrier.NSlot+1;

トランスポート ブロック サイズの計算

トランスポート ブロック サイズを計算します。

    % Generate PDSCH indices info, which is used to calculate the transport
    % block size
    [~,pdschInfo] = nrPDSCHIndices(carrier,pdsch);

    % Calculate transport block sizes
    Xoh_PDSCH = 0;
    trBlkSizes = nrTBS(pdsch.Modulation,pdsch.NumLayers,numel(pdsch.PRBSet),pdschInfo.NREPerPRB,codeRate,Xoh_PDSCH);

ビット単位の PDSCH 容量 pdsch.G は動的に決定されるため、実際の符号化率は、encodeDLSCH オブジェクトの TargetCodeRate プロパティによって指定されるターゲット符号化率と厳密に等しくない場合があります。

HARQ 処理 (バッファー管理)

このセクションでは、符号化器および復号化器でのバッファー管理について説明します。

  • DL-SCH 符号化器バッファー: アクティブな HARQ プロセスに新しいデータが必要な場合は、新しいトランスポート ブロックを生成します。トランスポート ブロックを対応するバッファーに保存します。新しいデータが必要ない場合、DL-SCH 符号化器でバッファリングされたビットが再送信に使用されます。

  • DL-SCH 復号化器バッファー: 受信機のソフト バッファーには、同じトランスポート ブロックの過去に受信済みのバージョンが保存されます。これらのバッファーは、受信が成功 (CRC エラーなし) すると自動的にクリアされます。ただし、復号化に成功せずに RV シーケンスが終了した場合は、オブジェクト関数 resetSoftBuffer を呼び出してバッファーを手動でフラッシュしなければなりません。

    % Get new transport blocks and flush decoder soft buffer, as required
    for cwIdx = 1:pdsch.NumCodewords
        if harqEntity.NewData(cwIdx)
            % Create and store a new transport block for transmission
            trBlk = randi([0 1],trBlkSizes(cwIdx),1);
            setTransportBlock(encodeDLSCH,trBlk,cwIdx-1,harqEntity.HARQProcessID);

            % If the previous RV sequence ends without successful decoding,
            % flush the soft buffer explicitly
            if harqEntity.SequenceTimeout(cwIdx)
                resetSoftBuffer(decodeDLSCH,cwIdx-1,harqEntity.HARQProcessID);
            end
        end
    end

DL-SCH 符号化

DL-SCH トランスポート ブロックを符号化します。

    codedTrBlock = encodeDLSCH(pdsch.Modulation,pdsch.NumLayers,pdschInfo.G, ...
        harqEntity.RedundancyVersion,harqEntity.HARQProcessID);

PDSCH 符号化

PDSCH シンボルを生成します。

    modOut = nrPDSCH(carrier,pdsch,codedTrBlock);

AWGN チャネル

ホワイト ガウス ノイズを付加します。

    rxSig = awgn(modOut,SNRdB);    

PDSCH 復調

受信したシンボルを軟復調します。

    rxLLR = nrPDSCHDecode(carrier,pdsch,rxSig,noiseVar);

DL-SCH 復号化

DL-SCH 復号化を適用します。

    decodeDLSCH.TransportBlockLength = trBlkSizes;
    [decbits,blkerr] = decodeDLSCH(rxLLR,pdsch.Modulation,pdsch.NumLayers, ...
        harqEntity.RedundancyVersion,harqEntity.HARQProcessID);

結果

結果を保存して BLER を計算します。

    % Store values to calculate throughput (only for active transport blocks)
    if(any(trBlkSizes ~= 0))
        numRxBits = [numRxBits trBlkSizes.*(1-blkerr)];
        txedTrBlkSizes = [txedTrBlkSizes trBlkSizes];
    end
    
    if blkerr   
        numBlkErr = numBlkErr + 1;
    end

HARQ プロセスの更新

現在の HARQ プロセスを CRC エラーで更新し、次のプロセスに進みます。このステップは、HARQ エンティティ内のアクティブな HARQ プロセスに関連する情報を更新します。

    statusReport = updateAndAdvance(harqEntity,blkerr,trBlkSizes,pdschInfo.G);    

現在の復号化の試行に関する情報を表示します。

    disp("Slot "+(nTrBlk)+". "+statusReport);
   
end % for nTrBlk = 1:noTransportBlocks
Slot 1. HARQ Proc 0: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 2. HARQ Proc 1: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 3. HARQ Proc 2: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 4. HARQ Proc 3: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 5. HARQ Proc 4: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 6. HARQ Proc 5: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 7. HARQ Proc 6: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 8. HARQ Proc 7: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 9. HARQ Proc 8: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 10. HARQ Proc 9: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 11. HARQ Proc 10: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 12. HARQ Proc 11: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 13. HARQ Proc 12: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 14. HARQ Proc 13: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 15. HARQ Proc 14: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 16. HARQ Proc 15: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 17. HARQ Proc 0: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 18. HARQ Proc 1: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 19. HARQ Proc 2: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 20. HARQ Proc 3: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 21. HARQ Proc 4: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 22. HARQ Proc 5: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 23. HARQ Proc 6: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 24. HARQ Proc 7: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 25. HARQ Proc 8: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 26. HARQ Proc 9: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 27. HARQ Proc 10: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 28. HARQ Proc 11: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 29. HARQ Proc 12: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 30. HARQ Proc 13: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 31. HARQ Proc 14: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 32. HARQ Proc 15: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 33. HARQ Proc 0: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 34. HARQ Proc 1: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 35. HARQ Proc 2: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 36. HARQ Proc 3: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 37. HARQ Proc 4: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 38. HARQ Proc 5: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 39. HARQ Proc 6: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 40. HARQ Proc 7: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 41. HARQ Proc 8: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 42. HARQ Proc 9: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 43. HARQ Proc 10: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 44. HARQ Proc 11: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 45. HARQ Proc 12: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 46. HARQ Proc 13: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 47. HARQ Proc 14: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 48. HARQ Proc 15: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 49. HARQ Proc 0: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 50. HARQ Proc 1: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 51. HARQ Proc 2: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 52. HARQ Proc 3: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 53. HARQ Proc 4: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 54. HARQ Proc 5: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 55. HARQ Proc 6: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 56. HARQ Proc 7: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 57. HARQ Proc 8: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 58. HARQ Proc 9: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 59. HARQ Proc 10: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 60. HARQ Proc 11: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 61. HARQ Proc 12: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 62. HARQ Proc 13: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 63. HARQ Proc 14: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 64. HARQ Proc 15: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 65. HARQ Proc 0: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 66. HARQ Proc 1: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 67. HARQ Proc 2: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 68. HARQ Proc 3: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 69. HARQ Proc 4: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 70. HARQ Proc 5: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 71. HARQ Proc 6: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 72. HARQ Proc 7: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 73. HARQ Proc 8: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 74. HARQ Proc 9: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 75. HARQ Proc 10: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 76. HARQ Proc 11: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 77. HARQ Proc 12: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 78. HARQ Proc 13: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 79. HARQ Proc 14: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 80. HARQ Proc 15: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 81. HARQ Proc 0: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 82. HARQ Proc 1: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 83. HARQ Proc 2: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 84. HARQ Proc 3: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 85. HARQ Proc 4: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 86. HARQ Proc 5: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 87. HARQ Proc 6: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 88. HARQ Proc 7: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 89. HARQ Proc 8: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 90. HARQ Proc 9: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 91. HARQ Proc 10: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 92. HARQ Proc 11: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 93. HARQ Proc 12: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 94. HARQ Proc 13: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 95. HARQ Proc 14: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 96. HARQ Proc 15: CW0: Retransmission #1 passed (RV=2,CR=0.481509).
Slot 97. HARQ Proc 0: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 98. HARQ Proc 1: CW0: Initial transmission failed (RV=0,CR=0.481509).
Slot 99. HARQ Proc 2: CW0: Initial transmission passed (RV=0,CR=0.481509).
Slot 100. HARQ Proc 3: CW0: Initial transmission failed (RV=0,CR=0.481509).

BLER の結果

BLER とスループット (正常に受信されたトランスポート ブロックの割合) を計算します。統計的に意味のある結果を得るには、多くのトランスポート ブロックに対してこのシミュレーションを実行します。

maxThroughput = sum(txedTrBlkSizes); % Maximum possible throughput
totalNumRxBits = sum(numRxBits,2);   % Number of successfully received bits

disp("Block Error Rate: "+string(numBlkErr/noTransportBlocks))
Block Error Rate: 0.43
disp("Throughput: " + string(totalNumRxBits*100/maxThroughput) + "%")
Throughput: 57%

関連するトピック