Main Content

HARQ로 5G NR 전송 채널 모델링하기

이 예제에서는 DL-SCH(downlink shared channel) 인코더 및 디코더 5G Toolbox™ System object를 사용하여 다중 HARQ(하이브리드 자동 재송 요구) 프로세스로 5G NR 전송 채널을 모델링하는 방법을 보여줍니다.

소개

아래 그림은 5G 다운링크 링크의 컨텍스트에서, 이 예제에서 모델링되는 링크 요소를 보여줍니다. 해당 요소는 다음과 같습니다.

  • DL-SCH 인코딩 및 디코딩

  • PDSCH(physical downlink shared channel) 인코딩 및 디코딩

  • 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

시뮬레이션 파라미터

시뮬레이션할 전송 블록 개수와 신호 대 잡음비(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 인코더 객체와 DL-SCH 디코더 객체를 만듭니다. 다중 프로세스를 사용하려면 두 객체 모두의 MultipleHARQProcesses 속성을 true로 설정합니다. 다중 HARQ 프로세스에 대한 재송신을 활성화하기 위해 인코더는 입력 비트를 버퍼링합니다. 각 HARQ 프로세스에 대한 재송신의 소프트 결합(soft combining)을 활성화하려면 디코더에도 유사한 메커니즘이 필요합니다.

% 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 인코더 객체와 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 인코더와 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 프로세스 업데이트

CRC 오류로 현재 HARQ 프로세스를 업데이트하고 다음 프로세스로 진행합니다. 이 단계에서 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%

관련 항목