exponenta event banner

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

Этот пример показывает, как множество несущих нисходящей линии связи может быть сгенерировано, агрегировано и дополнительно демодулировано с использованием Toolbox™ LTE.

Введение

В этом примере моделируется форма сигнала LTE Release 12 с агрегированием несущих (CA). Количество поднесущих и их полоса пропускания могут быть определены в качестве параметра. Рассматривается случай внутриполосной смежной СА.

Для генерации агрегированной формы сигнала нисходящей линии связи для каждой компонентной несущей сконфигурирован eNireB. Параметры компонентной несущей вычисляются и используются для генерации модулированной формы сигнала для каждой конфигурации eNireB. Все КЦ модулированные сигналы повторно дискретизируются на общую частоту дискретизации, так что они могут быть объединены для создания агрегированного сигнала.

Количество несущих компонентов и полос пропускания

Вектор NDLRB определяет количество блоков ресурсов (RB) для каждой компонентной несущей (CC). Длина этого вектора соответствует количеству КЦ. Элементы NDLRB должны находиться в наборе {6, 15, 25, 50, 75, 100} RB. TS 36.101 В таблице 5.6A.1-1 [1] перечислены допустимые комбинации полос пропускания для агрегирования несущих.

% Configure the set of NDLRB values to describe the carriers to be
% aggregated
NDLRB = [50 75 100];

% Establish the number of component carriers
numCC = numel(NDLRB);

if numCC<2
    error('Please specify more than one CC bandwidth value.');
end

Конфигурация полки компонентов

Для каждого CC создается структура конфигурации с использованием lteRMCDL. Структуры конфигурации для всех CC хранятся в массиве ячеек.

% Configure the number of subframes to generate
numSubframes = 10;

% CC configuration
enb = cell(1,numCC);
for i = 1:numCC
    switch NDLRB(i)
        case 6
            enb{i} = lteRMCDL('R.4');
        case 15
            enb{i} = lteRMCDL('R.5');
        case 25
            enb{i} = lteRMCDL('R.6');
        case 50
            enb{i} = lteRMCDL('R.7');
        case 75
            enb{i} = lteRMCDL('R.8');
        case 100
            enb{i} = lteRMCDL('R.9');
        otherwise
            fprintf('Not a valid number of resource blocks: %d\n',...
                NDLRB(i));
            return
    end
    enb{i}.NDLRB = NDLRB(i);
    enb{i}.Bandwidth = hNRBToBandwidth(NDLRB(i));
    enb{i}.TotSubframes = numSubframes;
    enb{i}.PDSCH.PRBSet = (0:enb{i}.NDLRB-1).';
    enb{i}.PDSCH.RVSeq = 0;
    enb{i}.NCellID = 10;
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

Расчет параметра агрегирования несущих

Для выполнения агрегирования несущих вычисляются частотные параметры, описанные в TS 36.101, разделах 5.6 и 5.7 [1]. Эти параметры суммированы на следующем рисунке.

Это приводит к трем переменным:

  • F_c - вектор, содержащий центральную частоту каждого CC

  • ccSpacing содержит интервал между CC в МГц

  • 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 downlink Delta_f1 is the subcarrier spacing
% (TS 36.101, Table 5.6A-1)
Delta_f1 = 0.015; % in MHz, LTE subcarrier spacing in MHz
maxBW = hNRBToBandwidth(max(NDLRB));


F_c = zeros(1,numCC);

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 carrier values
for k = 2:numCC
    ccSpacing(k-1) = hCarrierAggregationChannelSpacing( ...
        enb{k-1}.Bandwidth, enb{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*NDLRB(1)+Delta_f1)/2 + nominalGuardBand;
F_offset_high = (0.18*NDLRB(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);

% Aggregated bandwidth 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 вычисляют для общей частоты дискретизации для агрегированного сигнала.

% Bandwidth utilization of 85%
bwfraction = 0.85;

% Calculate sampling rates of the component carriers
CCSR = zeros(1,numCC);
for i = 1:numCC
    info = lteOFDMInfo(enb{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 total bandwidth
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));
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

Генерация сигналов и агрегирование несущих

lteRMCDLTool используется для генерации формы сигнала для каждого CC. Каждый из них повторно дискретизируется до общей частоты дискретизации, модулируется до соответствующей центральной частоты и, наконец, суммируется для формирования агрегированного сигнала.

% Generate component carriers
tx = cell(1,numCC);
for i = 1:numCC
    tx{i} = lteRMCDLTool(enb{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',{'Signal spectrum'});

Демодуляция и фильтрация интересующих CC

В этом разделе выполняется демодуляция, фильтрация и понижающая выборка одного из CCs. Следующие шаги:

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

% Precalculate passband and stopband values for all CC
firPassbandVec = (0.18*NDLRB+Delta_f1)/2 / (SR/1e6/2);
firStopbandVec = hCarrierAggregationStopband(ccSpacing,NDLRB,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,...
            'Demodulated and Filtered Waveform Power Spectrum',...
            {'Carrier aggregated signal' 'Filtered signal'});

В этот момент отфильтрованная форма сигнала может быть понижена до его скорости основной полосы частот.

rxWaveform = downsample(rxWaveform,OSRs(CCofInterest)/SRC);

Синхронизация

Синхронизация применяется к результирующему сигналу.

% Parameters for CC of interest
eNodeB = enb{CCofInterest};
PDSCH = eNodeB.PDSCH;

% Synchronize received waveform
offset = lteDLFrameOffset(eNodeB, rxWaveform);
rxWaveform = rxWaveform(1+offset:end, :);

Измерения EVM и декодирование PDSCH

Код, приведенный ниже, обеспечивает измерение на подкадр и среднее значение EVM. Также отображаются графики с EVM в зависимости от времени, блока ресурсов и поднесущих.

PDSCH восстановленного сигнала декодируется, и результирующий CRC проверяется на наличие ошибок.

% channel estimation structure for EVM measurement
cecEVM = cec;
cecEVM.PilotAverage = 'TestEVM';
[evmmeas, plots] = hPDSCHEVM(enb{CCofInterest},cecEVM,rxWaveform);

% OFDM demodulation
rxGrid = lteOFDMDemodulate(eNodeB,rxWaveform);

% Get the number of received subframes and OFDM symbols per subframe
dims = lteOFDMInfo(eNodeB);
samplesPerSubframe = dims.SamplingRate/1000;
nRxSubframes = floor(size(rxWaveform, 1)/samplesPerSubframe);
eNodeB.TotSubframes = 1;
resGridSize = lteResourceGridSize(eNodeB);
L = resGridSize(2);

disp('Decode transmitted subframes and check CRC.');

for n=0:nRxSubframes-1

    % extract subframe
    rxSubframe = rxGrid(:,(1:L)+(n*L),:);

    % transport block size for current subframe
    eNodeB.NSubframe = n;
    trBlkSize = PDSCH.TrBlkSizes(n+1);

    % Channel estimation
    [estChannelGrid, noiseEst] = lteDLChannelEstimate( ...
        eNodeB, cec, rxSubframe);

    % Perform deprecoding, layer demapping, demodulation and descrambling
    % on the received data using the channel estimate
    [rxEncodedBits, pdschsymbols] = ltePDSCHDecode(eNodeB,PDSCH, ...
        rxSubframe*(10^(-PDSCH.Rho/20)),estChannelGrid,noiseEst);

    % Decode DownLink Shared Channel (DL-SCH)
    [decbits,crc] = ...
        lteDLSCHDecode(eNodeB,PDSCH,trBlkSize,rxEncodedBits{1});

    if crc
        disp(['Subframe ' num2str(n) ': CRC failed']);
    else
        disp(['Subframe ' num2str(n) ': CRC passed']);
    end
end
Low edge EVM, subframe 0: 0.647%
High edge EVM, subframe 0: 0.629%
Low edge EVM, subframe 1: 0.682%
High edge EVM, subframe 1: 0.650%
Low edge EVM, subframe 2: 0.680%
High edge EVM, subframe 2: 0.676%
Low edge EVM, subframe 3: 0.676%
High edge EVM, subframe 3: 0.641%
Low edge EVM, subframe 4: 0.640%
High edge EVM, subframe 4: 0.648%
Low edge EVM, subframe 6: 0.698%
High edge EVM, subframe 6: 0.642%
Low edge EVM, subframe 7: 0.645%
High edge EVM, subframe 7: 0.649%
Low edge EVM, subframe 8: 0.700%
High edge EVM, subframe 8: 0.647%
Low edge EVM, subframe 9: 0.694%
High edge EVM, subframe 9: 0.685%
Averaged low edge EVM, frame 0: 0.674%
Averaged high edge EVM, frame 0: 0.652%
Averaged EVM frame 0: 0.674%
Averaged overall EVM: 0.674%
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 ТС 36.101 «Радиопередача и прием пользовательского оборудования (UE)»