主要内容

NB-IoT NPUSCH块错误率模拟

本示例展示如何使用LTE Toolbox™在频率选择性衰落和加性高斯白噪声(AWGN)中创建NB-IoT窄带物理上行共享信道(NPUSCH)块错误率(BLER)模拟。

简介

3GPP推出了新的空中接口窄带物联网(NB-IoT),在LTE-Advanced Pro Release 13中针对低数据速率机器类型通信进行了优化。NB-IoT提高了成本和电源效率,因为它避免了基于lte的系统所需的复杂信号开销。

该示例为许多信噪比点和传输参数生成了NB-IoT NPUSCH BLER曲线。所有槽位均传输NPUSCH和窄带解调参考信号(DRS)。对每个信噪比点逐槽操作,BLER计算包括以下步骤:

  • 生成一个资源网格并用NPUSCH符号填充它

  • 通过SC-FDMA调制网格创建基带波形

  • 通过一个有噪声的衰落信道传递波形

  • 执行接收机操作(SC-FDMA解调,信道估计和均衡)

  • 通过解码均衡的符号来获得块CRC

  • 通过使用通道解码器输出端的块CRC结果来确定NPUSCH的性能

模拟配置

对于多个信噪比点,模拟长度为5个UL-SCH传输块SNRdB对于不同的重复simReps.为了产生有意义的吞吐量结果,您应该使用更多的传输块(numTrBlks).SNRdB而且simReps可以指定为标量或数值数组。

numTrBlks = 5;%模拟传输块数SNRdB = [-20 -18 -15 -12.5 -10 -6.4 -3.5 0.7];%信噪比范围(以dB为单位)simReps = [2 16 64];%要模拟的重复

NPUSCH配置

在本节中,我们将配置生成NPUSCH所需的参数。为NPUSCH传输定义了两种类型的有效载荷,格式1(“数据”)和格式2(“控制”)。对于格式1,UE使用调制和编码方案(MCS)和通过DCI发出信号的资源分配的组合,从TS 36.213表16.5.1.2-2中定义的集确定传输块大小。对于格式2,NPUSCH携带1位ACK/NACK。的chs。NPUSCHFormat参数指定格式和infoLen指定传输块长度。本例中使用的参数是根据TS 36.104附录A.16中定义的A16-5 FRC。

HARQ操作NB-IoT有一个或两个UL HARQ进程,HARQ操作对于NB-IoT终端是异步的,除非在一个捆绑包内重复。捆绑操作依赖于HARQ实体,为作为同一捆绑的一部分的每个传输调用相同的HARQ流程。在包中,HARQ重传是非自适应的。它们在没有等待之前重复的接收反馈的情况下被触发。上行链路授权对应于一个新的传输或重传输的包,只有在包的最后一次重复之后才会收到。一个bundle的重传也是一个bundle。有关详细信息,请参见TS 36.321第5.4.2节。在这个例子中,包重传没有建模。

Ue = struct();初始化UE结构问题。NBULSubcarrierSpacing =“15 khz”% 3.75kHz, 15kHz问题。NNCellID = 10;%窄带单元识别CHS = struct();chs。NPUSCHFormat =“数据”% NPUSCH有效载荷类型(“数据”或“控制”)用于NPUSCH 'NscRU'的子载波数量取决于NPUSCH%格式和子载波间距'NBULSubcarrierSpacing',如TS 36.211所示表10.1.2.3-1. %NPUSCH有1、3、6或12个连续子载体chs。NBULSubcarrierSet = 0:11;%范围0-11 (15kHz);0-47 (3.75 khz)chs。NRUsc = length(chs.NBULSubcarrierSet);符号调制取决于NPUSCH格式和给出的NscRU表10.1.3.2-1 . % TS 36.211chs。调制=“正交相移编码”;chs。CyclicShift = 0;当NRUsc = 3或6时,需要%循环移位chs。Rnti = 20;% RNTI值chs。NLayers = 1;%层数chs。NRU= 1;%资源单位数chs。SlotIdx = 0;%槽位索引chs。NTurboDecIts = 5;涡轮解码器迭代次数的%chs。CSI =“上”在PUSCH解码中使用信道CSI通过DCI信号的RV偏移百分比(见36.213 16.5.1.2)rvDCI = 0;根据RV偏移量计算使用的RVSeqrvSeq = [2*mod(rvDCI+0,2) 2*mod(rvDCI+1,2)];如果strcmpi (chs。NPUSCHFormat,“数据”) infoLen = 136;% NPUSCH格式的传输块大小elseifstrcmpi (chs。NPUSCHFormat,“控制”) infoLen = 1;% NPUSCH格式的ACK/NACK位结束

传播信道模型配置

结构通道包含通道模型配置参数。

通道= struct;初始化通道配置结构通道。种子= 6;%沟道种子通道。NRxAnts = 2;% 2接收天线通道。DelayProfile =“ETU”%延迟配置文件通道。DopplerFreq = 1;%多普勒频率,单位为Hz通道。MIMOCorrelation =“低”%多天线相关性通道。NTerms = 16;衰落模型中使用的振荡器通道。ModelType =“GMEDS”瑞利衰落模型类型通道。InitPhase =“随机”%随机初始相通道。NormalizePathGains =“上”正常化延迟配置文件功率通道。NormalizeTxAnts =“上”用于发射天线归一化

信道估计器配置

在本例中,参数为perfectChannelEstimator控制信道估计器的行为。有效值为真正的.当设置为真正的,采用了一种完美信道估计器。否则,将使用基于接收到的NPUSCH DRS值的实用估计器。

%通道估计器行为perfectChannelEstimator = true;

结构cec配置实际信道估计器。具有1Hz多普勒的ETU延迟配置文件导致信道随时间缓慢变化。为了确保对资源块的所有子载波进行平均,将频率窗口设置为23个资源元素(resource Elements, REs)。的变量channelEstimationLength配置信道估计平均的槽数,参见表A.16.1-1不同NPUSCH配置的建议值。

配置信道估计器cec。PilotAverage =“UserDefined”导频符号平均的类型cec。TimeWindow = 1;%时间窗口大小在REscec。FreqWindow = 23;%频率窗口大小在REscec。InterpType =“立方”% 2D插值类型channelEstimationLength = 1;%信道估计长度(毫秒)

对于NPUSCH格式1的DRS信号,可以通过上层单元特定参数启用或禁用序列组跳变groupHoppingEnabled.可以通过较高层参数禁用特定UE的序列组跳转groupHoppingDisabled如TS 36.211节10.1.4.1.3所述。在本例中,我们使用SeqGroupHopping参数来启用或禁用序列组跳转

chs。SeqGroupHopping =“上”启用/禁用终端序列组跳转功能chs。SeqGroup = 0;上层参数groupAssignmentNPUSCH . %获取资源单元NULSlots中的时隙个数表10.1.2.3-1 . % TS 36.211如果strcmpi (chs。NPUSCHFormat,“数据”如果chs。NRUsc == 1 NULSlots = 16;elseif任何(chs。NRUsc == [3 6 12]) NULSlots = 24/chs.NRUsc;其他的错误(无效的子载波数。NRUsc必须是1,3,6,12'中的一个);结束elseifstrcmpi (chs。NPUSCHFormat,“控制”) NULSlots = 4;其他的错误(无效的NPUSCH格式(%s)。NPUSCHFormat必须为" Data "或" Control ", chs.NPUSCHFormat);结束chs。NULSlots = NULSlots;

块错误率模拟回路

为了执行NB-IoT NPUSCH链路级别模拟并绘制多个重复级别的BLER结果,本示例执行以下步骤:

用于UL数据传输的NPUSCH格式1传输:

  • 生成一个具有所需传输块大小的随机比特流

  • 执行CRC编码、turbo编码和速率匹配来创建NPUSCH位

  • 交错每个资源单元的位以应用时间优先映射并创建NPUSCH码字

用于NPDSCH信号HARQ反馈的NPUSCH格式2:

  • 执行HARQ指示器的位重复以创建NPUSCH码字

对于任何一种NPUSCH格式:

  • 对码字进行置乱、调制、层映射和预编码,形成复杂的NPUSCH符号

  • 将NPUSCH符号和对应的DRS映射到资源网格

  • 通过对资源网格进行SC-FDMA调制,生成时域波形

  • 用AWGN将波形通过衰落信道传递

  • 通过执行同步、信道估计和MMSE均衡来恢复传输的网格

  • 提取NPUSCH符号

  • 通过解调符号并对产生的比特估计进行信道解码来恢复传输块

注意,如果配置了实际信道估计(perfectChannelEstimator = false),还将进行基于NPUSCH DRS相关性的实际时序估计。定时偏移被初始化为零,意在表示NPRACH接收后的初始同步。当NPUSCH DRS相关性的峰值足够强时,时间估计就会更新。

在去置乱后,重复槽被软组合,然后恢复速率。对每个信噪比点计算传输块错误率。块错误率的评估是基于这样一个假设:一个包中的所有插槽都用于在终端解码传输块。bundle在MAC层(参见3GPP TS 36.321 5.4.2.1)定义为NPUSCH。NRU$ \ * $NPUSCH。NULSlots$ \ * $NPUSCH。NRep用于承载传输块的槽。

获取每帧的槽网格和槽数emptySlotGrid = lteNBResourceGrid(ue);初始化空槽网格slotGridSize = size(emptySlotGrid);NSlotsPerFrame = 20/(slotGridSize(1)/12);slot = 10e-3/NSlotsPerFrame;槽位持续时间%symbolsPerSlot = slotGridSize(2);%每个槽的符号数获取要创建的配置变量ue、chs和channel的副本%独立模拟parfor循环ueInit = ue;chsInit = chs;channelInit = channel;repIdx = 1:numel(simReps) chsInit. repIdx = 1: nummel (simReps) chsInit. repIdx = 1:NRep = simReps(repIdx);% NPUSCH的重复次数nsslotsperbundle = chsInit.NRU*chsInit.NULSlots*chsInit.NRep;码字包中的槽数TotNSlots = numTrBlks*NSlotsPerBundle;%模拟插槽总数初始化BLER和吞吐量结果maxThroughput = 0 (length(SNRdB),1);simThroughput = 0(长度(SNRdB),1);bler = 0(1,数字(SNRdB));初始化BLER结果snrIdx = 1:数字(SNRdB)% parfor snrIdx = 1:数值(SNRdB)允许使用并行计算,以提高注释输出的速度%上面的'for'语句,并取消下面的'parfor'语句的注释。这需要并行计算工具箱(TM)。如果没有安装% 'parfor'将默认为普通的'for'语句。根据循环变量设置随机数生成器种子%,确保独立的随机流rng (snrIdx“combRecursive”);ue = ueInit;初始化配置chs = chsInit;初始化chs配置channel = channelInit;初始化衰落信道配置numBlkErrors = 0;出错传输块的百分比地产= struct(“SlotIdx”, chs.SlotIdx);初始化NPUSCH编码器状态Dstate =地产;初始化NPUSCH解码器状态偏移量= 0;初始化整体帧定时偏移量TRBLK = [];初始化传输块npuschhester = [];初始化通道估计noiseEst = [];初始化噪声估计显示正在生成的槽位数流(在%gdB信噪比\n'处生成%d个插槽,对应%d个传输块, numTrBlks TotNSlots SNRdB (snrIdx));slotIdx = 0+(0:TotNSlots-1)%计算帧号和帧内槽号问题。NFrame = fix(slotIdx/NSlotsPerFrame);问题。NSlot = mod(slotIdx,NSlotsPerFrame);创建插槽网格slotGrid = emptySlotGrid;如果isempty (trblk)初始化传输通道解码器状态dstateULSCH = [];如果strcmpi (chs。NPUSCHFormat,“数据”% UL-SCH编码用于的两个RV值%传输码字。所使用的RV序列已确定%从rvDCI值在DCI和交替信号%在0和2之间,如TS 36.213节16.5.1.2所述定义传输块,该传输块将被编码以创建%码字用于不同RVtrblk = randi([0 1],infoLen,1);确定编码的传输块大小[~, info] = lteNPUSCHIndices(ue,chs);outblklen = info.G;创建对应于所使用的两个RV值的码字%在第一个和第二个块,这将重复直到所有传输块的百分比chs。RV = rvSeq(1);% RV为第一个块cw = lteNULSCH(chs,outblklen,trblk);% CRC和Turbo编码重复chs。RV = rvSeq(2);% RV为第二个块cw = [cw lteNULSCH(chs,outblklen,trblk)];%#ok % CRC和Turbo编码重复其他的TRBLK = randi([0 1],1);% 1比特ACK对于ACK,每个块传输相同的码字%定义在TS 36.212节6.3.3cw = lteNULSCH(trblk);结束blockIdx = 0;要传输的第一个数据块结束为SCFDMA调制器复制SlotIdxchs。SlotIdx = estate.SlotIdx;设置用于当前传输块的RVchs。RV = rvSeq(mod(blockIdx,size(rvSeq,2))+1);% NPUSCH编码并映射到插槽网格txsym = lteNPUSCH(ue,chs,cw(:,mod(blockIdx,size(cw,2))+1),estate);slotGrid(lteNPUSCHIndices(ue,chs)) = txsym;% NPUSCH DRS和映射到插槽网格[dmrs,estate] = lteNPUSCHDRS(ue,chs,estate);slotGrid(lteNPUSCHDRSIndices(ue,chs)) = dmrs;%如果传输了一个完整的块,增加时钟计数器,使%可以选择正确的码字如果房地产。EndOfBlk blockIdx = blockIdx + 1;结束%执行SC-FDMA调制以创建时域波形[tx波形,scfdmaInfo] = lteSCFDMAModulate(ue,chs,slotGrid);添加25个样本填充。这是为了覆盖延迟的范围%的预期从通道建模(组合%实现延迟和信道延迟扩展)tx波形= [tx波形;0(25、大小(txWaveform 2)));% #好< AGROW >初始化每个槽的通道时间通道。InitTime = slotIdx* slolot;通过通道模型传递数据通道。SamplingRate = scfdmaInfo.SamplingRate;[rx波形,fadingInfo] = lteFadingChannel(通道,tx波形);计算噪声增益信噪比= 10^(SNRdB(snrIdx)/10);将噪声功率归一化以考虑采样率,即用于SC-FDMA调制的IFFT大小的函数N0 = 1/√(2.0*double(scfdmaInfo.Nfft)*信噪比);创建加性高斯白噪声噪声= N0*complex(randn(size(rx波形)),...randn(大小(rxWaveform)));将AWGN添加到接收的时域波形中rx波形= rx波形+噪声;%------------------------------------------------------------------%接收%------------------------------------------------------------------%执行定时同步,提取相应的%子帧的接收波形,并执行SC-FDMA%解调如果(perfectChannelEstimator) offset = hPerfectTimingEstimate(fadingInfo);其他的[t,mag] = lteULFrameOffsetNPUSCH(ue, chs, rx波形,dstate);hSkipWeakTimingOffset函数用于更新%接收机定时偏移量。如果相关峰值为'mag'%是弱的,当前的时间估计't'被忽略%使用先前估计的“偏移量”offset = hSkipWeakTimingOffset(offset,t,mag);结束同步接收到的波形rx波形= rx波形(1+offset:end,:);对接收到的数据进行SC-FDMA解调以重建%的资源网格,包括填充在事件%实际同步将导致不完整的槽为%解调rxSlot = lteSCFDMADemodulate(ue,chs, rx波形);[K,L,R] = size(rxSlot);如果(L < symbolsPerSlot) rxSlot = cat(2,rxSlot, 0 (K,symbolsPerSlot-L,R));结束%信道估计如果(perfectChannelEstimator)%完美信道估计问题。TotSlots = 1;%通道估计为1插槽estChannelGrid = lteULPerfectChannelEstimate(ue, chs, channel, offset);noiseGrid = lteSCFDMADemodulate(ue,chs,noise(1+offset:end,:));noiseEstSlot = var(noiseGrid(:));其他的[estChannelGrid, noiseEstSlot] = lteULChannelEstimateNPUSCH(ue, chs, cec, rxSlot, dstate);结束获取NPUSCH指数npuschIndices = lteNPUSCHIndices(ue,chs);从接收的槽中获取NPUSCH资源元素[rxNpuschSymbols, npuschHestSlot] = lteExtractResources(npuschIndices, npuschIndices,...rxSlot estChannelGrid);执行信道估计和噪声估计缓冲%的情况下,实际的信道估计如果(perfectChannelEstimator) npuschHest = npuschHestSlot;noiseEst = noiseEstSlot;其他的npuschHest = cat(3,npuschHest,npuschHestSlot);noiseEst = cat(1,noiseEst,noiseEstSlot);如果(size(npuschHest,3) > channelEstimationLength) npuschHest = npuschHest(:,:,2:end);noiseEst = noiseEst(2:end);结束结束解码NPUSCH[rxcw,dstate,symbols] = lteNPUSCHDecode(...ue, chs, rxNpuschSymbols, mean(npuschest,3), mean(noiseEst),dstate);当一个块中的所有槽都有时解码传输块收到百分比如果dstate。EndOfBlk%软组合传输通道解码器[out, err, dstateULSCH] = lteNULSCHDecode(chs,infoLen,rxcw,dstateULSCH);结束如果bundle中的所有插槽都已接收,则计数%错误,并重新初始化下一个bundle如果dstate。EndOfTx如果strcmpi (chs。NPUSCHFormat,“控制”) err = ~isequal(out,trblk);结束numBlkErrors = numBlkErrors + err;重新初始化以启用新的传输%块TRBLK = [];结束结束计算块错误率bler(snrIdx) = numBlkErrors/numTrBlks;流(' npusch bler = %。4 f \ n”提单(snrIdx));计算最大吞吐量和模拟吞吐量maxThroughput(snrIdx) = infoLen*numTrBlks;最大可能吞吐量simThroughput(snrIdx) = infoLen*(numTrBlks-numBlkErrors);%模拟吞吐量流('NPUSCH吞吐量(%%)= %。4 f % % \ n”simThroughput (snrIdx) * 100 / maxThroughput (snrIdx));结束%图块错误率vs信噪比结果如果repIdx == 1图;网格;持有;包含(“信噪比(dB)”);ylabel (“提单”);Legendstr = {['NRep = 'num2str (chsInit.NRep)]};其他的传奇str =[传奇str]'NRep = 'num2str (chsInit.NRep)];% #好< AGROW >结束情节(SNRdB,提单,“o”);结束%设置图形标题标题(sprintf (' NPUSCH携带%s: NRUsc = %d, NRU = %d, TBS = %d'...chsInit.NPUSCHFormat、chsInit.NRUsc chsInit.NRU infoLen));传奇(legendstr);
在-20dB SNR NPUSCH BLER = 1.0000 NPUSCH Throughput(%) = 0.0000 %在-18dB SNR NPUSCH BLER = 1.0000 NPUSCH Throughput(%) = 0.0000 %在-15dB SNR NPUSCH BLER = 1.0000 NPUSCH Throughput(%) = 0.0000 %在-12.5dB SNR NPUSCH BLER = 1.0000 NPUSCH Throughput(%) = 0.0000 %在5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应5个传输块(s)生成20个槽位对应NPUSCH Throughput(%) = 0.0000 %在-10dB信噪比NPUSCH BLER = 1.0000 NPUSCH Throughput(%) = 0.0000 %在- 64db信噪比NPUSCH BLER = 0.4000 NPUSCH Throughput(%) = 60.0000 %在-3.5dB信噪比NPUSCH BLER = 0.0000 NPUSCH Throughput(%) = 100.0000 %在0.7dB信噪比NPUSCH BLER = 0.0000 NPUSCH Throughput(%) = 100.0000% Generating 160 slots corresponding to 5 transport block(s) at -20dB SNR NPUSCH BLER = 1.0000 NPUSCH Throughput(%) = 0.0000 % Generating 160 slots corresponding to 5 transport block(s) at -18dB SNR NPUSCH BLER = 1.0000 NPUSCH Throughput(%) = 0.0000 % Generating 160 slots corresponding to 5 transport block(s) at -15dB SNR NPUSCH BLER = 0.6000 NPUSCH Throughput(%) = 40.0000 % Generating 160 slots corresponding to 5 transport block(s) at -12.5dB SNR NPUSCH BLER = 0.2000 NPUSCH Throughput(%) = 80.0000 % Generating 160 slots corresponding to 5 transport block(s) at -10dB SNR NPUSCH BLER = 0.0000 NPUSCH Throughput(%) = 100.0000 % Generating 160 slots corresponding to 5 transport block(s) at -6.4dB SNR NPUSCH BLER = 0.0000 NPUSCH Throughput(%) = 100.0000 % Generating 160 slots corresponding to 5 transport block(s) at -3.5dB SNR NPUSCH BLER = 0.0000 NPUSCH Throughput(%) = 100.0000 % Generating 160 slots corresponding to 5 transport block(s) at 0.7dB SNR NPUSCH BLER = 0.0000 NPUSCH Throughput(%) = 100.0000 % Generating 640 slots corresponding to 5 transport block(s) at -20dB SNR NPUSCH BLER = 1.0000 NPUSCH Throughput(%) = 0.0000 % Generating 640 slots corresponding to 5 transport block(s) at -18dB SNR NPUSCH BLER = 0.6000 NPUSCH Throughput(%) = 40.0000 % Generating 640 slots corresponding to 5 transport block(s) at -15dB SNR NPUSCH BLER = 0.2000 NPUSCH Throughput(%) = 80.0000 % Generating 640 slots corresponding to 5 transport block(s) at -12.5dB SNR NPUSCH BLER = 0.0000 NPUSCH Throughput(%) = 100.0000 % Generating 640 slots corresponding to 5 transport block(s) at -10dB SNR NPUSCH BLER = 0.0000 NPUSCH Throughput(%) = 100.0000 % Generating 640 slots corresponding to 5 transport block(s) at -6.4dB SNR NPUSCH BLER = 0.0000 NPUSCH Throughput(%) = 100.0000 % Generating 640 slots corresponding to 5 transport block(s) at -3.5dB SNR NPUSCH BLER = 0.0000 NPUSCH Throughput(%) = 100.0000 % Generating 640 slots corresponding to 5 transport block(s) at 0.7dB SNR NPUSCH BLER = 0.0000 NPUSCH Throughput(%) = 100.0000 %

大量的运输街区,numTrBlks应该用于产生有意义的吞吐量结果。下面的图显示了模拟运行numTrBlks设置为5000不同的重复,与完美的信道估计器。

选定的参考书目

  1. 3GPP TS 36.211《物理通道和调制》

  2. 3GPP TS 36.212“多路复用和信道编码”

  3. 3GPP TS 36.213“物理层程序”

  4. 3GPP TS 36.104《基站(BS)无线电发射与接收》

  5. 3GPP TS 36.321“介质访问控制(MAC);协议规范”

  6. 3GPP TS 36.331“无线电资源控制(RRC);协议规范”

  7. 3GPP TS 36.300”总体描述;第二阶段”

  8. O. Liberg, M. Sundberg, y . p。Wang, J. Bergman和J. Sachs,蜂窝物联网:技术、标准和性能,爱思唯尔,2018。

辅助函数

本例中使用了以下helper函数:

Baidu
map