В этом примере показано, как можно генерировать, агрегировать и демодулировать несколько несущих восходящей линии связи с использованием Toolbox™ LTE. Величина вектора ошибок (EVM) и внутриполосные излучения измеряются для демодулированной несущей в соответствии с TS 36.101 Приложение F [1].
В этом примере моделируется сигнал восходящей линии связи LTE с агрегированием несущих (CA). В качестве параметра можно указать количество компонентных несущих (СС) и их соответствующие полосы пропускания. Внутриполосный смежный случай CA рассматривается в соответствии с TS 36.101 V15.4.0.
Для формирования агрегированной формы сигнала восходящей линии связи пользовательское оборудование (UE) конфигурируется для каждой компонентной несущей. Параметры агрегирования несущих вычисляются и используются для генерации модулированной формы сигнала для каждой конфигурации CC. Все сигналы, модулированные компонентными несущими, повторно дискретизируются на общую частоту дискретизации, так что они могут быть объединены для создания агрегированного сигнала. Агрегированный сигнал демодулируют и фильтруют, чтобы извлечь интересующую компонентную несущую. Затем измеряют EVM и внутриполосные излучения для этого CC и, наконец, выполняют CRC-проверку посредством выполнения декодирования PUSCH.
Вектор NULRB определяет количество блоков ресурсов (RB) для каждой компонентной несущей. Длина этого вектора соответствует количеству КЦ. Элементы NULRB должны находиться в наборе {6, 15, 25, 50, 75, 100} RB. TS 36.101 В таблице 5.6A.1-1 [1] перечислены допустимые комбинации полос пропускания для агрегирования несущих.
% Configure the set of NULRB values to describe the carriers to be % aggregated NULRB = [50 75 100]; % Establish the number of component carriers numCC = numel(NULRB); CCBWs = zeros(1,numCC); if numCC<2 error('Please specify more than one CC bandwidth value.'); end
Для каждого CC создается структура конфигурации с использованием lteRMCUL. Для демонстрации внутриполосных выбросов рассматривается частичное распределение RB для каждого CC. Структуры конфигурации для всех CC хранятся в массиве ячеек.
% Specify the number of subframes to generate numSubframes = 10; % Configure CCs frc = cell(1,numCC); for i = 1:numCC switch NULRB(i) case 6 frc{i} = lteRMCUL('A3-1'); frc{i}.PUSCH.PRBSet = (0:2).'; case 15 frc{i} = lteRMCUL('A1-2'); frc{i}.PUSCH.PRBSet = (0:8).'; case 25 frc{i} = lteRMCUL('A1-3'); frc{i}.PUSCH.PRBSet = (0:15).'; case 50 frc{i} = lteRMCUL('A3-5'); frc{i}.PUSCH.PRBSet = (0:39).'; case 75 frc{i} = lteRMCUL('A3-6'); frc{i}.PUSCH.PRBSet = (0:59).'; case 100 frc{i} = lteRMCUL('A3-7'); frc{i}.PUSCH.PRBSet = (0:80).'; otherwise fprintf('Not a valid number of resource blocks: %d\n',... NULRB(i)); return end CCBWs(i) = hNRBToBandwidth(NULRB(i)); frc{i}.Bandwidth = CCBWs(i); frc{i}.TotSubframes = numSubframes; frc{i}.PUSCH.RVSeq = 0; end
Блок оценки канала на стороне приемника параметризуется с использованием структуры cec определено ниже.
cec = struct; % Channel estimation config structure cec.PilotAverage = 'UserDefined'; % Type of pilot symbol averaging cec.FreqWindow = 15; % Frequency window size cec.TimeWindow = 15; % Time window size cec.InterpType = 'Cubic'; % 2D interpolation type cec.InterpWindow = 'Centered'; % Interpolation window type cec.InterpWinSize = 1; % Interpolation window size cec.Reference = 'Antennas'; % Specifies point of reference for % channel estimation.
Для выполнения агрегирования несущих вычисляются частотные параметры, описанные в TS 36.101, разделах 5.6 и 5.7 [1]. Эти параметры суммированы на следующем рисунке.

Это приводит к трем переменным:
F_c - вектор, содержащий центральную частоту каждого CC
ccSpacing содержит интервал между CCs в МГц
BW_channel_CA - агрегированная полоса пропускания канала для всех CCs
В приведенном ниже коде мы сначала вычисляем значение для всех CCs, предполагая, что нижняя из них центрирована в основной полосе частот (0 Гц). Один раз BW_channel_CA вычисляется, все значения сдвигаются таким образом, что центр агрегированной полосы пропускания располагается на полосе частот (0 Гц).
% Define Delta_f1 parameter in MHz for nominal guard band and frequency % offset calculations. In the uplink Delta_f1 is zero % (TS 36.101, Table 5.6A-1) Delta_f1 = 0; % in MHz maxBW = max(CCBWs); % Initialize center frequency and CC spacing vectors F_c = zeros(1,numCC); % Center frequencies ccSpacing = zeros(1,numCC-1); % CC spacing % Calculate nominal guard band, TS 36.101 5.6A-1 nominalGuardBand = 0.05*maxBW-0.5*Delta_f1; % Initially assume lower carrier frequency is at baseband F_c(1) = 0; % Calculate CC spacing and center frequencies for k = 2:numCC ccSpacing(k-1) = hCarrierAggregationChannelSpacing( ... frc{k-1}.Bandwidth, frc{k}.Bandwidth); F_c(k) = F_c(k-1) + ccSpacing(k-1); end % Calculate lower and higher frequency offsets, TS 36.101 5.6A F_offset_low = (0.18*NULRB(1)+Delta_f1)/2 + nominalGuardBand; F_offset_high = (0.18*NULRB(end)+Delta_f1)/2 + nominalGuardBand; % Calculate lower and higher frequency edges, TS 36.101 5.6A F_edge_low = F_c(1) - F_offset_low; F_edge_high = F_c(end) + F_offset_high; % Calculate aggregated channel bandwidth, TS 36.101 5.6A BW_channel_CA = F_edge_high - F_edge_low; fprintf('BW_channel_CA: %0.4f MHz\n',BW_channel_CA); % Calculate shift to center baseband shiftToCenter = -1*(BW_channel_CA/2 + F_edge_low); % Shift the center frequencies so that the aggregated bandwidth is centered % at baseband F_c = F_c + shiftToCenter; F_edge_low = F_c(1) - F_offset_low; F_edge_high = F_c(end) + F_offset_high; % Display frequency band edges fprintf('F_edge_low: %0.4f MHz\n',F_edge_low); fprintf('F_edge_high: %0.4f MHz\n',F_edge_high); fprintf('F_offset_low: %0.4f MHz\n',F_offset_low); fprintf('F_offset_high: %0.4f MHz\n',F_offset_high); % Display carrier frequencies fprintf('\n'); for i = 1:numCC fprintf('Component Carrier %d:\n',i); fprintf('Fc: %0.4f MHz\n', F_c(i)); end
BW_channel_CA: 44.6000 MHz F_edge_low: -22.3000 MHz F_edge_high: 22.3000 MHz F_offset_low: 5.5000 MHz F_offset_high: 10.0000 MHz Component Carrier 1: Fc: -16.8000 MHz Component Carrier 2: Fc: -4.8000 MHz Component Carrier 3: Fc: 12.3000 MHz
Требуемые коэффициенты избыточной выборки для каждого несущего элемента OSRs вычисляют для общей частоты дискретизации для агрегированного сигнала.
% Considering the bandwidth utilization as 85% bwfraction = 0.85; % Calculate sampling rates of the component carriers CCSR = zeros(1,numCC); for i = 1:numCC info = lteSCFDMAInfo(frc{i}); CCSR(i) = info.SamplingRate; end % Calculate overall sampling rate for the aggregated signal % Calculate the oversampling ratio (for the largest BW CC) to make sure the % signal occupies 85% (bwfraction) of the aggregated channel bandwidth OSR = (BW_channel_CA/bwfraction)/(max(CCSR)/1e6); % To simplify the resampling operation, choose an oversampling ratio as the % smallest power of 2 greater than or equal to OSR OSR = 2^ceil(log2(OSR)); SR = OSR*max(CCSR); fprintf('\nOutput sample rate: %0.4f Ms/s\n\n',SR/1e6); % Calculate individual oversampling factors for the component carriers OSRs = SR./CCSR;
Output sample rate: 61.4400 Ms/s
lteRMCULTool используется для генерации формы сигнала для каждого CC. Они повторно дискретизируются до общей частоты дискретизации, модулируются до соответствующей центральной частоты и, наконец, суммируются для формирования агрегированного сигнала.
% Generate component carriers tx = cell(1,numCC); for i = 1:numCC tx{i} = lteRMCULTool(frc{i},randi([0 1],1000,1)); tx{i} = resample(tx{i},OSRs(i),1)/OSRs(i); tx{i} = hCarrierAggregationModulate(tx{i},SR,F_c(i)*1e6); end % Superpose the component carriers waveform = tx{1}; for i = 2:numCC waveform = waveform + tx{i}; end
Спектр мощности агрегированного сигнала несущей отображается с помощью hHPaggregationPlotSpectrum.m. В спектре видны отдельные полосы частот несущих. Следует отметить, что центр агрегированной полосы пропускания расположен на основной полосе частот (0 Гц), поскольку в этом примере сигнал не модулируется на РЧ.
specPlot = hCarrierAggregationPlotSpectrum(waveform,SR,... 'Power Spectrum of Carrier Aggregation Waveform',... {'Carrier aggregated signal'});

В этом разделе показано, как демодулировать, фильтровать и понижать выборку одного из интересующих CC. Следующие шаги:
Демодулируйте интересующий CC и переведите его в основную полосу (0 Гц).
Фильтрация соседних CCs и понижение выборки. Подходящий фильтр предназначен для удаления нежелательных соседних CCs в процессе понижающей дискретизации. Конструкция фильтра будет влиять на качество и EVM восстановленного сигнала. Фильтры могут нуждаться в сдвиге для различных значений полосы пропускания и CC для демодуляции.
Мы начинаем с выбора CC для демодуляции и конструирования соответствующего фильтра понижающей дискретизации с вычисленными частотами полосы пропускания и полосы останова.
% Select CC to demodulate CCofInterest = 1; if CCofInterest > numCC || CCofInterest <= 0 error('Cannot demodulate CC number %d, there are %d CCs\n',... CCofInterest, numCC) ; end % Define downsampling filter order filterOrder = 301; % Precalculate passband and stopband values for all CC firPassbandVec = (0.18*NULRB+Delta_f1)/2 / (SR/1e6/2); firStopbandVec = hCarrierAggregationStopband(ccSpacing,NULRB,SR); % Define passband and stopband for carrier of interest firPassband = firPassbandVec(CCofInterest); firStopband = firStopbandVec(CCofInterest); % Extract and decode CC of interest fprintf(1,'Extracting CC number %d: \n', CCofInterest); % Pad signal with zeros to take into account filter transient response % length waveform = [waveform; zeros(filterOrder+1,size(waveform,2))]; % Demodulate carrier of interest demodulatedCC = ... hCarrierAggregationModulate(waveform,SR,-F_c(CCofInterest)*1e6); % Downsampling is done in two stages if the filter is too narrow. This % eases the filter design requirements. If this is the case an initial % downsampling factor of 4 is applied. You may want to consider a different % filter design in this initial stage if the quality of the resulting % signal is not acceptable. if (firStopband < 0.1) % Down-sample by 4 SRC = 4; demodulatedCC = resample(demodulatedCC,1,SRC); % Update pass and stopband to take first downsampling into account firPassband = firPassband * SRC; firStopband = firStopband * SRC; else % No pre-filter SRC = 1; end % Design lowpass filter to filter out CC of interest frEdges = [0 firPassband firStopband 1]; firFilter = dsp.FIRFilter; firFilter.Numerator = firpm(filterOrder,frEdges,[1 1 0 0]);
Extracting CC number 1:
Отображается отклик разработанного фильтра.
fvtool(firFilter,'Analysis','freq');

Затем демодулированный сигнал фильтруется для извлечения представляющей интерес СС. На графике изображен спектр демодулированного сигнала до и после фильтрации.
% Filter the signal to extract the component of interest rxWaveform = firFilter(demodulatedCC); % Plot the demodulated and filtered signal spectra filteredSpecPlot = ... hCarrierAggregationPlotSpectrum([demodulatedCC, rxWaveform],SR,... 'Power Spectrum of Demodulated and Filtered Waveform',... {'Carrier aggregated signal' 'Filtered signal'});

В этот момент отфильтрованная форма сигнала может быть понижена до его скорости основной полосы частот.
rxWaveform = downsample(rxWaveform,OSRs(CCofInterest)/SRC);
Синхронизация применяется к результирующему сигналу перед измерением EVM и внутриполосных излучений.
% Get the parameters for CC of interest FRC = frc{CCofInterest}; PUSCH = FRC.PUSCH; % Synchronize received waveform offset = lteULFrameOffset(FRC,PUSCH,rxWaveform); rxWaveform = rxWaveform(1+offset:end, :);
Приведенный ниже код обеспечивает расчет выбросов PUSCH EVM, PUSCH DRS EVM и внутриполосный расчет с использованием hPUSCHEVM.
EVM - это разность между восстановленными идеальными символами и измеренными принятыми символами в течение одного интервала измерения временного интервала во временной области. Процесс восстановления идеальных символов включает в себя:
Демодуляция множественного доступа с частотным разделением каналов с одной несущей (SC-FDMA) для получения принятой сетки ресурсов
Оценка канала
Выравнивание PUSCH
Демодуляция символов
Декодирование с последующим повторным кодированием принятых битов, перескремблированием и повторной модуляцией
Среднее EVM измеряется во времени в двух местоположениях (низком и высоком, которые обозначаются как
и),
где низкое и высокое местоположения соответствуют выравниванию окна БПФ в начале и конце циклического префикса. LTE Toolbox требует, чтобы в качестве доли длины циклического префикса указывались нижние и верхние местоположения.
Внутриполосные излучения являются мерой помех, попадающих в нераспределенные БР. Внутриполосные излучения вычисляются для каждого
и номера слота, где
- начальный сдвиг частоты между выделенным RB и измеренным нераспределенным RB (например,
для первого соседнего RB вне выделенной полосы пропускания).
Из приведенных выше измерений также получены следующие графики:
EVM в сравнении с символом OFDM
EVM в сравнении с поднесущей
EVM в сравнении с блоком ресурсов
EVM в сравнении с символом OFDM и поднесущей (т.е. сеткой ресурсов EVM)
Восходящие внутриполосные излучения для нераспределенных RB
Следует отметить, что измерения EVM, отображаемые в окне команд, вычисляются только для выделенных блоков ресурсов PUSCH в соответствии со стандартом LTE. Графики EVM показаны на всех блоках ресурсов (выделенных или нераспределенных), что позволяет просматривать внутриполосные выбросы. В нераспределенных блоках ресурсов EVM вычисляется в предположении, что принятые элементы ресурсов имеют ожидаемое значение, равное нулю.
PUSCH восстановленного сигнала затем декодируется, и результирующий CRC проверяется на наличие ошибок.
% Configure channel estimation structure for EVM measurement cecEVM = cec; cecEVM.PilotAverage = 'TestEVM'; [evmpusch, evmdrs, emissions, plots] = hPUSCHEVM(frc{CCofInterest},cecEVM,rxWaveform); % Plot the absolute in-band emissions if (~isempty(emissions.DeltaRB)) hPUSCHEVMEmissionsPlot(emissions); end % Perform SC-FDMA demodulation rxGrid = lteSCFDMADemodulate(FRC,rxWaveform); % Get the number of received subframes and OFDM symbols per subframe dims = lteSCFDMAInfo(FRC); samplesPerSubframe = dims.SamplingRate/1000; nRxSubframes = floor(size(rxWaveform, 1)/samplesPerSubframe); FRC.TotSubframes = 1; resGridSize = lteResourceGridSize(FRC); L = resGridSize(2); disp('Decode transmitted subframes and check CRC.'); for n=0:nRxSubframes-1 % Extract subframe rxSubframe = rxGrid(:,(1:L)+(n*L),:); % Get the transport block size for current subframe FRC.NSubframe = n; trBlkSize = PUSCH.TrBlkSizes(n+1); % Perform channel estimation [estChannelGrid, noiseEst] = lteULChannelEstimate( ... FRC, PUSCH, cec, rxSubframe); % Generate PUSCH indices and extract symbols from received and % channel estimate grids in preparation for PUSCH decoding ind = ltePUSCHIndices(FRC, PUSCH); [rxSym,hestSym] = lteExtractResources(ind, rxSubframe, estChannelGrid); % Update PUSCH to carry complete information of the UL-SCH coding PUSCH = lteULSCHInfo(FRC, PUSCH, trBlkSize, 'chsconcat'); % Perform equalization, transform deprecoding, layer demapping, % demodulation, and descrambling on the received data using the channel % estimate [rxEncodedBits, puschsymbols] = ltePUSCHDecode(FRC, PUSCH, ... rxSym, hestSym, noiseEst); % Decode Uplink Shared Channel (UL-SCH) decState = []; [decbits,crc] = ... lteULSCHDecode(FRC, PUSCH, trBlkSize ,rxEncodedBits, decState); if crc disp(['Subframe ' num2str(n) ': CRC failed']); else disp(['Subframe ' num2str(n) ': CRC passed']); end end
Low edge PUSCH EVM, slot 0: 0.165% Low edge PUSCH EVM, slot 1: 0.244% Low edge DRS EVM, slot 0: 0.210% Low edge DRS EVM, slot 1: 0.199% High edge PUSCH EVM, slot 0: 0.264% High edge PUSCH EVM, slot 1: 0.253% High edge DRS EVM, slot 0: 0.208% High edge DRS EVM, slot 1: 0.242% Low edge PUSCH EVM, slot 2: 0.213% Low edge PUSCH EVM, slot 3: 0.175% Low edge DRS EVM, slot 2: 0.186% Low edge DRS EVM, slot 3: 0.307% High edge PUSCH EVM, slot 2: 0.220% High edge PUSCH EVM, slot 3: 0.258% High edge DRS EVM, slot 2: 0.264% High edge DRS EVM, slot 3: 0.367% Low edge PUSCH EVM, slot 4: 0.225% Low edge PUSCH EVM, slot 5: 0.175% Low edge DRS EVM, slot 4: 0.180% Low edge DRS EVM, slot 5: 0.236% High edge PUSCH EVM, slot 4: 0.260% High edge PUSCH EVM, slot 5: 0.243% High edge DRS EVM, slot 4: 0.234% High edge DRS EVM, slot 5: 0.261% Low edge PUSCH EVM, slot 6: 0.228% Low edge PUSCH EVM, slot 7: 0.194% Low edge DRS EVM, slot 6: 0.294% Low edge DRS EVM, slot 7: 0.149% High edge PUSCH EVM, slot 6: 0.306% High edge PUSCH EVM, slot 7: 0.243% High edge DRS EVM, slot 6: 0.290% High edge DRS EVM, slot 7: 0.216% Low edge PUSCH EVM, slot 8: 0.205% Low edge PUSCH EVM, slot 9: 0.203% Low edge DRS EVM, slot 8: 0.269% Low edge DRS EVM, slot 9: 0.164% High edge PUSCH EVM, slot 8: 0.244% High edge PUSCH EVM, slot 9: 0.268% High edge DRS EVM, slot 8: 0.342% High edge DRS EVM, slot 9: 0.201% Low edge PUSCH EVM, slot 10: 0.184% Low edge PUSCH EVM, slot 11: 0.249% Low edge DRS EVM, slot 10: 0.211% Low edge DRS EVM, slot 11: 0.203% High edge PUSCH EVM, slot 10: 0.246% High edge PUSCH EVM, slot 11: 0.327% High edge DRS EVM, slot 10: 0.206% High edge DRS EVM, slot 11: 0.410% Low edge PUSCH EVM, slot 12: 0.221% Low edge PUSCH EVM, slot 13: 0.273% Low edge DRS EVM, slot 12: 0.170% Low edge DRS EVM, slot 13: 0.255% High edge PUSCH EVM, slot 12: 0.322% High edge PUSCH EVM, slot 13: 0.285% High edge DRS EVM, slot 12: 0.297% High edge DRS EVM, slot 13: 0.362% Low edge PUSCH EVM, slot 14: 0.215% Low edge PUSCH EVM, slot 15: 0.214% Low edge DRS EVM, slot 14: 0.274% Low edge DRS EVM, slot 15: 0.183% High edge PUSCH EVM, slot 14: 0.232% High edge PUSCH EVM, slot 15: 0.253% High edge DRS EVM, slot 14: 0.405% High edge DRS EVM, slot 15: 0.251% Low edge PUSCH EVM, slot 16: 0.224% Low edge PUSCH EVM, slot 17: 0.240% Low edge DRS EVM, slot 16: 0.278% Low edge DRS EVM, slot 17: 0.260% High edge PUSCH EVM, slot 16: 0.248% High edge PUSCH EVM, slot 17: 0.310% High edge DRS EVM, slot 16: 0.197% High edge DRS EVM, slot 17: 0.409% Low edge PUSCH EVM, slot 18: 0.290% Low edge PUSCH EVM, slot 19: 0.214% Low edge DRS EVM, slot 18: 0.279% Low edge DRS EVM, slot 19: 0.190% High edge PUSCH EVM, slot 18: 0.304% High edge PUSCH EVM, slot 19: 0.261% High edge DRS EVM, slot 18: 0.335% High edge DRS EVM, slot 19: 0.264% Averaged low edge PUSCH EVM, frame 0: 0.220% Averaged high edge PUSCH EVM, frame 0: 0.269% Averaged PUSCH EVM frame 0: 0.269% Averaged DRS EVM frame 0: 0.297% Averaged overall PUSCH EVM: 0.269% Averaged overall DRS EVM: 0.297% Decode transmitted subframes and check CRC. Subframe 0: CRC passed Subframe 1: CRC passed Subframe 2: CRC passed Subframe 3: CRC passed Subframe 4: CRC passed Subframe 5: CRC passed Subframe 6: CRC passed Subframe 7: CRC passed Subframe 8: CRC passed Subframe 9: CRC passed





В этом примере используются следующие вспомогательные функции:
3GPP ТС 36.101 «Радиопередача и прием пользовательского оборудования (UE)»