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

100 篇文章 0 订阅
42 篇文章 1 订阅

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[n] * 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 = False

resetNprachMapping用于重置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)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值