В этом примере показано, как смоделировать поиск ячейки NR 5G, MIB и аппаратный алгоритм восстановления SIB1 в MATLAB® как шаг к разработке реализации Simulink® HDL нисходящего приемника. Используйте эту ссылку MATLAB, чтобы проверить модели Simulink в Поиске Ячейки HDL NR, Восстановлении MIB HDL NR, Восстановлении MIB HDL NR для FR2 и примерах NR HDL SIB1 Восстановления.
Справочный пример MATLAB Приемника Нисходящего канала HDL NR устраняет разрыв между математическим алгоритмом и его аппаратной реализацией путем обеспечения модели MATLAB алгоритмов, которые реализованы в оборудовании. Ссылка MATLAB создается, чтобы оценить благоприятные для оборудования алгоритмы и сгенерировать тестовые векторы для проверки, что HDL фиксированной точки Simulink оптимизировал реализацию. Рабочий процесс для разработки и развертывания поиска ячейки 5G, MIB и алгоритма восстановления SIB1 к оборудованию показывают.
Каждый шаг в этом рабочем процессе продемонстрирован одним или несколькими связанными примерами.
Золотой Ссылочный шаг Алгоритма MATLAB состоит из Поиска Ячейки NR и MIB и Восстановления SIB1 (5G Toolbox) пример, который показывает золотой ссылочный алгоритм с плавающей точкой.
Шаг Алгоритма Руководства по аппаратным средствам MATLAB состоит из Приемника Нисходящего канала HDL NR Справочный пример MATLAB (этот пример), какое оборудование моделей дружественные алгоритмы и генерируют тестовые формы волны. Этот код MATLAB® работает с векторами и матрицами выборок данных с плавающей точкой и не поддерживает генерацию HDL-кода.
Шаг Модели Реализации Фиксированной точки Simulink состоит из нескольких примеров. Пример Поиска Ячейки HDL NR демонстрирует, что ячейка 5G ищет Подсистему Simulink, которая использует тот же алгоритм в качестве ссылки MATLAB. Пример Восстановления MIB HDL NR добавляет декодирование канала телевизионного вещания и подсистему восстановления MIB. Пример NR HDL SIB1 Восстановления добавляет подсистему, которая восстанавливает сетку ресурса SIB1 и показывает, как декодировать ее выход с помощью кода ссылки MATLAB. Восстановление MIB HDL NR для примера FR2 показывает поиск ячейки и модели восстановления MIB, которые были расширены, чтобы поддержать FR2. Эти модели работают с данными фиксированной точки и оптимизированы для генерации HDL-кода.
Шаг модели развертывания Simulink SoC состоит из Развернуть Примеров готовых узлов HDL NR на примерах SoCs, которые основываются на моделях реализации фиксированной точки и используют пакеты аппаратной поддержки, чтобы развернуть алгоритмы на оборудовании.
Для общего описания того, как MATLAB и Simulink могут использоваться вместе, чтобы разработать развертываемые модели, см. Проект Радиосвязей для FPGAs и ASICs.
Блок-схему Нисходящего алгоритма Приемника показывают. Алгоритм обнаруживает, демодулирует, и декодирует 5G блоки сигнала синхронизации NR (SSBs) и восстанавливает SIB1. Это - благоприятная для оборудования версия соответствующих шагов в Поиске Ячейки NR и MIB и Восстановлении SIB1 (5G Toolbox) пример. В верхнем уровне алгоритм состоит из Поискового Контроллера, Детектора SSB, Декодера SSB, демодулятора сетки SIB1 и декодера SIB1. Этот пример объясняет каждый из этих блоков более подробно и демонстрирует соответствующие функции ссылки MATLAB, которые используются, чтобы исследовать алгоритмы для аппаратной реализации и проверить модели Simulink фиксированной точки потоковой передачи. Этот пример фокусирует на 5G частотный диапазон 1 (FR1) NR. Смотрите Восстановление MIB HDL NR для FR2 для примера того, как использовать ссылку MATLAB для восстановления FR2 MIB.
Поиск ячейки состоит из восстановления несущей частоты, поиска первичного сигнала синхронизации (PSS), демодуляции OFDM и поиска вторичного сигнала синхронизации (SSS). Поисковый Контроллер и Детектор SSB работают совместно, чтобы выполнить эти шаги обработки. Детектор SSB выполняет все высокоскоростные задачи обработки сигналов, делание его хорошо подошло для реализации ASIC или FPGA. Поисковый Контроллер координирует поиск и действует под низкий процент, делание его хорошо подошло для реализации программного обеспечения встраиваемому процессору.
Алгоритм начинает при помощи PSS искать SSBs с расстояниями между поднесущими 15 кГц и 30 кГц через область значений крупных смещений частоты. Расстояние между поднесущими и крупные области значений поиска смещения частоты конфигурируемы. Если SSBs обнаруживаются, приемник OFDM демодулирует сетку ресурса SSB с самым сильным PSS и определяет его ячейку ID с помощью SSS. Остаточное прекрасное смещение частоты корректируется во время фазы демодуляции OFDM.
Детектор SSB: Поиски и OFDM-демодулируют SSBs при данном смещении несущей частоты и расстоянии между поднесущими и измеряют остаточное прекрасное смещение несущей частоты.
Цифровой вниз конвертер (DDC): Выполняет перевод частоты, чтобы откорректировать смещения частоты в принятой форме волны и затем десятикратно уменьшает сигнал от 61.44 членов Шотландского парламента 7.68 членам Шотландского парламента.
Поиск PSS: Поиски символов PSS в форме волны.
Демодуляция OFDM: OFDM-демодулирует сетку ресурса SSB.
Поиск SSS: Поиски SSS и определяют полную ячейку ID.
Поисковый Контроллер: Координирует поиск ячейки путем направления Детектора SSB, чтобы искать символы PSS при различных крупных смещениях частоты и расстояниях между поднесущими и демодулировать SSB с самым сильным PSS.
В ссылке MATLAB, nrhdlexamples.cellSearch
функционируйте реализует алгоритм поиска ячейки. Эта функция реализует Поисковый Контроллер, показанный в схеме, и вызывает nrhdlexamples.ssbDetect
функция, которая реализует Детектор SSB. Пример Поиска Ячейки HDL NR показывает фиксированной точке потоковой передачи реализацию HDL Simulink Детектора SSB. В 5G Восстановление MIB NR Используя Аналоговые устройства AD9361/AD9364 (Пакет поддержки Communications Toolbox для Xilinx Находящееся в Zynq Радио) пример, Детектор SSB реализован в программируемой логике, в то время как Поисковый Контроллер реализован в программном обеспечении в интегрированной системе обработки.
Поисковый Диспетчер ответственен за координирование полного поиска. Алгоритм выполняет эти шаги.
Для каждого расстояния между поднесущими продвиньтесь посредством каждого крупного смещения частоты и используйте Детектор SSB, чтобы искать SSBs, пока один или несколько не будет обнаружен. Крупный размер шага смещения частоты является половиной расстояния между поднесущими. Когда SSBs обнаруживаются на данной частоте, записывают остаточное прекрасное смещение несущей частоты самого сильного SSB, который возвращен.
Переместитесь в следующий крупный шаг частоты и ищите SSBs снова. Если поиск обнаруживает SSBs, выберите крупное смещение частоты, которое привело к самому маленькому прекрасному измерению смещения частоты. В противном случае выберите последнее крупное смещение частоты.
Вычислите общую частоту, возмещенную путем добавления крупных и прекрасных смещений частоты вместе.
Используйте Детектор SSB, чтобы откорректировать смещение частоты и выполнить еще один поиск SSBs.
Выберите SSB с самой сильной корреляцией PSS. Используйте Детектор SSB в режиме демодуляции, чтобы найти и демодулировать SSB и определить его ячейку ID.
Эти схемы показывают структуру Детектора SSB для FR1, и параметры и данные передали и от Поискового Диспетчера. Детектор SSB подразделен на две функции: DDC Детектора SSB (nrhdlexamples.ssbDetectDDC
) и SSB Detection Search и Demod (nrhdlexamples.ssbDetectSearchDemod
). DDC принимает выборки в 61.44 членах Шотландского парламента и выполняет сдвиг частоты, сопровождаемый децимацией на коэффициент 8 полуленточных фильтров использования. Смещение частоты, в Гц, обеспечивается поисковым контроллером и используется алгоритмом, чтобы компенсировать и крупные и прекрасные смещения частоты.
SSB Detection Search и Demod принимает выборки в 7.68 членах Шотландского парламента. Для расстояния между поднесущими на 30 кГц это использует выборки на этом уровне. Для расстояния между поднесущими на 15 кГц это десятикратно уменьшает вход на коэффициент два, действующий в 3.84 членах Шотландского парламента. SSB Detection Search и Demod имеет два режима работы: поиск и демодуляция.
В режиме поиска функция ищет SSBs в заданном расстоянии между поднесущими с помощью PSS и возвращает список обнаруженных. Для каждого SSB, который найден, функция возвращает эти параметры:
NCellID2: Указывает, какая из трех возможных последовательностей PSS (0,1, или 2) была обнаружена.
синхронизация смещения: смещение синхронизации от запуска формы волны к запуску SSB.
прекрасная частота возместила: остаточное прекрасное смещение частоты в Гц, измеренном при помощи циклических префиксов всех четырех символов OFDM в SSB.
сила корреляции: измеренный уровень корреляции PSS.
энергия сигнала: полная энергия в выборках, в которых был обнаружен PSS.
В режиме демодуляции функция пытается найти определенный SSB при помощи своего смещения синхронизации и NCellID2. Если функция находит заданный PSS, приемник OFDM демодулирует сетку ресурса SSB и пытается обнаружить свой SSS. В режиме демодуляции функция возвращает эти результаты.
Обновленные параметры только для заданного SSB, если PSS найден.
Демодулируемая сетка ресурса SSB, если PSS найден.
Ячейка ID, если SSS найден.
Демодулятор OFDM использует БПФ с 256 точками, чтобы демодулировать сетку ресурса SSB, которая содержит 240 активных поднесущих.
Использование алгоритма поиска ячейки, синхронизирующее смещения, чтобы идентифицировать положения в принятой форме волны и промежуточных сигналах. Смещение синхронизации является количеством отсчетов от запуска формы волны к данной позиции, такой как запуск SSB. Синхронизирующие смещения даны в выборках в 61.44 членах Шотландского парламента и переносят каждые 20 мс, или 1 228 800 выборок. В 5G NR приемники могут принять, что пакетная периодичность SS составляет 20 мс или меньше в целях поиска ячейки, следовательно причина этого выбора синхронизации ссылочной периодичности.
Рисунок показывает две формы волны 5G с различными пакетными периодичностями SS (5 мс и 20 мс) и ссылка синхронизации приемника. Ссылка MATLAB может обнаружить SSBs в любом положении в принятой форме волны. Однако, если форма волны более длинна, чем 20 мс, неоднозначность в возвращенных смещениях синхронизации существует, потому что ссылка синхронизации переносит каждые 20 мс. Кроме того, приемник может демодулировать только SSBs, которые начинаются в первых 20 мс формы волны.
Схема показывает структуру декодера SSB, который реализован nrhdlexamples.ssbDecode
функция. Алгоритм берет сетку ресурса SSB из фазы демодуляции OFDM детектора SSB, обрабатывает его через PBCH и декодирование BCH, и параметры выходных параметров MIB и время выполнения PBCH.
Декодирующий PBCH берет демодулируемые символы OFDM сетки ресурса и процессов с помощью этих шагов:
Поиск DMRS: Поиски индекса использовали для символа ссылки демодуляции (DMRS) генерацию.
Оценка канала: Вычисляет оценку канала с помощью DMRS.
Эквализация канала: Компенсирует принятые данные с помощью оценки канала.
Символ Demod: Выполняет демодуляцию QPSK, чтобы получить мягкие биты PBCH.
Дескремблирование: Дескремблирует мягкие биты.
BCH Декодируют, затем обрабатывает дескремблированные мягкие биты, чтобы восстановить данные о MIB с помощью этих шагов:
Восстановление уровня: Объединения повторили, что мягкие биты затем выполняют масштабирование и квантование.
Полярное Декодирование + CRC: Выполняет полярное декодирование, чтобы заставить биты сообщения и декодирование CRC проверять ошибки.
Синтаксический анализ сообщения MIB: Интерпретирует декодируемые биты сообщения, чтобы произвести параметр MIB выходные параметры.
Схема показывает структуру алгоритма Демодулятора SIB1, который реализован nrhdlexamples.sib1Demodulate
функция. Алгоритм принимает выборки на уровне 61,44 МГц и использует результаты предыдущих этапов обработки, чтобы определить местоположение и демодулировать сетку, содержащую CORESET0 и запланированную передачу SIB1. Результаты MIB используются, чтобы вычислить параметры CORESET0, который включает смещение частоты, количество блоков ресурса и контролирующий случай. Смещение частоты относительно местоположения обнаруженного SSB. Первая стадия обработки данных является DDC, который выполняет сдвиг частоты, чтобы сосредоточить сетку SIB1 и затем прореживает к 30,72 МГц - максимальная полоса пропускания для CORESET0 в FR1. Следующий этап должен ожидать контрольного случая CORESET0 - алгоритм содержит ссылку синхронизации, которая синхронизируется со ссылками синхронизации Детектора SSB, чтобы идентифицировать следующее происшествие контролирующего случая. Если контролирующий случай достигнут, полученные выборки являются OFDM, демодулируемым, чтобы произвести сетку, которую ресурс CORESET0 блокирует широкий и два паза в длительности.
Декодирование SIB1 выполняется на сетке SIB1, выведенной демодуляцией SIB1. Декодирование SIB1 требует, чтобы декодирование PDCCH, чтобы восстановить SI-RNTI закодировало сообщение DCI и декодирование PDSCH, чтобы восстановить сообщение SIB1. nrhdlexamples.pdcchDecoding
использует сетку SIB1 и параметры, восстановленные с предыдущих этапов декодирования, чтобы определить местоположение и декодировать PDCCH для CORESET0. Эта функция возвращает сообщение DCI, которое сигнализирует о местоположении ресурсов PDSCH, выделенных SIB1, и возвращает флаг, указывающий, был ли DCI найден в первом или втором пазе сетки SIB1. Паз, несущий PDSCH и PDSCH для SIB1, выбран из сетки SIB1 и nrhdlexamples.coreset0PhaseAdjustment
корректирует для смещения фазы, примененного на базисе символа OFDM передатчиком, как детализировано в разделе TS 38.211 5.4. nrhdlexamples.pdschDecoding
использует откорректированную сетку паза фазы, сообщение DCI и другую информацию от предыдущих этапов декодирования, чтобы определить местоположение и декодировать ресурсы PDSCH, несущие сообщение SIB1. Этот funtion возвращает биты сообщения SIB1 и результат проверки SIB1 CRC. Значение CRC 0 указывает на успешное восстановление SIB1.
Этот раздел показывает, как использовать функции ссылки MATLAB, чтобы искать SSBs в форме волны, демодулировать и декодировать SSB, чтобы восстановить MIB и восстановить запланированный SIB1.
Используйте nrhdlexamples.generateFR1RxWaveform
функция, чтобы сгенерировать 5G форма волны FR1, содержащая SSB, разрывается и соответствующие передачи SIB1. Измените simulationCase
исследовать различные наборы параметров. Полный набор случаев симуляции показывают.
disp('Test waveform configurations:') disp(nrhdlexamples.generateFR1RxWaveform('list')); rng('default'); simulationCase = "SimCase 1"; [rxWaveform,ssbPattern,minChanBW,Lmax,txMIB,simCase] = nrhdlexamples.generateFR1RxWaveform(simulationCase); disp("Selected Simulation case:" + newline); disp(simCase); FoCoarse = 0; if ssbPattern == "Case A" scsSSB = 15; else scsSSB = 30; end
Test waveform configurations: Simulation Case SSB Pattern Subcarrier Spacing Common PDCCH Config SIB1 SNR dB Strongest SSB index Lmax _______________ ___________ _________________________ _________________ ______ ___________________ ____ "SimCase 1" "Case C" 30 164 50 4 8 "SimCase 2" "Case B" 15 100 5 7 8 "SimCase 3" "Case A" 30 4 20 2 8 "SimCase 4" "Case A" 15 84 7 0 4 Selected Simulation case: Simulation Case SSB Pattern Subcarrier Spacing Common PDCCH Config SIB1 SNR dB Strongest SSB index Lmax _______________ ___________ _________________________ _________________ ______ ___________________ ____ "SimCase 1" "Case C" 30 164 50 4 8
График показывает spectogram SSBs, CORESET0s и областей PDSCH, несущих SIB1. Эти области сгенерированы с различными уровнями мощности. Амплитуда каждого элемента ресурса обозначается его цветом.
figure(1); clf; rxSampleRate = 61.44e6; nfft = rxSampleRate/(scsSSB*1e3); spectrogram(rxWaveform(:,1),ones(nfft,1),0,nfft,'centered',rxSampleRate,'yaxis','MinThreshold',-110); title('Spectrogram of the Received Waveform')
Используйте nrhdlexamples.ssbDetect
функционируйте, чтобы найти SSBs в форме волны путем поиска символов PSS. Этот пример вызывает функцию с крупной оценкой смещения несущей частоты нуля и расстояния между поднесущими, определенного из шаблона SSB сгенерированной формы волны. Функция корректирует крупное смещение частоты и измеряет остаточное прекрасное смещение частоты каждого SSB. Ввод и вывод смещения частоты дан в Гц. Функция возвращает список обнаруженных символов PSS как массив структур. Отобразите содержимое массива структур путем преобразования его в таблицу.
[pssList,diagnostics] = nrhdlexamples.ssbDetect(rxWaveform,FoCoarse,scsSSB); % Check if any PSS have been detected if isempty(pssList) disp('No PSS found during SSB detection.'); return; end disp('Detected PSS list:') disp(struct2table(pssList));
Detected PSS list: NCellID2 timingOffset pssCorrelation pssEnergy frequencyOffset ________ ____________ ______________ _________ _______________ 0 4416 0.742 0.74608 58 0 17568 0.59033 0.59277 -4 0 35136 1.4877 1.4951 15 0 48288 1.1708 1.1808 34 0 65856 4.6852 4.7073 -62 0 79008 1.0462 1.0523 3 0 96576 1.872 1.8807 14 0 1.0973e+05 0.93222 0.93665 -9
nrhdlexamples.ssbDetect
функционируйте также возвращает структуру, содержащую диагностические сигналы. Используйте этот выход, чтобы построить результаты корреляции PSS. Каждый пик в корреляторе вывел показанный, соответствует записи в списке PSS.
figure(2); clf;
nrhdlexamples.plotUtils.PSSCorrelation(diagnostics,'PSS Correlation');
Используйте nrhdlexamples.ssbDetect
функция, чтобы OFDM-демодулировать один из SSBs и делать попытку обнаружения SSS. Для этой операции вызовите функцию с дополнительным 4-м аргументом, который задает смещение синхронизации и NCellID2 желаемого SSB. Этот пример выбирает PSS с самой высокой метрикой корреляции, однако можно выбрать любой из обнаруженных SSBs. Откорректируйте частоту, возмещенную путем передачи в сумме крупных и прекрасных оценок смещения частоты.
[~,maxCorrIdx] = max(vertcat(pssList.pssCorrelation)); chosenPSS = pssList(maxCorrIdx); disp('Selected PSS:') disp(struct2table(chosenPSS)); FoFine = chosenPSS.frequencyOffset; FoEst = FoCoarse + FoFine; [ssBlockInfo,ssbGrid,diagnostics] = nrhdlexamples.ssbDetect(rxWaveform,FoEst,scsSSB,chosenPSS); % Check SSB successfully demodulated if isempty(ssBlockInfo) disp('Failed to demodulate selected SSB.'); return; end
Selected PSS: NCellID2 timingOffset pssCorrelation pssEnergy frequencyOffset ________ ____________ ______________ _________ _______________ 0 65856 4.6852 4.7073 -62
В режиме демодуляции функция возвращает три выходных параметра вместо два. ssBlockInfo
структура содержит более подробную информацию SSB, такую как сила корреляции SSS и полная ячейка ID. ssGrid
выход является матрицей, содержащей демодулируемые символы OFDM. Отобразите информацию SSB, чтобы подтвердить, что ячейка ID правильно декодируется.
disp('SSB info for demodulated SSB:')
disp(ssBlockInfo);
SSB info for demodulated SSB: NCellID2: 0 timingOffset: 65856 pssCorrelation: 4.6852 pssEnergy: 4.7074 NCellID1: 83 sssCorrelation: 4.7521 sssEnergy: 4.7523 NCellID: 249 frequencyOffset: 0
Отобразите получившуюся сетку ресурса SSB.
figure(3); clf; imagesc(abs(ssbGrid)); colorbar; axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); title('SSB Resource Grid');
diagnostics
выведите включает результаты корреляции SSS для всех 336 возможных последовательностей. Постройте результаты корреляции SSS.
figure(4); clf;
nrhdlexamples.plotUtils.SSSCorrelation(diagnostics,'SSS Correlation')
Этот раздел показывает, как использовать nrhdlexamples.cellSearch
функционируйте, чтобы искать и демодулировать SSBs, когда смещение частоты и расстояние между поднесущими не будут известны. Аналогичный описанному ранее, nrhdlexamples.cellSearch
функция основывается на nrhdlexamples.ssbDetect
функция путем добавления поискового контроллера, который ищет SSBs в различных расстояниях между поднесущими и смещениях частоты.
Примените смещение частоты, чтобы протестировать крупную и прекрасную функциональность восстановления частоты.
Fo = 10000; t = (0:length(rxWaveform)-1).'/61.44e6; rxWaveform = rxWaveform .* exp(1i*2*pi*Fo*t);
Задайте конечные точки частотного диапазона и пространство поиска расстояния между поднесущими и вызовите nrhdlexamples.cellSearch
функция. Функциональная информация об отображениях о поисковом прогрессе, когда это запускается. Конечные точки частотного диапазона должны быть множителями половины максимального расстояния между поднесущими.
frequencyRange = [-30 30]; subcarrierSpacings = [15 30]; [ssBlockInfo,ssbGrid] = nrhdlexamples.cellSearch(rxWaveform,frequencyRange,subcarrierSpacings,struct(... 'DisplayPlots',false,... 'DisplayCommandWindowOutput',true)); % Check cell search successfully found and demodulated SSB. if isempty(ssBlockInfo) disp('Cell search failed to find or demodulate SSB.'); return; end
Searching for PSS (subcarrierSpacing: 15 kHz, frequencyOffset: -30 kHz) Searching for PSS (subcarrierSpacing: 15 kHz, frequencyOffset: -22.5 kHz) Searching for PSS (subcarrierSpacing: 15 kHz, frequencyOffset: -15 kHz) Searching for PSS (subcarrierSpacing: 15 kHz, frequencyOffset: -7.5 kHz) Searching for PSS (subcarrierSpacing: 15 kHz, frequencyOffset: 0 kHz) Searching for PSS (subcarrierSpacing: 15 kHz, frequencyOffset: 7.5 kHz) Searching for PSS (subcarrierSpacing: 15 kHz, frequencyOffset: 15 kHz) Searching for PSS (subcarrierSpacing: 15 kHz, frequencyOffset: 22.5 kHz) Searching for PSS (subcarrierSpacing: 15 kHz, frequencyOffset: 30 kHz) Searching for PSS (subcarrierSpacing: 30 kHz, frequencyOffset: -30 kHz) Searching for PSS (subcarrierSpacing: 30 kHz, frequencyOffset: -15 kHz) Searching for PSS (subcarrierSpacing: 30 kHz, frequencyOffset: 0 kHz) ... PSS detected. Searching for PSS (subcarrierSpacing: 30 kHz, frequencyOffset: 15 kHz) ... PSS detected. Found PSS with (subcarrierSpacing: 30 kHz, frequencyOffsetEstimate: 9938 Hz) Correcting frequency offset and searching for PSS again. Found the following PSS symbols: NCellID2 timingOffset pssCorrelation pssEnergy frequencyOffset ________ ____________ ______________ _________ _______________ 0 4416 0.74199 0.74609 120 0 17568 0.59032 0.59278 58 0 35136 1.4877 1.4951 77 0 48288 1.1708 1.1809 96 0 65856 4.6852 4.7074 0 0 79008 1.0462 1.0523 65 0 96576 1.8721 1.8807 76 0 1.0973e+05 0.93221 0.93666 53 Strongest PSS: NCellID2: 0 timingOffset: 65856 pssCorrelation: 4.6852 pssEnergy: 4.7074 frequencyOffset: 0 Attempting to reacquire strongest PSS and demodulate the corresponding SS block. NCellID2: 0 timingOffset: 65856 pssCorrelation: 4.6852 pssEnergy: 4.7074 NCellID1: 83 sssCorrelation: 4.7521 sssEnergy: 4.7523 NCellID: 249 frequencyOffset: 9938 subcarrierSpacing: 30 Cell search summary: Subcarrier spacing: 30 kHz Frequency offset: 9938 Hz Timing offset: 65856 NCellID: 249
Как показано в сводных данных, приемник возвратил правильное расстояние между поднесущими 30 кГц, ячейку ID 249, и измеренное смещение частоты близко к ожидаемому значению 10 кГц.
Используйте nrhdlexamples.ssbDecode
функционируйте, чтобы декодировать сетку ресурса SSB и восстановить MIB. nrhdlexamples.ssbDecode
функция основана на BCH декодирование этапов Поиска Ячейки NR и MIB и Восстановления SIB1 (5G Toolbox) пример.
[mibInfo,decodeDiags] = nrhdlexamples.ssbDecode(ssbGrid,ssBlockInfo.NCellID,Lmax); % Check MIB successfully decoded from SSB. if mibInfo.err disp('Failed to decode MIB from SSB.'); return; end
Постройте peaks корреляции для поиска DMRS. Поиск DMRS выполняется, чтобы определить ibar_ssb и индекс SSB.
figure(5); clf; plot(0:7,decodeDiags.dmrsCorr); title('DMRS Search Correlation'); xlabel('ibar ssb'); ylabel('Correlation strength');
Постройте созвездие QPSK PBCH после эквализации фазы.
figure(6); clf; plot(decodeDiags.qpskSymb,'o'); xlim(max(abs(real(decodeDiags.qpskSymb))).*[-1.1 1.1]); ylim(max(abs(imag(decodeDiags.qpskSymb))).*[-1.1 1.1]); title('PBCH Symbol Constellation'); xlabel('In-phase'); ylabel('Quadrature');
Отобразите декодируемую информацию и сравните переданные и полученные структуры MIB. Эти результаты показывают, что информация успешно декодировалась.
disp(['BCH CRC: ' num2str(mibInfo.err) newline]); disp('Decoded information'); disp(mibInfo); disp('Decoded MIB'); disp(mibInfo.mib); disp('Expected MIB'); disp(txMIB);
BCH CRC: 0 Decoded information pbchPayload: 17637376 ssbIndex: 4 hrf: 0 err: 0 mib: [1×1 struct] Decoded MIB NFrame: 0 SubcarrierSpacingCommon: 30 k_SSB: 0 DMRSTypeAPosition: 3 PDCCHConfigSIB1: 164 CellBarred: 0 IntraFreqReselection: 0 Expected MIB NFrame: 0 SubcarrierSpacingCommon: 30 k_SSB: 0 DMRSTypeAPosition: 3 PDCCHConfigSIB1: 164 CellBarred: 0 IntraFreqReselection: 0
nrhdlexamples.sib1Demodulate
функция определяет местоположение CORESET0, с помощью информации, декодируемой от предыдущих этапов, и OFDM демодулирует сетку SIB1. Сетка SIB1 содержит CORESET0 и ресурсы PDSCH, выделенные сообщению SIB1.
ssbFrequencyOffset = ssBlockInfo.frequencyOffset; ssbResults = struct(... 'SubcarrierSpacing', scsSSB, ... 'TimingOffset', ssBlockInfo.timingOffset, ... 'FrequencyOffset', ssbFrequencyOffset); bandCfg = struct( ... 'ssbPattern', ssbPattern, ... 'Lmax', Lmax, ... 'MinChanBW', minChanBW ... ); sib1Grid = nrhdlexamples.sib1Demodulate(rxWaveform,ssbResults,mibInfo,bandCfg);
Постройте демодулируемую сетку OFDM SIB1.
figure_SIB1grid = figure(7); clf; imagesc(abs(sib1Grid)); colorbar; axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); title('SIB1 Grid');
Сетка SIB1 состоит из 2 пазов. Только один из этих пазов несет CORESET0 и PDSCH с SIB1. nrhdlexamples.pdcchDecoding
поисковые запросы в каждом из пазов для сообщений DCI закодированы с SI-RNTI. После того, как декодируемый, закодированное сообщение DCI SI-RNTI предоставляет информацию о местоположении сообщения SIB1 в PDSCH. nrhdlexamples.pdschDecoding
использует DCI и информацию от предыдущих этапов, чтобы определить местоположение и декодировать сообщение SIB1 в PDSCH. Если успешно декодируется sib1CRC будет 0, и биты сообщения SIB1 выход.
% Decode PDCCH and recover DCI message [dci,dciCRC,NSlot,secondSlotFlag,coresetNRB] = nrhdlexamples.pdcchDecoding(sib1Grid,ssBlockInfo.NCellID,mibInfo.ssbIndex,scsSSB,mibInfo.mib,minChanBW); % Check DCI successfully decoded from PDCCH. if dciCRC disp('Failed to decode DCI from PDCCH.'); return; end % Update SIB1 grid plot to highlight PDCCH and PDSCH areas nrhdlexamples.plotUtils.labelSIB1Plot(figure_SIB1grid.Number,size(sib1Grid),ssBlockInfo.NCellID,mibInfo.ssbIndex,scsSSB,mibInfo.mib,minChanBW,secondSlotFlag,dci); % Select slot containing SIB1 message slotGrid = sib1Grid(:,(1:14)+(14*secondSlotFlag)); % Adjust for phase offset applied by transmitter correctedSlotGrid = nrhdlexamples.coreset0PhaseAdjustment(slotGrid,mibInfo.mib,scsSSB,minChanBW,0); % Decode PDSCH and recover SIB1 message bits [sib1bits,sib1CRC] = nrhdlexamples.pdschDecoding(correctedSlotGrid,ssBlockInfo.NCellID,mibInfo.mib,coresetNRB,dci,NSlot); if sib1CRC == 0 disp('SIB1 successfully decoded'); else disp('SIB1 decoding failed'); end
PDCCH RMS EVM: 0.606% SIB1 successfully decoded