您的位置:首页 > 大数据 > 物联网

NG Toolset开发笔记--NB-IoT Resource Grid(11)

2018-02-17 20:06 323 查看
2/17号完成NPRACH时频域资源计算。
(1)考虑到nprach采用3.75KHz single-tone frequency hopping,所以修改ngNbGridUl的shape为:
(1, 48, self.symbPerRfNbUl) #init gridNbDl and gridNbUl for dn="hsfn_sfn"
if not dn in self.gridNbDl:
self.gridNbDl[dn] = np.full((self.args['nbDlAp'], self.scNbDl, self.symbPerRfNbDl), NbiotResType.NBIOT_RES_BLANK.value)
#self.gridNbUl[dn] = np.full((1, self.scNbUl, self.symbPerRfNbUl), NbiotResType.NBIOT_RES_BLANK.value)
#for NPRACH mapping, set shape to (1, 48, self.symbPerRfNbUl)
self.gridNbUl[dn] = np.full((1, 48, self.symbPerRfNbUl), NbiotResType.NBIOT_RES_BLANK.value)即不管NB UL subcarrier spacing是3.75KHz还是15KHz。相应的对于15KHz UL SC spacing,在最终绘制NB UL Grid时需做特殊处理(1列4行合并作为一个NPUSCH RE)。
(2)nprach时域简化处理:
nprach preamble支持2种格式,format 0和format 1。通过SIB2参数nprach-CP-Length-r13(66.7us or 266.7us)指示。对于format 0/1,ra symbol group的长度分别为1.4s和1.6s,连续4个ra symbol group为一个preamble。
为方便nb ul grid绘制(nprach与npusch一起绘制),假定ra symbol group长度固定为1.5s,preamble长度为6s。
对于上行3.75KHz,每个slot为2ms,每个preamble占用21个symbol/3个slot,假定symbol group的长度分别为[5,5,5,6]个symbol;
对于上行15KHz,每个slot为0.5ms,每个preamble占用84个symbol/12个slot,每个symbol group长度为21symbols/3slots。
(3)nprach mapping数据结构组织#data struture for NPRACH mapping
self.nprachMap = [] #list of OrderedDict, where key='hsfn_sfn', value=[[symbols for group0], [group1], [group2], [group3]] or None for nprach gap
self.scNbRa = 12
self.initNprachFreqLoc()
self.sendingNprach = False其中initNprachFreqLoc用于初始化nprach per symbol group频域跳频图案:def initNprachFreqLoc(self):
self.nInit = np.random.randint(0, self.args['nprachNumSc'])
nStart = self.args['nprachScOff'] + math.floor(self.nInit / self.scNbRa) * self.scNbRa
self.nScRa = [self.nInit % self.scNbRa]

c = randc(self.args['nbPci'], 10*self.args['nprachRepPerAtt'])
f = []
for t in range(self.args['nprachRepPerAtt']):
nset = list(range(10*t+1, 10*(t+1)))
ft = sum([c
* 2**(n-(10*t+1)) for n in nset]) % (self.scNbRa - 1) + 1
if t > 0:
ft = ft + f[t - 1]
f.append(ft % self.scNbRa)

for i in range(1, 4 * self.args['nprachRepPerAtt']):
if i % 4 == 0 and i > 0:
self.nScRa.append((self.nScRa[0] + f[i // 4]) % self.scNbRa)
elif i % 4 in [1, 3] and self.nScRa[i-1] % 2 == 0:
self.nScRa.append(self.nScRa[i-1] + 1)
elif i % 4 in [1, 3] and self.nScRa[i-1] % 2 == 1:
self.nScRa.append(self.nScRa[i-1] - 1)
elif i % 4 == 2 and self.nScRa[i-1] < 6:
self.nScRa.append(self.nScRa[i-1] + 6)
elif i % 4 == 2 and self.nScRa[i-1] >= 6:
self.nScRa.append(self.nScRa[i-1] - 6)

self.nScRa = [nStart + n for n in self.nScRa](4)fillNprach部分实现代码如下:def fillNprach(self, hsfn, sfn):
if sfn % (self.args['nprachPeriod'] // 10) == 0 and not self.sendingNprach:
self.resetNprachMapping(hsfn, sfn)

key = str(hsfn) + '_' + str(sfn)

for rep in range(self.args['nprachRepPerAtt']):
if not key in self.nprachMap[rep]:
continue

if key in self.nprachMap[rep] and self.nprachMap[rep][key] is None: #NPRACH gap
continue

#set or clear sendingNprach flag
if not self.sendingNprach:
self.sendingNprach = True
if self.sendingNprach and rep == self.args['nprachRepPerAtt']-1 and list(self.nprachMap[rep].keys())[-1] == key:
self.sendingNprach = FalseresetNprachMapping用于重置nprach时域mapping:def resetNprachMapping(self, hsfn, sfn):
self.nprachMap.clear()
self.nprachMap = [OrderedDict() for i in range(self.args['nprachRepPerAtt'])]

hsfn, sfn, subf = incSubf(hsfn, sfn, 0, self.args['nprachStartTime'])

if self.args['nbUlScSpacing'] == NbiotPhy.NBIOT_UL_3DOT75K.value:
slotNprachPreamb = 3
symbNprachPreamb = (5, 5, 5, 6)
if subf / self.slotDurNbUl > self.slotPerRfNbUl - 1:
hsfn, sfn = incSfn(hsfn, sfn)
slot = 0
else:
slot = math.floor(subf / self.slotDurNbUl)
else:
slotNprachPreamb = 12
symbNprachPreamb= (21, 21, 21, 21)
slot = math.floor(subf / self.slotDurNbUl)

rep = 0
while rep < self.args['nprachRepPerAtt']:
if rep > 0 and rep % 64 == 0: #after 64 nprach preambles, a 40ms gap is inserted
for i in range(4):
hsfn, sfn = incSfn(hsfn, sfn, 1)
key = str(hsfn) + '_' + str(sfn)
if not key in self.nprachMap[rep]:
self.nprachMap[rep][key] = None

hsfn, sfn, slot, _list = self.findNextNSlots(hsfn, sfn, slot, slotNprachPreamb)

'''
self.ngwin.logEdit.append('content of findNextNSlots._list (rep=%d):' % rep)
self.ngwin.logEdit.append('%s' % ','.join(_list))
'''

symbGrps = [_list[:sum(symbNprachPreamb[:1])],
_list[sum(symbNprachPreamb[:1]):sum(symbNprachPreamb[:2])],
_list[sum(symbNprachPreamb[:2]):sum(symbNprachPreamb[:3])],
_list[sum(symbNprachPreamb[:3]):sum(symbNprachPreamb[:4])]]

for i, grp in enumerate(symbGrps):
for symb in grp:
tokens = symb.split('|')
key = tokens[0]
isymb = int(tokens[1])
if not key in self.nprachMap[rep] or self.nprachMap[rep][key] is None:
self.nprachMap[rep][key] = [None, None, None, None]
self.nprachMap[rep][key][i] = [isymb]
elif self.nprachMap[rep][key][i] is None:
self.nprachMap[rep][key][i] = [isymb]
else:
self.nprachMap[rep][key][i].append(isymb)

self.ngwin.logEdit.append('NPRACH mapping(rep=%d):' % rep)
for key, val in self.nprachMap[rep].items():
self.ngwin.logEdit.append('-->rep=%d,key=%s,val=%s' % (rep, key, val))

rep = rep + 1(5)nprach时频域资源打印输出信息如下(UI特殊参数配置为:numRepetitionsPerPreambleAttempt-r13 = r128,nprach-SubcarrierOffset-r13=n12):NPRACH frequency locations (nInit=2):
-->NPRACH repetion #0: [14,15,21,20]
-->NPRACH repetion #1: [17,16,22,23]
-->NPRACH repetion #2: [18,19,13,12]
-->NPRACH repetion #3: [16,17,23,22]
-->NPRACH repetion #4: [12,13,19,18]
-->NPRACH repetion #5: [16,17,23,22]
-->NPRACH repetion #6: [18,19,13,12]
-->NPRACH repetion #7: [20,21,15,14]
-->NPRACH repetion #8: [23,22,16,17]
-->NPRACH repetion #9: [12,13,19,18]
-->NPRACH repetion #10: [14,15,21,20]
-->NPRACH repetion #11: [23,22,16,17]
-->NPRACH repetion #12: [20,21,15,14]
-->NPRACH repetion #13: [12,13,19,18]
-->NPRACH repetion #14: [19,18,12,13]
-->NPRACH repetion #15: [18,19,13,12]
-->NPRACH repetion #16: [20,21,15,14]
-->NPRACH repetion #17: [17,16,22,23]
-->NPRACH repetion #18: [19,18,12,13]
-->NPRACH repetion #19: [12,13,19,18]
-->NPRACH repetion #20: [17,16,22,23]
-->NPRACH repetion #21: [14,15,21,20]
-->NPRACH repetion #22: [13,12,18,19]
-->NPRACH repetion #23: [23,22,16,17]
-->NPRACH repetion #24: [17,16,22,23]
-->NPRACH repetion #25: [20,21,15,14]
-->NPRACH repetion #26: [16,17,23,22]
-->NPRACH repetion #27: [14,15,21,20]
-->NPRACH repetion #28: [15,14,20,21]
-->NPRACH repetion #29: [19,18,12,13]
-->NPRACH repetion #30: [20,21,15,14]
-->NPRACH repetion #31: [17,16,22,23]
-->NPRACH repetion #32: [23,22,16,17]
-->NPRACH repetion #33: [18,19,13,12]
-->NPRACH repetion #34: [23,22,16,17]
-->NPRACH repetion #35: [12,13,19,18]
-->NPRACH repetion #36: [16,17,23,22]
-->NPRACH repetion #37: [19,18,12,13]
-->NPRACH repetion #38: [17,16,22,23]
-->NPRACH repetion #39: [16,17,23,22]
-->NPRACH repetion #40: [12,13,19,18]
-->NPRACH repetion #41: [21,20,14,15]
-->NPRACH repetion #42: [13,12,18,19]
-->NPRACH repetion #43: [21,20,14,15]
-->NPRACH repetion #44: [23,22,16,17]
-->NPRACH repetion #45: [12,13,19,18]
-->NPRACH repetion #46: [13,12,18,19]
-->NPRACH repetion #47: [12,13,19,18]
-->NPRACH repetion #48: [13,12,18,19]
-->NPRACH repetion #49: [14,15,21,20]
-->NPRACH repetion #50: [23,22,16,17]
-->NPRACH repetion #51: [12,13,19,18]
-->NPRACH repetion #52: [13,12,18,19]
-->NPRACH repetion #53: [17,16,22,23]
-->NPRACH repetion #54: [18,19,13,12]
-->NPRACH repetion #55: [22,23,17,16]
-->NPRACH repetion #56: [18,19,13,12]
-->NPRACH repetion #57: [20,21,15,14]
-->NPRACH repetion #58: [22,23,17,16]
-->NPRACH repetion #59: [14,15,21,20]
-->NPRACH repetion #60: [18,19,13,12]
-->NPRACH repetion #61: [22,23,17,16]
-->NPRACH repetion #62: [13,12,18,19]
-->NPRACH repetion #63: [20,21,15,14]
-->NPRACH repetion #64: [21,20,14,15]
-->NPRACH repetion #65: [12,13,19,18]
-->NPRACH repetion #66: [15,14,20,21]
-->NPRACH repetion #67: [23,22,16,17]
-->NPRACH repetion #68: [15,14,20,21]
-->NPRACH repetion #69: [22,23,17,16]
-->NPRACH repetion #70: [14,15,21,20]
-->NPRACH repetion #71: [15,14,20,21]
-->NPRACH repetion #72: [13,12,18,19]
-->NPRACH repetion #73: [20,21,15,14]
-->NPRACH repetion #74: [21,20,14,15]
-->NPRACH repetion #75: [15,14,20,21]
-->NPRACH repetion #76: [18,19,13,12]
-->NPRACH repetion #77: [22,23,17,16]
-->NPRACH repetion #78: [16,17,23,22]
-->NPRACH repetion #79: [20,21,15,14]
-->NPRACH repetion #80: [22,23,17,16]
-->NPRACH repetion #81: [19,18,12,13]
-->NPRACH repetion #82: [16,17,23,22]
-->NPRACH repetion #83: [19,18,12,13]
-->NPRACH repetion #84: [12,13,19,18]
-->NPRACH repetion #85: [15,14,20,21]
-->NPRACH repetion #86: [19,18,12,13]
-->NPRACH repetion #87: [12,13,19,18]
-->NPRACH repetion #88: [14,15,21,20]
-->NPRACH repetion #89: [13,12,18,19]
-->NPRACH repetion #90: [19,18,12,13]
-->NPRACH repetion #91: [22,23,17,16]
-->NPRACH repetion #92: [15,14,20,21]
-->NPRACH repetion #93: [22,23,17,16]
-->NPRACH repetion #94: [17,16,22,23]
-->NPRACH repetion #95: [20,21,15,14]
-->NPRACH repetion #96: [21,20,14,15]
-->NPRACH repetion #97: [15,14,20,21]
-->NPRACH repetion #98: [18,19,13,12]
-->NPRACH repetion #99: [22,23,17,16]
-->NPRACH repetion #100: [15,14,20,21]
-->NPRACH repetion #101: [22,23,17,16]
-->NPRACH repetion #102: [12,13,19,18]
-->NPRACH repetion #103: [21,20,14,15]
-->NPRACH repetion #104: [23,22,16,17]
-->NPRACH repetion #105: [15,14,20,21]
-->NPRACH repetion #106: [17,16,22,23]
-->NPRACH repetion #107: [21,20,14,15]
-->NPRACH repetion #108: [19,18,12,13]
-->NPRACH repetion #109: [14,15,21,20]
-->NPRACH repetion #110: [15,14,20,21]
-->NPRACH repetion #111: [22,23,17,16]
-->NPRACH repetion #112: [15,14,20,21]
-->NPRACH repetion #113: [19,18,12,13]
-->NPRACH repetion #114: [17,16,22,23]
-->NPRACH repetion #115: [21,20,14,15]
-->NPRACH repetion #116: [23,22,16,17]
-->NPRACH repetion #117: [21,20,14,15]
-->NPRACH repetion #118: [16,17,23,22]
-->NPRACH repetion #119: [20,21,15,14]
-->NPRACH repetion #120: [13,12,18,19]
-->NPRACH repetion #121: [20,21,15,14]
-->NPRACH repetion #122: [15,14,20,21]
-->NPRACH repetion #123: [13,12,18,19]
-->NPRACH repetion #124: [21,20,14,15]
-->NPRACH repetion #125: [15,14,20,21]
-->NPRACH repetion #126: [20,21,15,14]
-->NPRACH repetion #127: [13,12,18,19]
###以上为NPRACH频域位置,[x,y,z,w]分别为preamble的symbol group 0~3频域跳频位置。

NPRACH mapping(rep=61):
-->rep=61,key=0_37,val=[[56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76], [77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97], [98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118], [119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139]]
NPRACH mapping(rep=62):
-->rep=62,key=0_38,val=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], [42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62], [63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83]]
NPRACH mapping(rep=63):
-->rep=63,key=0_38,val=[[84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104], [105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125], [126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139], None]
-->rep=63,key=0_39,val=[None, None, [0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]]
NPRACH mapping(rep=64):
-->rep=64,key=0_40,val=None
-->rep=64,key=0_41,val=None
-->rep=64,key=0_42,val=None
-->rep=64,key=0_43,val=[[28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48], [49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69], [70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90], [91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111]]
NPRACH mapping(rep=65):
-->rep=65,key=0_43,val=[[112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132], [133, 134, 135, 136, 137, 138, 139], None, None]
-->rep=65,key=0_44,val=[None, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], [35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55]]
NPRACH mapping(rep=66):
-->rep=66,key=0_44,val=[[56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76], [77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97], [98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118], [119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139]]
NPRACH mapping(rep=67):
-->rep=67,key=0_45,val=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], [42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62], [63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83]]
NPRACH mapping(rep=68):
-->rep=68,key=0_45,val=[[84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104], [105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125], [126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139], None]
-->rep=68,key=0_46,val=[None, None, [0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]]
###以上为nprach时域位置(per repetition),val=None表示nprach gap,否则val=[[group0], [group1], [group2], [group3]]分别表示
###preamble symbol group 0~3占用的符号位置(0~139 for 15KHz and 0~34 for 3.75KHz)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: