В этом примере показано, как генерировать, агрегировать и демодулировать несколько несущих нисходящей линии связи с использованием функций 5G Toolbox™.
В этом примере генерируется сигнал NR с агрегированием несущих (CA). Для выполнения агрегирования несущих в примере вычисляются частотные смещения для случая внутреннего смежного CA, как описано в TS 38.104 Раздел 5.3A. В примере также поддерживаются настраиваемые внутриполосные несмежные и межполосные сценарии CA.
Чтобы сформировать агрегированную форму сигнала нисходящей линии связи, пример конфигурирует совместимый со стандартом фиксированный опорный канал нисходящей линии связи (FRC) для каждой компонентной несущей. TS 38.101-1 Приложение A.3 определяет FRC физического общего канала нисходящей линии связи (PDSCH) для FR1, а TS 38.101-2 Приложение A.3 определяет FRC PDSCH для FR2. Для генерации сигнала FRC можно задать полосу пропускания канала, интервал между поднесущими, модуляцию, режим дуплексирования и идентификатор соты. Для получения дополнительной информации о том, как произвести DL FRCs, посмотрите 5G НОМЕР ТМ и Поколения Формы волны FRC.
После генерации компонентных несущих (КУ) в примере повторная выборка форм сигнала на общую частоту дискретизации и объединение КУ для генерации агрегированной формы сигнала.
Наконец, пример фильтрует и понижает выборку выбранного CC для выполнения измерений EVM и декодирования PDSCH.

Вектор ChannelBandwidths определяет полосу пропускания для каждого CC. Длина этого вектора соответствует количеству КЦ. Элементы ChannelBandwidths должны находиться в наборе {5, 10, 15, 20, 25, 30, 40, 50, 60, 70, 80, 90 100} МГц для FR1 и в наборе {50, 100, 200, 400} МГц для FR2. TS 38.101-1 Таблиц 5.5A.1-1 Раздела 5.5A.1 и TS 38.101-2 списков Таблицы 5.5A.1-1 Раздела 5.5A.1 действительные комбинации пропускной способности для FR1 и скопления перевозчика FR2, соответственно.
Если ccSpacings вектор пуст, в примере вычисляются расстояния между последовательными несущими, ccSpacings, как описано в TS 38.104. Чтобы выбрать выбранные расстояния, добавьте их в ccSpacings вектор.
% Configure three carriers for the aggregation. You can select a different % number of carriers by modifying the number of elements in the % |channelBandwidths|, |SCSs|, |modulations|, and |nCellIDs| vectors. frequencyRange = 'FR1'; % (FR1 or FR2) channelRaster = 100; % Channel raster in kHz (15, 60 or 100) channelBandwidths = [60 40 40]; % Channel bandwidths in MHz % (5, 10, 15, 20, 25, 30, 40, 50, 60, 70, 80, % 90 or 100 for FR1) % (50, 100, 200 or 400 for FR2) SCSs = [30 30 30]; % Subcarrier spacings in kHz % (15, 30 or 60 for FR1) % (60 or 120 for FR2) modulations = {'QPSK' '64QAM' '256QAM'}; % ('QPSK', '64QAM' or '256QAM' for FR1) % ('QPSK', '16QAM' or '64QAM' for FR2) nCellIDs = [1 2 3]; % Cell IDs duplexMode = 'TDD'; % Duplex mode ('TDD' or 'FDD') sv = '15.2.0'; % Standard version ('15.1.0', '15.2.0' or '15.7.0') numSubframes = 10; % Number of subframes to generate per carrier % Choose the spacings between consecutive carriers, |ccSpacings|, or leave % the vector empty for calculating the spacings, as described in TS 38.104 % Section 5.3A ccSpacings = []; % MHz % Select the CC to demodulate CCofInterest = 2; % Verify the number of CCs, channel bandwidths, subcarrier spacings, % modulations, and spacings. Additionally, check that the spacings are % greater than 0. hNRVerifyCarrierParameters(length(channelBandwidths),length(SCSs),... length(modulations),length(nCellIDs),ccSpacings);
Создание структуры конфигурации для каждого CC с помощью hNRReferenceWaveformGenerator. Сохраните структуры конфигурации для всех CCs в массиве ячеек.
% Establish the number of component carriers numCC = length(channelBandwidths); % CC configuration referenceChannel = cell(1,numCC); wavegen = cell(1,numCC); for i = 1:numCC % Select a reference channel, FRC, based on the chosen modulation and % frequency range referenceChannel{i} = strcat('DL-FRC-',frequencyRange,'-',modulations{i}); % Create a generator object for the above PDSCH FRC reference channel wavegen{i} = hNRReferenceWaveformGenerator(referenceChannel{i},... channelBandwidths(i),SCSs(i),duplexMode,nCellIDs(i),sv); end
Для выполнения агрегирования несущих необходимо вычислить частотные параметры, описанные в TS 38.104, разделы 5.3 и 5.4.

Fc_offset - вектор, содержащий центральную частоту каждого CC в основной полосе
F_offset_low - смещение частоты от нижнего Fc_offset к нижней границе агрегированной полосы пропускания
F_offset_high - смещение частоты от верхнего Fc_offset к верхней границе полосы пропускания агрегированного канала
F_edge_low - нижний край полосы пропускания агрегированного канала
F_edge_high - верхний край полосы пропускания агрегированного канала
BW_channel_CA - агрегированная полоса пропускания канала для всех CCs
Центрировать компонент нижней несущей на основной полосе (Fc_offset(1) = 0 Гц) и вычислить центральную частоту для остальных CCs. Для определения центральных частот с помощью метода, описанного в TS 38.104 Раздел 5.3A, необходимо рассчитать минимальные полосы защиты и минимальные расстояния CC. Либо для выбора собственных центральных частот выберите непустую ccSpacings вектор.
% Get the largest SCS configuration, |SCSConfig|, among the SCS % configurations supported for each two consecutive channel bandwidths to % obtain the minimum guardband, as described in TS 38.104 Section 5.4.1.2. table = hGetGBTable(frequencyRange); % Minimum guardband table if isequal(frequencyRange,'FR1') if any(channelBandwidths(:) == 5) SCSConfig = 1; else SCSConfig = 2; end else SCSConfig = 3; end % Calculate the minimum guardband, as described in TS 38.104 Section 5.3.3 % Table 5.3.3-1 for FR1 and Table 5.3.3-1 for FR2, to obtain the minimum CC % spacings. minimumGuardBand = zeros(1,numCC); NDLRB = zeros(1,numCC); scs = strcat(num2str(2^SCSConfig*15),'kHz'); % Common SCS in kHz to extract % minimum guardband for i = 1:numCC NDLRB(i) = wavegen{i}.Config.SCSCarriers{1}.NSizeGrid; minimumGuardBand(i) = table{{scs},{strcat(num2str(channelBandwidths(i)),... 'MHz');}}; % kHz minimumGuardBand(i) = minimumGuardBand(i)*1e-3; % MHz end % Compute the minimum CC spacings, as defined in TS 38.104 Section % 5.4.1.2. Use these spacings to calculate the center frequencies and for % filtering each CC. minCCSpacings = zeros(1,numCC-1); % Minimum CC spacing for k = 2:numCC minCCSpacings(k-1) = hNRCarrierAggregationChannelSpacing( ... channelBandwidths(k-1), channelBandwidths(k), minimumGuardBand(k-1), ... minimumGuardBand(k),channelRaster,SCSConfig); % MHz end % Determine the center frequency for each CC with respect to 0 Hz. % Initially, the lower carrier frequency is at baseband (Fc_offset(1) = 0 Hz). Fc_offset = zeros(1,numCC); if isempty(ccSpacings) ccSpacings = minCCSpacings; end for k = 2:numCC Fc_offset(k) = Fc_offset(k-1) + ccSpacings(k-1); % MHz end
Вычислите смещения частоты от нижней и верхней центральных частот к нижней и верхней границам агрегированной полосы пропускания соответственно, как описано в TS 38.104 Раздел 5.3A.
F_offset_low = (NDLRB(1)*12+1)*(SCSs(1)*1e-3)/2 + minimumGuardBand(1); % MHz F_offset_high = (NDLRB(end)*12-1)*(SCSs(end)*1e-3)/2 + minimumGuardBand(end); %MHz
Вычислите нижний и верхний края агрегированной полосы пропускания канала, TS 38.104 Section 5.3A.
F_edge_low = Fc_offset(1) - F_offset_low; % MHz F_edge_high = Fc_offset(end) + F_offset_high; % MHz
Вычислите полосу пропускания агрегированного канала, TS 38.104 Section 5.3A
BW_channel_CA = F_edge_high - F_edge_low; % MHz fprintf('BW_channel_CA: %0.4f MHz\n',BW_channel_CA);
BW_channel_CA: 141.0800 MHz
Определите сдвиг частоты для центрирования полосы пропускания агрегированного канала на основной полосе частот (0 Гц).
shiftToCenter = -1*(BW_channel_CA/2 + F_edge_low); % Center aggregated bandwidth at baseband Fc_offset = Fc_offset + shiftToCenter; F_edge_low = Fc_offset(1) - F_offset_low; F_edge_high = Fc_offset(end) + F_offset_high; % Display frequency band edges fprintf('F_edge_low: %0.4f MHz\n',F_edge_low);
F_edge_low: -70.5400 MHz
fprintf('F_edge_high: %0.4f MHz\n',F_edge_high);F_edge_high: 70.5400 MHz
fprintf('F_offset_low: %0.4f MHz\n',F_offset_low);F_offset_low: 30.7050 MHz
fprintf('F_offset_high: %0.4f MHz\n',F_offset_high);F_offset_high: 20.6750 MHz
% Display carrier frequencies fprintf('\n'); for i = 1:numCC fprintf('Component Carrier %d:\n',i); fprintf(' Fc: %0.4f MHz\n', Fc_offset(i)); end
Component Carrier 1:
Fc: -39.8350 MHz
Component Carrier 2:
Fc: 9.9650 MHz
Component Carrier 3:
Fc: 49.8650 MHz
Вычислите требуемые коэффициенты избыточной выборки для каждого носителя компонентов, OSRsдля использования общей частоты дискретизации для агрегированной формы сигнала.
% Obtain sample rates of the component carriers CCSR = zeros(1,numCC); carriers = cell(1,numCC); for i = 1:numCC carriers{i} = nrCarrierConfig; carriers{i}.NCellID = nCellIDs(i); carriers{i}.NSizeGrid = NDLRB(i); carriers{i}.SubcarrierSpacing = SCSs(i); carriers{i}.CyclicPrefix = wavegen{i}.Config.BandwidthParts{1}.CyclicPrefix; info = nrOFDMInfo(carriers{i}); CCSR(i) = info.SampleRate; % Hz end % Calculate the oversampling ratio for the largest BW CC to ensure the % waveform occupies a maximum of 85% of the total bandwidth, |bwfraction| bwfraction = 0.85; % Bandwidth utilization of 85% OSR = (BW_channel_CA/bwfraction)/(max(CCSR)/1e6); % To simplify the resampling operation, choose an oversampling ratio which % is a power of 2: calculate the next power of two above OSR OSR = 2^ceil(log2(OSR)); % Calculate the overall sample rate for the aggregated waveform SR = OSR*max(CCSR); % Hz fprintf('\nOutput sample rate: %0.4f Ms/s\n\n',SR/1e6);
Output sample rate: 245.7600 Ms/s
% Calculate the individual oversampling factors for the component carriers
OSRs = SR./CCSR;Позвоните в generateWaveform функции из hNRReferenceWaveformGenerator вспомогательный файл для генерации формы сигнала для каждого CC. Повторная выборка каждой несущей на общую частоту дискретизации, частотная модуляция несущих на соответствующую центральную частоту и, наконец, агрегирование C для формирования комбинированной формы сигнала.
% Generate and aggregate the component carriers waveform = 0; tmwaveinfo = cell(1,numCC); waveInfo = cell(1,numCC); resourcesInfo = cell(1,numCC); frequencyShifter = comm.PhaseFrequencyOffset('SampleRate',SR); for i = 1:numCC % Generate each CC [wf,waveInfo{i},resourcesInfo{i}] = generateWaveform(wavegen{i},... numSubframes); % Resample the CCs so that they have the same sample rate wf = resample(wf,OSRs(i),1)/OSRs(i); % Frequency modulate each CC to the appropiate center frequency frequencyShifter.FrequencyOffset = Fc_offset(i)*1e6; wf = frequencyShifter(wf); frequencyShifter.release(); % Aggregate the CCs to form the combined signal waveform = waveform + wf; end
Отображение спектра агрегированного сигнала несущей с помощью hNRCarrierAggregationPlotSpectrum функция помощника. График спектра показывает отдельные полосы частот несущих. Этот пример не преобразует сигнал с повышением частоты в радиочастотный (RF), центр агрегированной полосы частот находится на полосе частот (0 Гц).
specPlot = hNRCarrierAggregationPlotSpectrum(waveform,SR,... 'Power Spectrum of Carrier Aggregation',{'Signal spectrum'});

Выберите CC, затем демодулируйте, фильтруйте и понижайте выборку CC по своему выбору, следуя этим шагам.
Перевод CC на основную полосу (0 Гц)
Вычисление частот полосы пропускания и полосы останова фильтра
Выполните фильтрацию соседних CCs с помощью разработанного фильтра и выполните понижающую выборку CC.
% Verify carrier of interest ID if CCofInterest > numCC || CCofInterest <= 0 || mod(CCofInterest,1) ~= 0 error('nr5g:NRDownlinkCarrierAggregationExample:CCOutOfRange',... 'Cannot demodulate CC number %d, choose an integer number that falls between 1 and %d\n',... CCofInterest, numCC) ; end fprintf(1,'Extracting CC number %d: \n', CCofInterest);
Extracting CC number 2:
% Define downsampling filter order filterOrder = 201; % Precalculate the filter passband and stopband values for all CC firPassbandVec = (NDLRB*12-1).*(SCSs*1e-3)/2 / (SR/1e6/2); firStopbandVec = hNRCarrierAggregationStopband(minCCSpacings,NDLRB,SR,SCSs); % Choose the passband and stopband values for the carrier of interest firPassband = firPassbandVec(CCofInterest); firStopband = firStopbandVec(CCofInterest); % Pad signal with zeros to consider filter transient response length waveform = [waveform; zeros(filterOrder*2,size(waveform,2))]; % Center the carrier of interest at 0 Hz frequencyShifter.FrequencyOffset = -Fc_offset(CCofInterest)*1e6; demodulatedCC = frequencyShifter(waveform); % To ease the filter design requirements, apply the downsampling in two % stages if necessary. Use a downsampling factor of 4 in the initial stage. % If the quality of the resulting signal is not as required, consider a % different filter design in this initial stage. if (firStopband < 0.1) % Downsample by 4 in the initial stage SRC = 4; demodulatedCC = resample(demodulatedCC,1,SRC); % Update passband and stopband values firPassband = firPassband * SRC; firStopband = firStopband * SRC; else % Do not apply an extra downsampling SRC = 1; end % Design the lowpass filter to filter out the CC of your choice frEdges = [0 firPassband firStopband 1]; firFilter = dsp.FIRFilter; firFilter.Numerator = firpm(filterOrder,frEdges,[1 1 0 0]); % Display the response of the designed filter fvtool(firFilter,'Analysis','freq');

% Filter the signal to extract the component of interest rxWaveform = firFilter(demodulatedCC); % Plot the demodulated and filtered spectra filteredSpecPlot = ... hNRCarrierAggregationPlotSpectrum([demodulatedCC, rxWaveform],SR,... 'Demodulated and Filtered Waveform Power Spectrum',... {'Carrier aggregated signal' 'Filtered signal'});

% Downsample the filtered carrier to its baseband rate
rxWaveform = downsample(rxWaveform,OSRs(CCofInterest)/SRC); hNRPDSCHEVM вспомогательная функция возвращает PDSCH EVM посредством выполнения синхронизации, демодуляции OFDM, оценки канала и выравнивания. Функция отображает EVM для каждого слота и кадра и общее усреднение EVM по всей входной форме сигнала. Функция также строит графики: EVM на символ OFDM, слот, поднесущую и общую EVM.
% Parameterize the channel estimator configuration using the structure |cfg| cfg = struct(); cfg.Evm3GPP = true; % To measure EVM as defined in TS 38.104, Annex B(FR1) % / Annex C(FR2) set |Evm3GPP| to |true|. cfg.TargetRNTIs = []; cfg.PlotEVM = true; cfg.DisplayEVM = true; cfg.Label = wavegen{CCofInterest}.ConfiguredModel{1}; % Perform EVM measurements and plot results [evmInfo,eqSym,refSym] = hNRPDSCHEVM(wavegen{CCofInterest}.Config,... rxWaveform,cfg);
Low edge RMS EVM, Peak EVM, slot 1: 3.092 8.591% High edge RMS EVM, Peak EVM, slot 1: 2.795 8.020% Low edge RMS EVM, Peak EVM, slot 2: 2.996 8.556% High edge RMS EVM, Peak EVM, slot 2: 2.774 7.533% Low edge RMS EVM, Peak EVM, slot 3: 3.114 9.851% High edge RMS EVM, Peak EVM, slot 3: 2.796 7.604% Low edge RMS EVM, Peak EVM, slot 4: 2.972 8.648% High edge RMS EVM, Peak EVM, slot 4: 2.784 7.600% Low edge RMS EVM, Peak EVM, slot 5: 2.949 8.783% High edge RMS EVM, Peak EVM, slot 5: 2.774 7.659% Low edge RMS EVM, Peak EVM, slot 6: 3.079 9.422% High edge RMS EVM, Peak EVM, slot 6: 2.783 7.265% Low edge RMS EVM, Peak EVM, slot 10: 3.118 10.700% High edge RMS EVM, Peak EVM, slot 10: 2.779 8.086% Low edge RMS EVM, Peak EVM, slot 11: 3.070 9.473% High edge RMS EVM, Peak EVM, slot 11: 2.767 7.837% Low edge RMS EVM, Peak EVM, slot 12: 3.053 8.774% High edge RMS EVM, Peak EVM, slot 12: 2.780 7.284% Low edge RMS EVM, Peak EVM, slot 13: 2.993 8.781% High edge RMS EVM, Peak EVM, slot 13: 2.792 7.980% Low edge RMS EVM, Peak EVM, slot 14: 2.981 8.352% High edge RMS EVM, Peak EVM, slot 14: 2.789 7.437% Low edge RMS EVM, Peak EVM, slot 15: 2.930 8.303% High edge RMS EVM, Peak EVM, slot 15: 2.791 7.852% Low edge RMS EVM, Peak EVM, slot 16: 3.023 8.961% High edge RMS EVM, Peak EVM, slot 16: 2.788 7.686% Averaged low edge RMS EVM, frame 0: 3.029% Averaged high edge RMS EVM, frame 0: 2.784% Averaged RMS EVM frame 0: 3.029%



Averaged overall RMS EVM: 3.029% Overall Peak EVM = 10.7004%
Декодируйте PDSCH восстановленного сигнала и проверьте результирующий CRC на наличие ошибок.
% Perform time synchronization on the input waveform offset = nrTimingEstimate(carriers{CCofInterest},rxWaveform,... waveInfo{CCofInterest}.ResourceGridBWP); rxWaveform = rxWaveform(1+offset:end,:); % Perform OFDM demodulation rxGrid = nrOFDMDemodulate(carriers{CCofInterest},rxWaveform); % Get the allocated slots and OFDM symbols per slot allocatedSlots = zeros(1,size(resourcesInfo{CCofInterest}.WaveformResources.PDSCH.Resources,2)); for i=1:length(allocatedSlots) allocatedSlots(i) = resourcesInfo{CCofInterest}.WaveformResources.PDSCH.Resources(i).NSlot; end L = carriers{CCofInterest}.SymbolsPerSlot; % OFDM symbols per slot % Create a DLSCH decoder System object decodeDLSCH = nrDLSCHDecoder; decodeDLSCH.MultipleHARQProcesses = false; decodeDLSCH.TargetCodeRate = wavegen{CCofInterest}.Config.PDSCH{1}.TargetCodeRate; decodeDLSCH.LDPCDecodingAlgorithm = 'Layered belief propagation'; decodeDLSCH.MaximumLDPCIterationCount = 6; for NSlot=1:length(allocatedSlots) % Extract slot SlotID = allocatedSlots(NSlot); rxSlot = rxGrid(:,(1:L)+(SlotID*L),:); refSlot = waveInfo{CCofInterest}.ResourceGridBWP(:,(1:L)+(SlotID*L),:); % Perform channel estimation [estChannelGrid,noiseEst] = nrChannelEstimate(carriers{CCofInterest},... rxSlot,refSlot); % Get PDSCH resource elements from the received grid and channel estimate pdschIndices = resourcesInfo{CCofInterest}.WaveformResources.PDSCH.Resources(NSlot).ChannelIndices; [pdschRx,pdschHest] = nrExtractResources(pdschIndices,rxSlot,estChannelGrid); % Perform equalization [pdschEq,csi] = nrEqualizeMMSE(pdschRx,pdschHest,noiseEst); % Perform layer demapping, symbol demodulation, and descrambling modulation = wavegen{CCofInterest}.Config.PDSCH{1}.Modulation; RNTI = wavegen{CCofInterest}.Config.PDSCH{1}.RNTI; [dlschLLRs,rxSymbols] = nrPDSCHDecode(pdschEq,modulation,... carriers{CCofInterest}.NCellID,RNTI,noiseEst); % Scale LLRs by CSI csi = nrLayerDemap(csi); % CSI layer demapping NumCW = size(resourcesInfo{CCofInterest}.WaveformResources.PDSCH.Resources(NSlot).Codeword,2); for cwIdx = 1:NumCW Qm = length(dlschLLRs{cwIdx})/length(rxSymbols{cwIdx}); % Bits per symbol csi{cwIdx} = repmat(csi{cwIdx}.',Qm,1); % Expand by each bit per symbol dlschLLRs{cwIdx} = dlschLLRs{cwIdx} .* csi{cwIdx}(:); % Scaled symbols end % Calculate the transport block sizes for the codewords in the slot trBlkSize = resourcesInfo{CCofInterest}.WaveformResources.PDSCH.Resources(NSlot).TransportBlockSize; % Decode the DL-SCH transport channel decodeDLSCH.TransportBlockLength = trBlkSize; NLayers = wavegen{CCofInterest}.Config.PDSCH{1}.NumLayers; RVSequence = wavegen{CCofInterest}.Config.PDSCH{1}.RVSequence; [decbits,crc] = decodeDLSCH(dlschLLRs,modulation,NLayers,RVSequence); % Display the CRC status if crc disp(['Slot ' num2str(SlotID) ': CRC failed']); else disp(['Slot ' num2str(SlotID) ': CRC passed']); end end
Slot 1: CRC passed Slot 2: CRC passed Slot 3: CRC passed Slot 4: CRC passed Slot 5: CRC passed Slot 6: CRC passed Slot 10: CRC passed Slot 11: CRC passed Slot 12: CRC passed Slot 13: CRC passed Slot 14: CRC passed Slot 15: CRC passed Slot 16: CRC passed
3GPP ТС 38.104 "НР; радиопередача и прием базовой станции (BS) "Проект партнерства 3-го поколения; Техническая спецификация на сеть радиодоступа группы.
3GPP ТС 38.101-1 "НР; радиопередача и прием пользовательского оборудования (UE); Часть 1: Автономный диапазон 1. "Проект партнерства 3-го поколения; Техническая спецификация на сеть радиодоступа группы.
3GPP ТС 38.101-2 "НР; радиопередача и прием пользовательского оборудования (UE): Часть 2: Диапазон 2 Автономный "Проект партнерства 3-го поколения; Техническая спецификация на сеть радиодоступа группы.