exponenta event banner

Моделирование частоты ошибок блока NB-IoT NPDSCH

В этом примере показано, как Toolbox™ LTE можно использовать для создания моделирования частоты блочных ошибок (BLER) узкополосного физического канала нисходящей линии связи NB-IoT при частотно-селективном замирании и аддитивном канале белого гауссова шума (AWGN).

Введение

3GPP 13-й выпуск LTE начал добавлять поддержку узкополосных приложений Интернета вещей. Версия 13 определяет одну категорию UE NB-IoT, а именно Cat-NB1, и версия 14 добавляет Cat-NB2, которая позволяет увеличить размеры транспортных блоков. В этом примере рассматривается версия 13 NB-IoT.

В примере создается кривая NB-IoT NPDSCH BLER для ряда точек SNR и параметров передачи. NPSS и NSSS передаются в соответствующих подкадрах, и NPSS используется для практической синхронизации по времени. Подкадры NPSS и NSSS не используются для передачи NPDSCH. NRS передается в подкадрах NPDSCH и используется для практической оценки канала. Промежутки передачи NPBCH в этом примере не рассматриваются.

Конфигурация моделирования

Длина моделирования составляет 4 транспортных блока DL-SCH для ряда точек SNR. Большее количество numTrBlks следует использовать для получения значимых результатов по производительности. SNR может быть массивом значений или скаляром. Моделирование выполняется по различным значениям повторения для сравнения улучшения производительности с повторениями.

numTrBlks = 4;        % Number of simulated transport blocks
SNRdB = -32:4:0;      % SNR range in dB
ireps = [0 5 9];      % Range of reps simulated

Настройка параметров верхнего слоя

Установите следующие параметры более высокого уровня, которые используются для конфигурирования NPDSCH в следующем разделе:

  • Переменная NPDSCHDataType указывает, несет ли NPDSCH SystemInformationBlockType1-NB (SIB1-NB) или нет, и несет ли NPDSCH широковещательный канал управления (BCCH) или нет. NPDSCHDataType являются 'SIB1NB', 'BCCHNotSIB1NB' и 'NotBCCH'. Следует отметить, что SIB1-NB принадлежит BCCH.

  • Количество повторений NPDSCH и размер транспортного блока (TBS) зависят от того, несет ли NPDSCH SIB1-NB или нет (см. 3GPP TS 36.213 16.4.1.3 и 16.4.1.5 [2]). NPDSCHDataType установить в значение 'SIB1NB' указывает, что NPDSCH несет SIB1-NB; NPDSCHDataType значение: 'BCCHNotSIB1NB' или 'NotBCCH' указывает, что NPDSCH не несет SIB1-NB.

  • На шаблон повторения NPDSCH и генерацию скремблирующей последовательности влияет, несет ли NPDSCH BCCH или нет (см. 3GPP TS 36.211 10.2.3 [1]). NPDSCHDataType значение: 'SIB1NB' или 'BCCHNotSIB1NB' указывает, что NPDSCH несет BCCH; NPDSCHDataType установить в значение 'NotBCCH' указывает, что NPDSCH не несет BCCH.

NPDSCHDataType = 'NotBCCH';  % The allowed values are 'SIB1NB', 'BCCHNotSIB1NB' or 'NotBCCH'
  • Переменная ISF настраивает количество нижних рам для NPDSCH согласно 3GPP таблица 16.4.1.3-1 [2] TS 36.213. Допустимые значения для ISF 0... 7.

Когда NPDSCH несет SIB1-NB:

  • Переменная SchedulingInfoSIB1 настраивает количество повторений NPDSCH согласно 3GPP таблица 16.4.1.3-3 TS 36.213 и TBS согласно Таблице 16.4.1.5.2-1 [2]. Допустимые значения для SchedulingInfoSIB1 0... 11.

Если NPDSCH не переносит SIB1-NB:

  • Переменная IRep настраивает количество повторений NPDSCH согласно 3GPP таблица 16.4.1.3-2 [2] TS 36.213. Допустимые значения для IRep 0... 15.

  • Переменная IMCS вместе с IRep настройте TBS согласно 3GPP таблица 16.4.1.5.1-1 [2] TS 36.213. Допустимые значения для IMCS 0... 13.

ISF = 0;                % Resource assignment field in DCI (DCI format N1 or N2)
SchedulingInfoSIB1 = 0; % Scheduling information field in MasterInformationBlock-NB (MIB-NB)
IMCS = 4;               % Modulation and coding scheme field in DCI (DCI format N1 or N2)

Конфигурация eNB

Сконфигурируйте начальный кадр и номера подкадров (enb.NFrame и enb.NSubframe) при моделировании для каждой точки SNR идентификатор узкополосной физической ячейки enb.NNCellID, количество антенных портов NRS (enb.NBRefP, один антенный порт указывает, что порт 2000 используется, два антенных порта указывают, что порт 2000 и порт 2001 используются), режим работы NB-IoT enb.OperationMode которое может быть любым значением следующим образом:

  • 'Standalone': Несущая NB-IoT, развернутая вне спектра LTE, например, спектр, используемый для GSM или спутниковой связи

  • 'Guardband': Несущая NB-IoT развернута в защитном диапазоне между двумя несущими LTE

  • 'Inband-SamePCI': Несущая NB-IoT развернута в блоках ресурсов несущей LTE, с enb.NBRefP столько же, сколько портов CRS enb.CellRefP

  • 'Inband-DifferentPCI': Несущая NB-IoT развернута в блоках ресурсов несущей LTE, с enb.NBRefP отличается от enb.CellRefP

enb.CellRefP конфигурируется, когда режим работы 'Inband-DifferentPCI'. Начальный индекс символа OFDM в подкадре для NPDSCH конфигурируется с использованием enb.ControlRegionSize, когда значения NPDSCHDataType и enb.OperationMode удовлетворяют следующим условиям:

  • NPDSCHDataType является либо 'BCCHNotSIB1NB' или 'NotBCCH'

  • enb.OperationMode является либо 'Inband-SamePCI' или 'Inband-DifferentPCI'

enb.NFrame = 0;     % Simulation starting frame number
enb.NSubframe = 0;  % Simulation starting subframe number
enb.NNCellID = 0;   % NB-IoT physical cell ID
enb.NBRefP = 2;     % Number of NRS antenna ports, should be either 1 or 2
enb.OperationMode = 'Inband-DifferentPCI';  % The allowed values are 'Inband-SamePCI', 'Inband-DifferentPCI', 'Guardband' or 'Standalone'
if strcmpi(enb.OperationMode,'Inband-SamePCI')
    enb.CellRefP = enb.NBRefP;     % The allowed values are NBRefP or 4
    enb.NCellID = enb.NNCellID;
elseif strcmpi(enb.OperationMode,'Inband-DifferentPCI')
    enb.CellRefP = 4; % Number of Cell RS antenna ports (Must be equal to NBRefP or 4)
    enb.NCellID = 1;
end
if (strcmpi(NPDSCHDataType,'BCCHNotSIB1NB') || strcmpi(NPDSCHDataType,'NotBCCH')) && ...
        (strcmpi(enb.OperationMode,'Inband-SamePCI') || strcmpi(enb.OperationMode,'Inband-DifferentPCI'))
    enb.ControlRegionSize = 3;     % The allowed values are 0...13
end

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

Структура channel содержит параметры конфигурации модели канала.

channel = struct;                    % Initialize channel config structure
channel.Seed = 6;                    % Channel seed
channel.NRxAnts = 1;                 % 1 receive antenna
channel.DelayProfile ='EPA';         % Delay profile
channel.DopplerFreq = 5;             % Doppler frequency in Hz
channel.MIMOCorrelation = 'Low';     % Multi-antenna correlation
channel.NTerms = 16;                 % Oscillators used in fading model
channel.ModelType = 'GMEDS';         % Rayleigh fading model type
channel.InitPhase = 'Random';        % Random initial phases
channel.NormalizePathGains = 'On';   % Normalize delay profile power
channel.NormalizeTxAnts = 'On';      % Normalize for transmit antennas

Конфигурация оценщика канала

В этом примере параметр perfectChannelEstimator управляет поведением оценщика канала. Допустимые значения: true или false. Если установлено значение true, используется совершенный блок оценки канала, иначе используется практический блок оценки, основанный на значениях принятого NRS.

% Channel estimator behavior
perfectChannelEstimator = true;

Практический блок оценки канала сконфигурирован со структурой cec. Профиль задержки EPA с доплеровским 5Hz вызывает медленное изменение канала во времени. Поэтому только усреднение частоты выполняется по оценкам пилот-сигнала путем установки временного окна в 1 элемент ресурса (RE) и частотного окна в 25, чтобы гарантировать усреднение по всем поднесущим для ресурсного блока.

% Configure channel estimator
cec.PilotAverage = 'UserDefined';   % Type of pilot symbol averaging
cec.TimeWindow = 1;                 % Time window size in REs
cec.FreqWindow = 25;                % Frequency window size in REs
cec.InterpType = 'Cubic';           % 2D interpolation type
cec.InterpWindow = 'Centered';      % Interpolation window type
cec.InterpWinSize = 3;              % Interpolation window size
cec.Reference = 'NRS';              % Channel estimator reference signal

Конфигурация NPDSCH

Получите следующие параметры NPDSCH из конфигураций более высокого уровня, определенных выше:

  • Количество повторений (NRep)

  • Количество подкадров, используемых для NPDSCH при отсутствии повторения (NSF)

  • Размер транспортного блока (TBS)

Эти параметры можно получить с помощью класса hNPDSCHInfo. hNPDSCHInfo также обеспечивает способ displaySubframePattern для отображения шаблона повторения NPDSCH, который показан в следующем разделе.

Следует отметить, что когда NPDSCH не переносит SIB1-NB, возникает ошибка, если сконфигурированный IRep и IMCS значения приводят к пустой TBS. Это случай, когда TBS не определен для конкретного IRep и IMCS пара в 3GPP таблица 16.4.1.5.1-1 [2] TS 36.213.

for repIdx = 1:numel(ireps)
    npdschInfo = hNPDSCHInfo;
    npdschInfo.NPDSCHDataType = NPDSCHDataType;
    npdschInfo.ISF = ISF;
    if strcmpi(NPDSCHDataType,'SIB1NB')  % NPDSCH carrying SIB1-NB
        npdschInfo.SchedulingInfoSIB1 = SchedulingInfoSIB1;
    else % NPDSCH not carrying SIB1-NB
        npdschInfo.IRep = ireps(repIdx); % Repetition number field in DCI (DCI format N1 or N2)
        npdschInfo.IMCS = IMCS;          % Modulation and coding scheme field in DCI (DCI format N1 or N2)
        % Verify the inputs of IRep and IMCS
        if isempty(npdschInfo.TBS)
            npdschInfo.TBSTable
            error(['Invalid [ITBS,ISF] (where ITBS=IMCS=' num2str(IMCS)...
                ', ISF=' num2str(ISF)  ') pair, empty TBS is returned, check valid pairs in the above table or 3GPP TS 36.213 table 16.4.1.5.1-1']);
        end
    end

Создание структуры npdsch по полученному количеству повторов (npdschInfo.NRep), количество подкадров NPDSCH (npdschInfo.NSF) из экземпляра класса npdschInfo, входной параметр NPDSCHDataType и временный идентификатор радиосети RNTI. Обратите внимание, что NSF = 8 используется при NPDSCHDataType является 'SIB1NB'.

    npdsch.NSF = npdschInfo.NSF;
    npdsch.NRep = npdschInfo.NRep;
    npdsch.NPDSCHDataType = NPDSCHDataType;
    npdsch.RNTI = 1;

Проверьте сконфигурированные параметры более высокого уровня, используя скорость кода DL-SCH. Кодовая скорость - это отношение между количеством битов после кодирования CRC и количеством битов после согласования скорости. Для случая, когда SIB1NB имеет значение true, кодовая скорость R может быть больше или равно 1, что не является допустимым сценарием. Например, такой случай случается, когда ISF имеет значение 0 и SchedulingInfoSIB1 имеет значение 3.

    [~,info] = lteNPDSCHIndices(enb,npdsch);
    rmoutlen = info.G;           % Bit length after rate matching, i.e. codeword length
    trblklen = npdschInfo.TBS;   % Transport block size
    R = (trblklen+24)/rmoutlen;  % DL-SCH channel coding rate, 24 denotes the number of CRC bits
    if R >= 1
        error(['DL-SCH coding rate (' num2str(R) ') larger than or equal to 1 for the configured parameters.']);
    end

Отображение шаблона повторения субкадра

Переменная displayPattern управляет отображением шаблона повторения подкадров NPDSCH. Пример показан на следующем рисунке для случая, когда NPDSCH переносит BCCH, NPDSCH состоит из npdschInfo.NSF = 3 различные подкадры, каждый цвет представляет подкадр, который представляет 1 мс Каждый подкадр повторяется npdschInfo.NRep = 4 раз, таким образом, для передачи NPDSCH требуется в общей сложности 12 подкадров.

    %  The NPDSCH repetition pattern for the current configuration is
    %  displayed below
    displayPattern = false;
    % Display NPDSCH repetition pattern
    if displayPattern == true
        npdschInfo.displaySubframePattern;
    end

Цикл моделирования частоты ошибок блока

В этой части примера показано, как выполнить моделирование уровня канала NB-IoT NPDSCH и построить график результатов BLER. Цепь передачи и приема показана на следующем рисунке.

Случайный поток битов с размером требуемого транспортного блока подвергается кодированию CRC, сверточному кодированию и согласованию скорости для получения битов NPDSCH, которые повторяются согласно конкретной схеме повторения подкадров. Затем для формирования комплексных символов NPDSCH применяются скремблирование, модуляция, отображение уровня и предварительное кодирование. Эти символы вместе с сигналами NRS преобразуются в сетку и OFDM модулируются для создания формы сигнала во временной области. Затем его пропускают через канал замирания и добавляют AWGN. Шумовая форма сигнала затем синхронизируется и демодулируется. Оценку и выравнивание канала выполняют по восстановленным символам NPDSCH, после чего выполняют декодирование и демодуляцию канала для восстановления транспортного блока. После дескремблирования повторяющиеся подкадры мягко объединяются перед восстановлением скорости. Коэффициент ошибок транспортного блока вычисляется для каждой точки SNR. Оценка частоты ошибок блока основана на предположении, что все подкадры в пучке используются для декодирования транспортного блока в UE. Пучок определяется на уровне MAC (см. 3GPP TS 36,321 5,3,2,1 [3]) как npdsch.NSF $\times$ npdsch.NRep подкадры, используемые для переноса транспортного блока.

    % Absolute subframe number at the starting point of the simulation
    NSubframe = enb.NFrame*10+enb.NSubframe;

    % Initialize BLER and throughput result
    maxThroughput = zeros(length(SNRdB),1);
    simThroughput = zeros(length(SNRdB),1);
    bler = zeros(1,numel(SNRdB));

    % The temporary variables 'enb_init' and 'channel_init' are used to create
    % the temporary variable 'enb' and 'channel' within the SNR loop to create
    % independent simulation loops for the 'parfor' loop
    enb_init = enb;
    channel_init = channel;

    for snrIdx = 1:numel(SNRdB)
    % parfor snrIdx = 1:numel(SNRdB)
    % To enable the use of parallel computing for increased speed comment out
    % the 'for' statement above and uncomment the 'parfor' statement below.
    % This needs the Parallel Computing Toolbox. If this is not installed
    % 'parfor' will default to the normal 'for' statement.

        % Set the random number generator seed depending to the loop variable
        % to ensure independent random streams
        rng(snrIdx,'combRecursive');

        fprintf('\nSimulating %d transport blocks at %gdB SNR\n',numTrBlks,SNRdB(snrIdx));

        enb = enb_init;         % Initialize eNodeB configuration
        channel = channel_init; % Initialize fading channel configuration
        txcw = [];              % Initialize the transmitted codeword
        numBlkErrors = 0;       % Number of transport blocks with errors
        estate = [];            % Initialize NPDSCH encoder state
        dstate = [];            % Initialize NPDSCH decoder state
        lastOffset = 0;         % Initialize overall frame timing offset
        offset = 0;             % Initialize frame timing offset
        subframeGrid = lteNBResourceGrid(enb); % Initialize the subframe grid

        subframeIdx = NSubframe;
        numRxTrBlks = 0;
        while (numRxTrBlks < numTrBlks)

            % Set current subframe and frame numbers
            enb.NSubframe = mod(subframeIdx,10);
            enb.NFrame = floor((subframeIdx)/10);

            % Generate the NPSS symbols and indices
            npssSymbols = lteNPSS(enb);
            npssIndices = lteNPSSIndices(enb);
            % Map the symbols to the subframe grid
            subframeGrid(npssIndices) = npssSymbols;

            % Generate the NSSS symbols and indices
            nsssSymbols = lteNSSS(enb);
            nsssIndices = lteNSSSIndices(enb);
            % Map the symbols to the subframe grid
            subframeGrid(nsssIndices) = nsssSymbols;

            % Establish if either NPSS or NSSS is transmitted and if so,
            % do not transmit NPDSCH in this subframe
            isDataSubframe = isempty(npssSymbols) && isempty(nsssSymbols);

            % Create a new transport block and encode it when the
            % transmitted codeword is empty. The receiver sets the codeword
            % to empty to signal that all subframes in a bundle have been
            % received (it is also empty before the first transmission)
            if isempty(txcw)
                txTrBlk = randi([0 1],trblklen,1);
                txcw = lteNDLSCH(rmoutlen,txTrBlk);
            end

            if (isDataSubframe)
                % Generate NPDSCH symbols and indices for a subframe
                [txNpdschSymbols,estate] = lteNPDSCH(enb,npdsch,txcw,estate);
                npdschIndices = lteNPDSCHIndices(enb,npdsch);
                % Map the symbols to the subframe grid
                subframeGrid(npdschIndices) = txNpdschSymbols;
                % Generate the NRS symbols and indices
                nrsSymbols = lteNRS(enb);
                nrsIndices = lteNRSIndices(enb);
                % Map the symbols to the subframe grid
                subframeGrid(nrsIndices) = nrsSymbols;
            end

            % Perform OFDM modulation to generate the time domain waveform
            [txWaveform,ofdmInfo] = nbOFDMModulate(enb,subframeGrid);

            % Add 25 sample padding. This is to cover the range of delays
            % expected from channel modeling (a combination of
            % implementation delay and channel delay spread)
            txWaveform =  [txWaveform; zeros(25, enb.NBRefP)]; %#ok<AGROW>

            % Initialize channel time for each subframe
            channel.InitTime = subframeIdx/1000;

            % Pass data through channel model
            channel.SamplingRate = ofdmInfo.SamplingRate;
            [rxWaveform,fadingInfo] = lteFadingChannel(channel, txWaveform);

            % Calculate noise gain including compensation for downlink power
            % allocation
            SNR = 10^(SNRdB(snrIdx)/20);

            % Normalize noise power to take account of sampling rate, which
            % is a function of the IFFT size used in OFDM modulation, and
            % the number of antennas
            N0 = 1/(sqrt(2.0*enb.NBRefP*double(ofdmInfo.Nfft))*SNR);

            % Create additive white Gaussian noise
            noise = N0*complex(randn(size(rxWaveform)), ...
                                randn(size(rxWaveform)));

            % Add AWGN to the received time domain waveform
            rxWaveform = rxWaveform + noise;

            %------------------------------------------------------------------
            %            Receiver
            %------------------------------------------------------------------

            % Perform timing synchronization, extract the appropriate
            % subframe of the received waveform, and perform OFDM
            % demodulation
            if(perfectChannelEstimator)
                offset = hPerfectTimingEstimate(fadingInfo);
            else
                % In this example, the subframe offset calculation relies
                % on NPSS present in subframe 5, so we need to pad the
                % subframes before it so that the frame offset returned by
                % lteNBDLFrameOffset is the offset for subframe 5
                sfTsamples = ofdmInfo.SamplingRate*1e-3;
                if (enb.NSubframe==5)
                    padding = zeros([sfTsamples*5,size(rxWaveform,2)]);
                    offset = lteNBDLFrameOffset(enb, [padding; rxWaveform]);
                    if (offset > 25) || (offset < 0)
                        offset = lastOffset;
                    end
                    lastOffset = offset;
                end
            end

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

            % Perform OFDM demodulation on the received data to recreate the
            % resource grid
            rxSubframe = nbOFDMDemodulate(enb,rxWaveform);

            % Channel estimation
            if(perfectChannelEstimator)
                % Perfect channel estimation
                estChannelGrid = nbDLPerfectChannelEstimate(enb, channel, offset);
                noiseGrid = nbOFDMDemodulate(enb, noise(1+offset:end ,:));
                noiseEst = var(noiseGrid(:));
            else

                [estChannelGrid, noiseEst] = lteDLChannelEstimate( ...
                enb, cec, rxSubframe);
            end

            if (isDataSubframe)
                % Get NPDSCH indices
                npdschIndices = lteNPDSCHIndices(enb, npdsch);

                % Get PDSCH resource elements from the received subframe. Scale the
                % received subframe by the PDSCH power factor Rho. The PDSCH is
                % scaled by this amount, while the cell reference symbols used for
                % channel estimation (used in the PDSCH decoding stage) are not.
                [rxNpdschSymbols, npdschHest] = lteExtractResources(npdschIndices, ...
                    rxSubframe, estChannelGrid);

                % Decode NPDSCH
                [rxcw,dstate,symbols] = lteNPDSCHDecode(...
                                     enb, npdsch, rxNpdschSymbols, npdschHest, noiseEst,dstate);

                % Decode the transport block when all the subframes in a bundle
                % have been received
                if dstate.EndOfTx
                   [trblkout,blkerr] = lteNDLSCHDecode(trblklen,rxcw);
                   numBlkErrors = numBlkErrors + blkerr;
                   numRxTrBlks = numRxTrBlks + 1;
                   % Re-initialize to enable the transmission of a new transport block
                   txcw = [];
                end
            end

            subframeIdx = subframeIdx + 1;

        end

        % Calculate the block error rate
        bler(snrIdx) = numBlkErrors/numTrBlks;
        fprintf('NPDSCH BLER = %.4f \n',bler(snrIdx));
        % Calculate the maximum and simulated throughput
        maxThroughput(snrIdx) = trblklen*numTrBlks; % Max possible throughput
        simThroughput(snrIdx) = trblklen*(numTrBlks-numBlkErrors);  % Simulated throughput
        fprintf('NPDSCH Throughput(%%) = %.4f %%\n',simThroughput(snrIdx)*100/maxThroughput(snrIdx));

    end
Simulating 4 transport blocks at -32dB SNR
Simulating 4 transport blocks at -32dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -28dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -24dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -20dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -16dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -12dB SNR
NPDSCH BLER = 0.2500 
NPDSCH Throughput(%) = 75.0000 %

Simulating 4 transport blocks at -8dB SNR
NPDSCH BLER = 0.0000 
NPDSCH Throughput(%) = 100.0000 %

Simulating 4 transport blocks at -4dB SNR
NPDSCH BLER = 0.0000 
NPDSCH Throughput(%) = 100.0000 %

Simulating 4 transport blocks at 0dB SNR
NPDSCH BLER = 0.0000 
NPDSCH Throughput(%) = 100.0000 %
Simulating 4 transport blocks at -32dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -28dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -24dB SNR
NPDSCH BLER = 0.2500 
NPDSCH Throughput(%) = 75.0000 %

Simulating 4 transport blocks at -20dB SNR
NPDSCH BLER = 0.0000 
NPDSCH Throughput(%) = 100.0000 %

Simulating 4 transport blocks at -16dB SNR
NPDSCH BLER = 0.0000 
NPDSCH Throughput(%) = 100.0000 %

Simulating 4 transport blocks at -12dB SNR
NPDSCH BLER = 0.0000 
NPDSCH Throughput(%) = 100.0000 %

Simulating 4 transport blocks at -8dB SNR
NPDSCH BLER = 0.0000 
NPDSCH Throughput(%) = 100.0000 %

Simulating 4 transport blocks at -4dB SNR
NPDSCH BLER = 0.0000 
NPDSCH Throughput(%) = 100.0000 %

Simulating 4 transport blocks at 0dB SNR
NPDSCH BLER = 0.0000 
NPDSCH Throughput(%) = 100.0000 %

Частота ошибок блока графика в сравнении с результатами SNR

    if repIdx == 1
        fh = figure;
        grid on;
        hold on;
        xlabel('SNR (dB)');
        ylabel('BLER');
        legendstr = {['NRep = ' num2str(npdsch.NRep)]};
    else
        legendstr = [legendstr ['NRep = ' num2str(npdsch.NRep)]]; %#ok<AGROW>
    end
    figure(fh);
    plot(SNRdB, bler, '-o');

end
% Set figure title
if strcmpi(NPDSCHDataType,'SIB1NB')
    npdsch.NSF = 8;
end
title([' ' char(npdsch.NPDSCHDataType) ': TBS=' num2str(trblklen)...
    '; NSF=' num2str(npdsch.NSF) '; ' num2str(enb_init.NBRefP) ' NRS port(s)' ]);
legend(legendstr);

На следующем графике показан прогон моделирования с numTrBlks установлено в 1000 при использовании идеального оценщика канала.

Приложение

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

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

  1. 3GPP ТС 36.211 «Физические каналы и модуляция»

  2. 3GPP ТС 36.213 «Процедуры физического уровня»

  3. 3GPP TS 36.321 «Спецификация протокола управления доступом к среде (MAC)»

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

Локальные функции

% NB-IoT DL OFDM Modulator
function [waveform,info] = nbOFDMModulate(enb,grid)
    % Apply default window size according to TS 36.104 Table E.5.1-1a
    if(~isfield(enb,'Windowing'))
        enb.Windowing = 6;
    end
    % Use NB-IoT SC-FDMA to get the 1/2 subcarrier shift on the OFDM modulation
    enb.NBULSubcarrierSpacing = '15kHz';
    [waveform,info] = lteSCFDMAModulate(enb,grid);
end

% NB-IoT DL OFDM Demodulator
function grid = nbOFDMDemodulate(enb,rxWaveform)
    % Use NB-IoT SC-FDMA to get the 1/2 subcarrier shift on the OFDM modulation
    enb.NBULSubcarrierSpacing = '15kHz';
    grid = lteSCFDMADemodulate(enb,rxWaveform,0.55); % CP fraction of 0.55
end

% NB-IoT DL Perfect Channel Estimator
function H = nbDLPerfectChannelEstimate(enb,channel,timefreqoffset)
    % Reconfigure NB-IoT UL perfect channel estimator to perform DL perfect
    % channel estimation
    enb.NBULSubcarrierSpacing = '15kHz';
    enb.NTxAnts = enb.NBRefP;
    enb.TotSlots = 2;
    H = lteULPerfectChannelEstimate(enb, channel,timefreqoffset);
end
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -28dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -24dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -20dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -16dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -12dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -8dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at -4dB SNR
NPDSCH BLER = 1.0000 
NPDSCH Throughput(%) = 0.0000 %

Simulating 4 transport blocks at 0dB SNR
NPDSCH BLER = 0.0000 
NPDSCH Throughput(%) = 100.0000 %