В этом примере показано, как сгенерировать и Новое радио (NR) карты 5G физические каналы и сигналы к сетке ресурса с помощью 5G Toolbox ™ функции.
Этот рисунок показывает элементы link, которые моделируются в этом примере в контексте ссылки нисходящего канала 5G. Эти элементы:
Генерация физического нисходящего канала совместно использованный канал (PDSCH) и его опорный сигнал демодуляции (DM-RS)
Предварительное кодирование MIMO и отображение PDSCH и PDSCH DM-RS к сетке ресурса
Модуляция OFDM
Задайте количество передающих антенн и создайте объект настройки несущей. Этот объект управляет размером сетки ресурса. Для простоты используйте объект настройки несущей по умолчанию.
nTxAnts = 4; carrier = nrCarrierConfig
carrier = nrCarrierConfig with properties: NCellID: 1 SubcarrierSpacing: 15 CyclicPrefix: 'normal' NSizeGrid: 52 NStartGrid: 0 NSlot: 0 NFrame: 0 Read-only properties: SymbolsPerSlot: 14 SlotsPerSubframe: 1 SlotsPerFrame: 10
Создайте объект настройки PDSCH. Этот объект задает PDSCH-связанные параметры. Задайте 16-QAM модуляцию, два слоя и полное выделение полосы. Эта настройка сопоставляет PDSCH в часть полосы пропускания (BWP) равного размера несущей. Можно также использовать этот объект задать другие параметры выделения времени и настройки DM-RS.
pdsch = nrPDSCHConfig; pdsch.Modulation = "16QAM"; pdsch.NumLayers = 2; pdsch.PRBSet = 0:carrier.NSizeGrid-1; % Full band allocation
Отобразите параметры PDSCH DM-RS и PDSCH.
pdsch
pdsch = nrPDSCHConfig with properties: NSizeBWP: [] NStartBWP: [] ReservedPRB: {[1x1 nrPDSCHReservedConfig]} ReservedRE: [] Modulation: '16QAM' NumLayers: 2 MappingType: 'A' SymbolAllocation: [0 14] PRBSet: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... ] VRBToPRBInterleaving: 0 VRBBundleSize: 2 NID: [] RNTI: 1 DMRS: [1x1 nrPDSCHDMRSConfig] EnablePTRS: 0 PTRS: [1x1 nrPDSCHPTRSConfig] Read-only properties: NumCodewords: 1
pdsch.DMRS
ans = nrPDSCHDMRSConfig with properties: DMRSConfigurationType: 1 DMRSReferencePoint: 'CRB0' DMRSTypeAPosition: 2 DMRSAdditionalPosition: 0 DMRSLength: 1 CustomSymbolSet: [] DMRSPortSet: [] NIDNSCID: [] NSCID: 0 NumCDMGroupsWithoutData: 2 Read-only properties: CDMGroups: [0 0] DeltaShifts: [0 0] FrequencyWeights: [2x2 double] TimeWeights: [2x2 double] DMRSSubcarrierLocations: [6x2 double] CDMLengths: [2 1]
Сгенерируйте индексы, чтобы сопоставить PDSCH с сеткой.
[pdschIndices,pdschInfo] = nrPDSCHIndices(carrier,pdsch);
Сгенерируйте и сопоставьте случайные биты PDSCH с символами PDSCH. Входной параметр pdschInfo.G
задает емкость в битах PDSCH, который является длиной кодовой комбинации от этапов кодирования канала. pdschInfo.G
учитывает элементы ресурса (REs), доступный для передачи PDSCH. Для простоты этот пример не включает нисходящий канал совместно использованный канал (DL-SCH) моделирование.
pdschBits = randi([0 1],pdschInfo.G,1);
Сгенерируйте символы PDSCH. Символы PDSCH хранятся в матрице размера -, где количество символов и количество слоев.
pdschSymbols = nrPDSCH(carrier,pdsch,pdschBits); size(pdschSymbols)
ans = 1×2
8112 2
Сгенерируйте символы DM-RS и индексы.
dmrsSymbols = nrPDSCHDMRS(carrier,pdsch); dmrsIndices = nrPDSCHDMRSIndices(carrier,pdsch);
Отобразите график созвездия с PDSCH и символами PDSCH DM-RS.
plot(pdschSymbols(:),"o");hold on plot(dmrsSymbols(:),"xr");hold off title("PDSCH and PDSCH DM-RS Symbols");xlabel("In-Phase Amplitude");ylabel("Quadrature Amplitude") legend("PDSCH","PDSCH DM-RS")
Примените предварительное кодирование. Измерения канала определяют веса перед кодированием (также называемый beamforming веса). Однако этот пример не демонстрирует канал распространения. Этот пример принимает, что веса перед кодированием известны.
% Precoding weights W = fft(eye(nTxAnts))/sqrt(nTxAnts); % Unitary precoding matrix w = W(1:pdsch.NumLayers,:)/sqrt(pdsch.NumLayers); % Normalize by number of layers
Матрица перед кодированием, w
, должна быть матрица размера -, где количество слоев и количество передающих антенн.
size(pdschSymbols)
ans = 1×2
8112 2
size(w)
ans = 1×2
2 4
Предварительно закодируйте символы PDSCH.
pdschSymbolsPrecoded = pdschSymbols*w;
Количество строк в pdschSymbolsPrecoded
матрица соответствует количеству символов PDSCH, и количество столбцов соответствует количеству антенн.
size(pdschSymbolsPrecoded)
ans = 1×2
8112 4
Сгенерируйте пустую сетку ресурса. Эта сетка охватывает один паз.
pdschGrid = nrResourceGrid(carrier,nTxAnts);
Когда вы сопоставляете символы PDSCH с сеткой ресурса, учитываете что индексы PDSCH, сгенерированные nrPDSCHIndices
функция относится к слоям и не антеннам. Этот формат может быть полезным, когда вы сопоставляете символы PDSCH непосредственно со слоями. В этом случае получившиеся сетки ресурса не предварительно закодированы.
Поскольку этот пример применяет предварительное кодирование к символам PDSCH прежде, чем сопоставить с сеткой ресурса, предварительно закодированные символы PDSCH сопоставлены с антеннами и не слоями. Чтобы преобразовать индексы слоя в индексы антенны, используйте nrExtractResources
функция.
[~,pdschAntIndices] = nrExtractResources(pdschIndices,pdschGrid); pdschGrid(pdschAntIndices) = pdschSymbolsPrecoded;
Отобразите сетку ресурса для первой антенны. Синий разрыв оставлен для DM-RS.
imagesc([0 carrier.SymbolsPerSlot-1],[0 carrier.NSizeGrid*12-1],abs(pdschGrid(:,:,1))); axis xy;title("Resource Grid (First Antenna) - PDSCH");xlabel("OFDM Symbol");ylabel("Subcarrier")
Предварительный код и карта символы DM-RS к сетке. Подобно индексам PDSCH индексы DM-RS относятся к слоям. Чтобы преобразовать эти слои в индексы мультиантенны, используйте nrExtractResources
функционируйте снова.
% PDSCH DM-RS precoding and mapping for p = 1:size(dmrsSymbols,2) [~,dmrsAntIndices] = nrExtractResources(dmrsIndices(:,p),pdschGrid); pdschGrid(dmrsAntIndices) = pdschGrid(dmrsAntIndices) + dmrsSymbols(:,p)*w(p,:); end
Отобразите сетку ресурса для первой антенны.
imagesc([0 carrier.SymbolsPerSlot-1],[0 carrier.NSizeGrid*12-1],abs(pdschGrid(:,:,1))); axis xy;title("Resource Grid (First Antenna) - PDSCH and PDSCH DM-RS"); xlabel("OFDM Symbol");ylabel("Subcarrier")
Отобразите один блок ресурса (RB) от сетки ресурса. Это представление масштабирует в один RB и обеспечивает подробное представление содержимого RE.
imagesc(abs(pdschGrid(1:12,:,1)));view(2) axis xy;title("Resource Block - PDSCH and PDSCH DM-RS");ylabel("Subcarrier");xlabel("OFDM Symbol")
OFDM-модулируйте сетку ресурса и отобразите форму волны временного интервала для первой антенны.
[txWaveform,waveformInfo] = nrOFDMModulate(carrier,pdschGrid); plot(abs(txWaveform(:,1)));title("Time Domain Waveform (First Antenna)");xlabel("Sample Number");ylabel("Magnitude")
waveformInfo
выведите содержит информацию о форме волны временного интервала, такой как частота дискретизации.
waveformInfo
waveformInfo = struct with fields:
Nfft: 1024
SampleRate: 15360000
CyclicPrefixLengths: [80 72 72 72 72 72 72 80 72 72 72 72 72 72]
SymbolLengths: [1104 1096 1096 1096 1096 1096 1096 1104 1096 ... ]
Windowing: 36
SymbolPhases: [0 0 0 0 0 0 0 0 0 0 0 0 0 0]
SymbolsPerSlot: 14
SlotsPerSubframe: 1
SlotsPerFrame: 10