Этот пример показывает, как Toolbox™ LTE могут использоваться, чтобы создать моделирование частоты ошибок NB-IoT Narrowband Physical Nowlink Shared Channel (NPDSCH) Block Rate (BLER) в частотно-селективном канале с замираниями и аддитивным белым Гауссовым шумом (AУУссов).
3GPP Релиз LTE начал добавлять поддержку приложений Narrowband IoT. Release 13 задает одну категорию UE NB-IoT, а именно Cat-NB1, и Release 14 добавляет Cat-NB2, который допускает большие размеры транспортных блоков. Этот пример посвящен Release 13 NB-IoT.
Пример генерирует кривую NB-IoT NPDSCH BLER для ряда точек ОСШ и параметров передачи. NPSS и NSSS передаются в соответствующих подкадрах, а NPSS используется для практической временной синхронизации. Подкадры NPSS и NSSS не используются для передачи NPDSCH. NRS передается в подкадрах NPDSCH и используется для практической оценки канала. Погрешности передачи NPBCH не рассматриваются в этом примере.
Длина симуляции является 4 транспортными блоками DL-SCH для ряда точек ОСШ. Большее количество 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 TS 36.213 Таблица 16.4.1.3-1 [2]. Допустимые значения для ISF
0... 7.
Когда NPDSCH несет SIB1-NB:
Переменная SchedulingInfoSIB1
настраивает количество повторений NPDSCH согласно 3GPP TS 36.213 таблица 16.4.1.3-3 и TBS согласно таблице 16.4.1.5.2-1 [2]. Допустимые значения для SchedulingInfoSIB1
0... 11.
Когда NPDSCH не несет SIB1-NB:
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.NFrame
и enb.NSubframe
) в симуляции для каждой точки ОСШ узкополосный идентификатор физической камеры 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 Doppler заставляет канал изменяться медленно с течением времени. Поэтому только усреднение частоты выполняется по пилотным оценкам путем установки временного окна на 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 из строений более высокого слоя, определенных выше:
Количество повторений (NRep
)
Количество подкадров, используемых для NPDSCH, когда нет повторения (NSF
)
Размер транспортного блока (TBS
)
Эти параметры могут быть получены при помощи класса hNPDSCHInfo
. hNPDSCHInfo
также предоставляет метод displaySubframePattern
отображение шаблона повторения NPDSCH, который показан в следующем разделе.
Обратите внимание, что, когда NPDSCH не несет SIB1-NB, возникает ошибка, если настроенный IRep
и IMCS
значения приводят к пустой TBS. Это случай, когда TBS не определен для определенного IRep
и IMCS
пара в 3GPP TS 36.213 16.4.1.5.1-1 [2].
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, после чего выполняют декодирование и демодуляцию канала, чтобы восстановить транспортный блок. После удаления скремблирования повторяющиеся субкадры мягко объединяются перед восстановлением скорости. Вероятность ошибки транспортного блока вычисляется для каждой точки ОСШ. Оценка частоты блочной ошибки основана на допущении, что все подкадры в пучке используются для декодирования транспортного блока в UE. Пакет определяется на уровне MAC (см. 3GPP TS 36.321 5.3.2.1 [3]) как npdsch.NSF
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 %
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 при использовании идеальной оценки канала.
В этом примере используются вспомогательные функции:
3GPP ТС 36.211 «Физические каналы и модуляция»
3GPP TS 36.213 «Процедуры физического слоя»
3GPP TS 36.321 «Протокол управления средним доступом (MAC) спецификации»
3GPP TS 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 %