В этом примере показано, как генерировать блок сигнала синхронизации (SSB) и генерировать множество SSB для формирования пакета сигнала синхронизации (пакета SS). Каналы и сигналы, которые образуют блок сигналов синхронизации (первичный и вторичный сигналы синхронизации, физический широковещательный канал), создаются и преобразуются в матрицу, представляющую блок. Наконец, создается матрица, представляющая пакет сигнала синхронизации, и каждый блок сигнала синхронизации в пакете создается и отображается в матрицу.
TS 38.211 Раздел 7.4.3.1 определяет блок сигнала синхронизации/физического широковещательного канала (SS/PBCH) как 240 поднесущих и 4 символа OFDM, содержащих следующие каналы и сигналы:
Первичный сигнал синхронизации (PSS)
Вторичный сигнал синхронизации (SSS)
Физический широковещательный канал (PBCH)
Опорный сигнал демодуляции PBCH (PBCH DM-RS)
В других документах, например, TS 38.331, SS/PBCH называется «блоком сигнала синхронизации» или «блоком SS».
Создайте матрицу 240 на 4, представляющую блок SS/PBCH:
ssblock = zeros([240 4])
ssblock = 240×4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
⋮
Создайте PSS для данного идентификатора соты:
ncellid = 17; pssSymbols = nrPSS(ncellid)
pssSymbols = 127×1
-1
-1
-1
-1
-1
-1
1
1
1
-1
⋮
The переменная pssSymbols - вектор столбца, содержащий 127 символов BPSK PSS.
Создайте индексы PSS:
pssIndices = nrPSSIndices;
Переменная pssIndices - вектор столбца того же размера, что и pssSymbols. Значение в каждом элементе pssIndices - линейный индекс местоположения в блоке SS/PBCH, в котором находятся соответствующие символы в pssSymbols должно быть сопоставлено. Поэтому преобразование символов PSS в блок SS/PBCH может быть выполнено с простым назначением MATLAB, используя линейное индексирование для выбора правильных элементов матрицы блоков SS/PBCH. Обратите внимание, что к символам PSS применяется коэффициент масштабирования 1 для представления в TS 38.211 Раздел 7.4.3.1.1:
ssblock(pssIndices) = 1 * pssSymbols;
Постройте график матрицы блоков SS/PBCH для отображения местоположения основной системы 2х2:
imagesc(abs(ssblock)); caxis([0 4]); axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); title('SS/PBCH block containing PSS');

Создайте SSS для того же идентификатора соты, что и сконфигурированный для основной системы 2х2:
sssSymbols = nrSSS(ncellid)
sssSymbols = 127×1
-1
1
-1
-1
-1
1
-1
1
-1
1
⋮
Создайте индексы SSS и сопоставьте символы SSS с блоком SS/PBCH, следуя тому же шаблону, что и для основной системы 2х2. Обратите внимание, что к символам SSS применяется коэффициент масштабирования 2 для представления в TS 38.211 Раздел 7.4.3.1.2:
sssIndices = nrSSSIndices; ssblock(sssIndices) = 2 * sssSymbols;
Форма индексов по умолчанию - линейные индексы на основе 1, пригодные для линейного индексирования матриц MATLAB, как ssblock как уже показано. Однако стандартные документы NR описывают ресурсы OFDM в терминах поднесущей OFDM и подстрочных индексов символов, используя нумерацию на основе 0. Для удобной перекрестной проверки со стандартом NR функции индексов принимают опции, позволяющие выбрать стиль индексации (линейный индекс в сравнении с подстрочным индексом) и базу (на основе 0 против 1):
sssSubscripts = nrSSSIndices('IndexStyle','subscript','IndexBase','0based')
sssSubscripts = 127x3 uint32 matrix
56 2 0
57 2 0
58 2 0
59 2 0
60 2 0
61 2 0
62 2 0
63 2 0
64 2 0
65 2 0
⋮
Из подстрочных индексов видно, что SSS находится в OFDM-символе 2 (на основе 0) блока SS/PBCH, начиная с поднесущей 56 (на основе 0).
Снова постройте график матрицы блоков SS/PBCH для отображения местоположений PSS и SSS:
imagesc(abs(ssblock)); caxis([0 4]); axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); title('SS/PBCH block containing PSS and SSS');

PBCH несет кодовое слово длиной 864 бита, созданное посредством выполнения кодирования BCH главного информационного блока (MIB). Для получения дополнительной информации о кодировании BCH см. функции nrBCH и nrBCHDecode и их использование в примере NR Cell Search и MIB и SIB1 Recovery. Здесь используется кодовое слово PBCH, состоящее из 864 случайных битов:
cw = randi([0 1],864,1);
Модуляция PBCH состоит из следующих этапов, описанных в TS 38.211 Раздел 7.3.3:
Борьба
Модуляция
Сопоставление с физическими ресурсами
Несколько блоков SS/PBCH передаются по половине кадра, как описано в процедуре поиска ячеек в TS 38.213 Раздел 4.1. Каждому блоку SS/PBCH присваивается индекс от 0...L-1, L - число блоков SS/PBCH в полукадре. Последовательность скремблирования для PBCH инициализируется в соответствии с идентификацией соты.ncellidи подпоследовательность, используемая для скремблирования кодового слова PBCH, зависит от значения , 2 или 3 LSB индекса блока SS/PBCH, как описано в TS 38.211 раздел 7.3.3.1. В этом примере используется v = 0. ФункцияnrPBCH создает соответствующую подпоследовательность скремблирующей последовательности, выполняет скремблирование и затем выполняет QPSK модуляцию:
v = 0; pbchSymbols = nrPBCH(cw,ncellid,v)
pbchSymbols = 432×1 complex
-0.7071 + 0.7071i
-0.7071 + 0.7071i
-0.7071 + 0.7071i
-0.7071 - 0.7071i
0.7071 + 0.7071i
-0.7071 + 0.7071i
-0.7071 + 0.7071i
0.7071 - 0.7071i
0.7071 + 0.7071i
0.7071 + 0.7071i
⋮
Создайте индексы PBCH и сопоставьте символы PBCH с блоком SS/PBCH. Следует отметить, что коэффициент масштабирования 3 применяется к символам PBCH для представления в TS 38.211 Раздел 7.4.3.1.3:
pbchIndices = nrPBCHIndices(ncellid); ssblock(pbchIndices) = 3 * pbchSymbols;
Снова постройте график матрицы блоков SS/PBCH для отображения местоположений PSS, SSS и PBCH:
imagesc(abs(ssblock)); caxis([0 4]); axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); title('SS/PBCH block containing PSS, SSS and PBCH');

Конечным компонентом блока SS/PBCH является DM-RS, связанный с PBCH. Аналогично PBCH, используемая последовательность DM-RS вытекает из индекса блока SS/PBCH и конфигурируется с использованием переменной , описанной в TS 38.211 Раздел 7.4.1.4.1. Здесь используется i‾SSB=0:
ibar_SSB = 0; dmrsSymbols = nrPBCHDMRS(ncellid,ibar_SSB)
dmrsSymbols = 144×1 complex
0.7071 - 0.7071i
0.7071 + 0.7071i
-0.7071 + 0.7071i
-0.7071 + 0.7071i
0.7071 - 0.7071i
0.7071 + 0.7071i
0.7071 - 0.7071i
-0.7071 - 0.7071i
-0.7071 - 0.7071i
0.7071 + 0.7071i
⋮
Обратите внимание, что TS 38.211 раздел 7.4.1.4.1 определяет промежуточную переменную , которая определена аналогично , описанной ранее для PBCH.
Создайте индексы PBCH DM-RS и сопоставьте символы PBCH DM-RS с блоком SS/PBCH. Обратите внимание, что коэффициент масштабирования 4 применяется к символам PBCH DM-RS для представления в TS 38.211 Раздел 7.4.3.1.3:
dmrsIndices = nrPBCHDMRSIndices(ncellid); ssblock(dmrsIndices) = 4 * dmrsSymbols;
Снова постройте график матрицы блоков SS/PBCH, чтобы показать местоположения PSS, SSS, PBCH и PBCH DM-RS:
imagesc(abs(ssblock)); caxis([0 4]); axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); title('SS/PBCH block containing PSS, SSS, PBCH and PBCH DM-RS');

Пакет SS, состоящий из множества блоков SS/PBCH, может быть сформирован путем создания более крупной сетки и отображения блоков SS/PBCH в соответствующие местоположения, причем каждый блок SS/PBCH имеет правильные параметры в соответствии с местоположением.
В стандарте NR символы OFDM группируются в слоты, подкадры и кадры. Как определено в TS 38.211 Раздел 4.3.1, в кадре имеется 10 подкадров, и каждый подкадр имеет фиксированную длительность 1 мс. Каждый пакет SS имеет длительность половины кадра и поэтому охватывает 5 подкадров:
nSubframes = 5
nSubframes = 5
TS 38.211 Раздел 4.3.2 определяет каждый слот как имеющий 14 символов OFDM (для обычной длины циклического префикса), и это фиксируется:
symbolsPerSlot = 14
symbolsPerSlot = 14
Однако количество временных интервалов на подкадр изменяется и является функцией интервала между поднесущими. По мере увеличения интервала между поднесущими длительность символа OFDM уменьшается, и поэтому большее количество символов OFDM может быть установлено в фиксированную длительность подкадра, равную 1 мс.
Имеется 5 конфигураций интервалов между поднесущими . 4, причем соответствующий интервал между поднесущими 15⋅2μ кГц. В этом примере мы будем λ = 1, соответствующий интервалу между поднесущими 30 кГц:
mu = 1
mu = 1
Количество временных интервалов на подкадр составляет , так как удвоение интервала между поднесущими вдвое увеличивает длительность символа OFDM. Следует отметить, что определение слота в NR отличается от LTE: подкадр в LTE состоит из 2 слотов по 7 символов (для нормального циклического префикса), тогда как в NR подкадр, использующий интервал поднесущих LTE (0, 15 кГц), состоит из 1 слота по 14 символов.
Вычислите общее количество символов OFDM в пакете SS:
nSymbols = symbolsPerSlot * 2^mu * nSubframes
nSymbols = 140
Создайте пустую сетку для всего пакета SS:
ssburst = zeros([240 nSymbols]);
Шаблон блоков SS/PBCH в пакете SS косвенно определяется процедурой поиска соты в TS 38.213, которая описывает местоположения, в которых UE может обнаружить блок SS/PBCH. Имеется 5 блочных шаблонов, Case A - Case E, которые имеют различные расстояния между поднесущими и применимы для различных несущих частот.
Создайте индексы первых символов в возможных блоках SS/PBCH для шаблона блока Case B, который имеет 8 блоков на пакет:
n = [0, 1]; firstSymbolIndex = [4; 8; 16; 20] + 28*n; firstSymbolIndex = firstSymbolIndex(:).'
firstSymbolIndex = 1×8
4 8 16 20 32 36 44 48
Теперь может быть создан цикл, который генерирует каждый блок SS и назначает его в соответствующее местоположение пакета SS. Обратите внимание на следующее:
Код повторно использует различные переменные, созданные ранее в этом примере (PSS, SSS и 4 набора индексов).
PSS и SSS не зависят от индекса блока SS/PBCH, поэтому они могут быть преобразованы в блок SS перед закольцовыванием.
Индексы PBCH и индексы PBCH DM-RS не зависят от индекса блока SS/PBCH, поэтому не требуется обновление в цикле
, и устанавливаются в соответствии с правилами TS 38.211 разделы 7.3.3.1 и 7.4.1.4.1 для случая 8.
Каждый канал/сигнал был масштабирован, чтобы придать им различные цвета на конечном графике
ssblock = zeros([240 4]); ssblock(pssIndices) = pssSymbols; ssblock(sssIndices) = 2 * sssSymbols; for ssbIndex = 1:length(firstSymbolIndex) i_SSB = mod(ssbIndex - 1,8); ibar_SSB = i_SSB; v = i_SSB; pbchSymbols = nrPBCH(cw,ncellid,v); ssblock(pbchIndices) = 3 * pbchSymbols; dmrsSymbols = nrPBCHDMRS(ncellid,ibar_SSB); ssblock(dmrsIndices) = 4 * dmrsSymbols; ssburst(:,firstSymbolIndex(ssbIndex) + (0:3)) = ssblock; end
Наконец, постройте график содержимого пакета SS:
imagesc(abs(ssburst)); caxis([0 4]); axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); title('SS burst, block pattern Case B');

nrPBCH | nrPBCHDMRS | nrPBCHDMRSIndices | nrPBCHIndices | nrPSS | nrPSSIndices | nrSSS | nrSSSIndices