В этом примере показано, как к модели 5G NR транспортируют каналы с несколькими гибридный автоматический повторный запрос (HARQ) процессы с помощью нисходящего канала совместно использованный канал (DL-SCH) энкодер и декодер Системные объекты 5G Toolbox™.
Этот рисунок показывает элементы link, которые моделируются в этом примере в контексте ссылки нисходящего канала 5G. Эти элементы:
DL-SCH кодирование и декодирование
Физический нисходящий канал совместно использованный канал (PDSCH) кодирование и декодирование
Управление HARQ
Другие элементы link не моделируются в этом примере.
Примеры также измеряют частоту появления ошибочных блоков (BLER) с помощью канала AWGN. Этот рисунок показывает все элементы link, смоделированные в этом примере, последовавшем вычислением BLER.
Этот рисунок показывает, что энкодер DL-SCH использует внутренние буферы, чтобы сохранить транспортные блоки для каждого процесса HARQ и затем выбирает активное содержимое буфера процесса HARQ для кодирования. Декодер DL-SCH использует подобный механизм буферизации, чтобы сохранить и выбрать процессы HARQ.
Энкодер DL-SCH и декодер не справляются с процессами HARQ внутренне. Пример использует объект сущности HARQ, HARQEntity.m
, для управления процессами HARQ. Этот рисунок показывает структуру объекта сущности HARQ
Задайте количество транспортных блоков, чтобы симулировать и сигнал к шумовому отношению (ОСШ).
noTransportBlocks = 100;
SNRdB = 7; % SNR in dB
Сбросьте генератор случайных чисел для воспроизводимости.
rng("default");
Задайте скорость кода, количество процессов HARQ и значения сокращения (RVs) последовательность. Это управление последовательностью повторные передачи версии сокращения в случае ошибки.
% 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. Объекты энкодера и декодера используют HARQprocessID
свойство сущности HARQ возражает, чтобы идентифицировать активный процесс HARQ при выполнении любой из этих операций.
Установка нового транспортного блока передать
Кодирование данных
Сброс мягких буферов
Декодирование данных
Задайте несущую и параметры 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.
RV.
Номер передачи, который указывает, сколько раз был передан определенный транспортный блок.
Отметьте, чтобы указать, требуются ли новые данные. Новые данные требуются, когда транспортный блок получен успешно или если тайм-аут последовательности произошел (все передачи RV перестали работать).
Отметьте, чтобы указать, произошел ли тайм-аут последовательности (все передачи RV перестали работать).
harqEntity = HARQEntity(0:NHARQProcesses-1,rvSeq,pdsch.NumCodewords);
Сущность HARQ используется, чтобы управлять буферами в энкодере DL-SCH и декодере.
Цикл по многим транспортным блокам. Для каждого транспортного блока:
Вычислите транспортный размер блока в количестве битов.
Сгенерируйте новый блок данных или сбросьте буферы в декодере.
Примените кодирование 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
, динамически определяется, фактическая скорость кода не может быть точно равна целевой скорости кода, заданной TargetCodeRate
свойство encodeDLSCH
объект.
Этот раздел объясняет организацию буферизации данных в энкодере и декодере.
Буферы энкодера 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.
codedTrBlock = encodeDLSCH(pdsch.Modulation,pdsch.NumLayers,pdschInfo.G, ...
harqEntity.RedundancyVersion,harqEntity.HARQProcessID);
Сгенерируйте символы PDSCH.
modOut = nrPDSCH(carrier,pdsch,codedTrBlock);
Добавьте белый Гауссов шум.
rxSig = awgn(modOut,SNRdB);
Мягкий демодулируют полученные символы.
rxLLR = nrPDSCHDecode(carrier,pdsch,rxSig,noiseVar);
Примените декодирование 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.
statusReport = updateAndAdvance(harqEntity,blkerr,trBlkSizes,pdschInfo.G);
Отобразите информацию о текущей попытке декодирования.
disp("Slot "+(nTrBlk)+". "+statusReport); end % for nTrBlk = 1:noTransportBlocks
Slot 1. HARQ Proc 0: CW0: Initial transmission passed (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 passed (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 failed (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 passed (RV=0,CR=0.481509). Slot 14. HARQ Proc 13: CW0: Initial transmission passed (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: Initial transmission passed (RV=0,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: Initial transmission failed (RV=0,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 failed (RV=0,CR=0.481509). Slot 26. HARQ Proc 9: CW0: Retransmission #1 passed (RV=2,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 failed (RV=0,CR=0.481509). Slot 29. HARQ Proc 12: CW0: Initial transmission passed (RV=0,CR=0.481509). Slot 30. HARQ Proc 13: CW0: Initial transmission failed (RV=0,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 passed (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 failed (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: Retransmission #1 passed (RV=2,CR=0.481509). Slot 40. HARQ Proc 7: CW0: Initial transmission failed (RV=0,CR=0.481509). Slot 41. HARQ Proc 8: CW0: Retransmission #1 passed (RV=2,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: Retransmission #1 passed (RV=2,CR=0.481509). Slot 45. HARQ Proc 12: CW0: Initial transmission failed (RV=0,CR=0.481509). Slot 46. HARQ Proc 13: CW0: Retransmission #1 passed (RV=2,CR=0.481509). Slot 47. HARQ Proc 14: CW0: Initial transmission passed (RV=0,CR=0.481509). Slot 48. HARQ Proc 15: CW0: Initial transmission passed (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: Initial transmission passed (RV=0,CR=0.481509). Slot 52. HARQ Proc 3: CW0: Retransmission #1 passed (RV=2,CR=0.481509). Slot 53. HARQ Proc 4: CW0: Retransmission #1 passed (RV=2,CR=0.481509). Slot 54. HARQ Proc 5: CW0: Retransmission #1 passed (RV=2,CR=0.481509). Slot 55. HARQ Proc 6: CW0: Initial transmission passed (RV=0,CR=0.481509). Slot 56. HARQ Proc 7: CW0: Retransmission #1 passed (RV=2,CR=0.481509). Slot 57. HARQ Proc 8: CW0: Initial transmission failed (RV=0,CR=0.481509). Slot 58. HARQ Proc 9: CW0: Initial transmission failed (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 failed (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: Initial transmission passed (RV=0,CR=0.481509). Slot 64. HARQ Proc 15: CW0: Initial transmission failed (RV=0,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 failed (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: Initial transmission failed (RV=0,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 passed (RV=0,CR=0.481509). Slot 72. HARQ Proc 7: CW0: Initial transmission passed (RV=0,CR=0.481509). Slot 73. HARQ Proc 8: CW0: Retransmission #1 passed (RV=2,CR=0.481509). Slot 74. HARQ Proc 9: CW0: Retransmission #1 passed (RV=2,CR=0.481509). Slot 75. HARQ Proc 10: CW0: Initial transmission passed (RV=0,CR=0.481509). Slot 76. HARQ Proc 11: CW0: Retransmission #1 passed (RV=2,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: Retransmission #1 passed (RV=2,CR=0.481509). Slot 81. HARQ Proc 0: CW0: Retransmission #1 passed (RV=2,CR=0.481509). Slot 82. HARQ Proc 1: CW0: Retransmission #1 passed (RV=2,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: Retransmission #1 passed (RV=2,CR=0.481509). Slot 86. HARQ Proc 5: CW0: Retransmission #1 passed (RV=2,CR=0.481509). Slot 87. HARQ Proc 6: CW0: Initial transmission passed (RV=0,CR=0.481509). Slot 88. HARQ Proc 7: CW0: Initial transmission failed (RV=0,CR=0.481509). Slot 89. HARQ Proc 8: CW0: Initial transmission passed (RV=0,CR=0.481509). Slot 90. HARQ Proc 9: CW0: Initial transmission failed (RV=0,CR=0.481509). Slot 91. HARQ Proc 10: CW0: Initial transmission failed (RV=0,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 failed (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: Initial transmission passed (RV=0,CR=0.481509). Slot 97. HARQ Proc 0: CW0: Initial transmission passed (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 и пропускную способность (процент успешно полученных транспортных блоков). Чтобы обеспечить статистически значимые результаты, запустите эту симуляцию для многих транспортных блоков.
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.42
disp("Throughput: " + string(totalNumRxBits*100/maxThroughput) + "%")
Throughput: 58%