Генерация сигналов агрегирования несущей восходящей линии связи, демодуляция и анализ

Этот пример показывает, как несколько несущих восходящей линии связи могут быть сгенерированы, агрегированы и демодулированы с использованием 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

Строение UE для каждой несущей компонента

Структура строения генерируется для каждого 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. Следующие шаги:

  • Демодулируйте интересующий 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, :);

EVM, внутриполосные измерения выбросов и декодирование PUSCH

Приведенный ниже код обеспечивает PUSCH EVM, PUSCH DRS EVM и вычисление внутриполосных выбросов с помощью hPUSCHEVM.

EVM является различием между восстановленными идеальными символами и измеренными принятыми символами в течение одного интервала измерения паза во временном интервале. Процесс восстановления идеальных символов включает в себя:

  • Демодуляция множественного доступа с делением частот на одну несущую (SC-FDMA) для получения принятой ресурсной сетки

  • Оценка канала

  • ПУСК эквализации

  • Демодуляция символов

  • Декодирование с последующим повторным кодированием принятых бит, реэкскремблирование и ремодуляция

Среднее значение EVM измеряется в двух местоположениях во времени (низком и высоком, которые обозначаются как$\overline{EVM_{l}}$ и), $\overline{EVM_{h}}$где низкое и высокое местоположения соответствуют выравниванию окна БПФ в пределах начала и конца циклического префикса. LTE Toolbox требует, чтобы низкое и высокое местоположения были заданы как часть длины циклического префикса.

Внутриполосные выбросы являются мерой интерференции, попадающей в не распределенные RB. Внутриполосные выбросы вычисляются для каждого$\Delta_{RB}$ и номера паза, где$\Delta_{RB}$ является начальным смещением частоты между выделенным RB и измеренным не выделенным RB (например,$\Delta_{RB} = 1$ для первого соседнего 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

Приложение

В этом примере используются следующие вспомогательные функции:

Избранная библиография

  1. 3GPP TS 36.101 «Радиопередача и прием пользовательского оборудования (UE)»