Этот пример показывает, как несколько несущих восходящей линии связи могут быть сгенерированы, агрегированы и демодулированы с использованием LTE Toolbox™. Величина вектора ошибок (EVM) и внутриполосные выбросы измеряются для демодулированного носителя согласно TS 36.101 приложение F [1].
Этот пример моделирует сигнал восходящего канала LTE с агрегированием несущей (CA). Количество несущих компонентов (CC) и их соответствующие полосы пропускания могут быть заданы как параметр. Внутриполосный смежный случай CA рассматривается согласно TS 36.101 V15.4.0.
Чтобы сгенерировать агрегированный сигнал восходящей линии связи, пользовательское оборудование (UE) конфигурируется для каждой несущей компонента. Параметры агрегации несущей вычисляются и используются, чтобы сгенерировать модулированную форму волны для каждого строения CC. Все модулированные формы волны несущей компонента повторно дискретизируются с общей частотой дискретизации, так что они могут быть объединены, чтобы создать агрегированную форму волны. Агрегированную форму волны демодулируют и фильтруют для извлечения интересующего компонента-носителя. Затем измеряют EVM и внутриполосные выбросы для этого CC и, наконец, проводят проверку CRC путем выполнения декодирования PUSCH.
Векторное NULRB
задает количество ресурсных блоков (RB) для каждой несущей компонента. Длина этого вектора соответствует количеству CCs. Элементы NULRB
должен находиться в наборе {6, 15, 25, 50, 75, 100} RB. В таблице 5.6A.1-1 [1] TS 36.101 перечислены допустимые комбинации полос пропускания для агрегирования несущей.
% 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
содержит интервалы между CC в МГц
BW_channel_CA
- агрегированная пропускная способность канала всех CC
В коде ниже мы сначала вычисляем значение для всех 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
Спектр степени агрегированного сигнала несущей отображается с помощью hCarrierAggregationPlotSpectrum.m. В спектре видны отдельные полосы пропускания несущей. Обратите внимание, что центр агрегированной полосы пропускания расположен в полосе частот основной полосы (0 Гц), поскольку сигнал не модулируется RF в этом примере.
specPlot = hCarrierAggregationPlotSpectrum(waveform,SR,... 'Power Spectrum of Carrier Aggregation Waveform',... {'Carrier aggregated signal'});
В этом разделе показано, как демодулировать, фильтровать и понижать значение одного из интересующих CC. Следующие шаги:
Демодулируйте интересующий CC и доведите его до основной полосы (0 Гц).
Отфильтровывайте соседние CC и downsample. Подходящий фильтр предназначен для удаления нежелательных соседних СС в процессе понижающей дискретизации. Создание фильтра окажет влияние на качество и 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');
Демодулированную форму волны затем фильтруют, чтобы извлечь интересующий CC. Строят график спектра демодулированной формы волны до и после фильтрации.
% 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) для получения принятой ресурсной сетки
Оценка канала
ПУСК эквализации
Демодуляция символов
Декодирование с последующим повторным кодированием принятых бит, реэкскремблирование и ремодуляция
Среднее значение EVM измеряется в двух местоположениях во времени (низком и высоком, которые обозначаются как и), где низкое и высокое местоположения соответствуют выравниванию окна БПФ в пределах начала и конца циклического префикса. LTE Toolbox требует, чтобы низкое и высокое местоположения были заданы как часть длины циклического префикса.
Внутриполосные выбросы являются мерой интерференции, попадающей в не распределенные RB. Внутриполосные выбросы вычисляются для каждого и номера паза, где является начальным смещением частоты между выделенным 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 TS 36.101 «Радиопередача и прием пользовательского оборудования (UE)»