NG Toolset开发笔记--5GNR Resource Grid(43)

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

General assumptions for implementation:

(1) Considerations on time-domain notation

sfn + subframe + slot + symbol

SFN: 0~1023 in decimal and 0x000~0x3FF in hex

subframe per radio frame: 10 in decimal and its index is 0x0~0x9 in hex

slot per subframe: 1~16 in decimal, and its index is 0x0~0xF in hex

symbols per slot: 14 or 12 in decimal, and its index is 0x0~0xB or 0xD in hex

 

for symbols within a frame: 3bits+1bit+1bit+1bit = 6bits in hex

for slots within a frame: 5bits in hex

for subframes within a frame: 4bits in hex

 

(2) Considerations on grids

time-domain signals are generated per antenna port per scs

we have different scs settings:

*ssb scs: for pss/sss/pbch/dmrs for pbch

*common scs: for sib1, msg2, msg4 and their dmrs; for coreset0 and its dmrs

*msg1 scs: for prach

*carrier scs: for bwp 0/1, coreset1 and its dmrs; for normal pdsch/pusch and their dmrs; for ptrs for pusch/pdsch; for srs/csi-rs; for pucch and its dmrs

*offsetToPointA: scs same as n_crb_ssb

*offsetToCarrier: scs = carrier scs, assumed equal to minGuardBand

*k_ssb: scs = 15k for ssb type A(FR1) and scs=common scs for ssb type B(FR2)

*n_crb_ssb: scs=15k for ssb type A(FR1) and scs=60k for ssb type B(FR2)

for simplicity, assume base scs is 15k for FR1 and 60k for FR2

(3) Considerations on antenna ports

The following antenna ports are defined for the downlink:

-    Antenna ports starting with 1000 for PDSCH

-    Antenna ports starting with 2000 for PDCCH

-    Antenna ports starting with 3000 for channel-state information reference signals

-    Antenna ports starting with 4000 for SS/PBCH block transmission

 

The following antenna ports are defined for the uplink:

-    Antenna ports starting with 0 for demodulation reference signals for PUSCH

-    Antenna ports starting with 1000 for SRS, PUSCH

-    Antenna ports starting with 2000 for PUCCH

-    Antenna port 4000 for PRACH

 

For DL:

  1. ap=4000 used for SSB and DMRS for PBCH
  2. ap=2000 used for PDCCH and DMRS for PDCCH
  3. ap=1000~1011 used for PDSCH and DMRS for PDSCH
  4. ap=1000~1005 used for PTRS for PDSCH
  5. ap=3000~3031 used for CSI-RS

 

For UL:

  1. ap=4000 used for PRACH
  2. ap=2000 used for PUCCH and DMRS for PUCCH
  3. ap=1000~1003 used for SRS and PUSCH
  4. ap=0~11 used for DMRS for PUSCH
  5. ap=0~5 used for PTRS for PUSCH

(4) Always-on transmissions

Only SSB and SIB1 are considered as always-on transmissions.

(5) time/frequency range of grid

for TDD:

self.gridNbTdd[dn] = np.full((self.nrScTot, self.nrSymbPerRfNormCp), NrResType.NR_RES_F.value)

for FDD:

self.gridNbFddDl[dn] = np.full((self.nrScTot, self.nrSymbPerRfNormCp), NrResType.NR_RES_D.value)

self.gridNbFddUl[dn] = np.full((self.nrScTot, self.nrSymbPerRfNormCp), NrResType.NR_RES_U.value)

Example codes for above assumptions:

def init(self):
        self.ngwin.logEdit.append('---->inside init')
        
        #HSFN not exit in NR specs, but used in 5GNR resource grid for convenience
        self.hsfn = 0
        
        self.nrSubfPerRf = 10
        self.nrSlotPerSubf = [2 ** mu for mu in range(5)]
        self.nrSlotPerRf = [self.nrSubfPerRf * 2 ** mu for mu in range(5)]
        self.nrScs2Mu = {15:0, 30:1, 60:2, 120:3, 240:4}
        self.nrSymbPerSlotNormCp = 14
        self.nrSymbPerSlotExtCp = 12
        self.nrScPerPrb = 12
        
        self.baseScsFd = 15 if self.args['freqBand']['freqRange'] == 'FR1' else 60 
        self.baseScsTd = 60 if self.args['freqBand']['freqRange'] == 'FR1' else 240 
        
        self.nrCarrierScs = int(self.args['carrierGrid']['scs'][:-3])
        self.nrCarrierMinGuardBand = int(self.args['carrierGrid']['minGuardBand'])
        self.nrCarrierNumRbs = int(self.args['carrierGrid']['numRbs'])
        
        self.nrScTot = self.nrScPerPrb * (self.nrCarrierMinGuardBand + self.nrCarrierNumRbs) * (self.nrCarrierScs // self.baseScsFd)
        self.nrSymbPerRfNormCp = self.nrSymbPerSlotNormCp * self.nrSlotPerRf[self.nrScs2Mu[self.baseScsTd]]
        
        self.gridNrTdd = OrderedDict()
        self.gridNrFddDl = OrderedDict()
        self.gridNrFddUl = OrderedDict()
        dn = '%s_%s' % (self.hsfn, self.args['mib']['sfn'])
        if self.args['freqBand']['duplexMode'] == 'TDD':
            self.gridNrTdd[dn] = np.full((self.nrScTot, self.nrSymbPerRfNormCp), NrResType.NR_RES_F.value)
            if not self.initTddUlDlConfig():
                return False
            self.initTddGrid(self.hsfn, int(self.args['mib']['sfn']))
        elif self.args['freqBand']['duplexMode'] == 'FDD':
            self.gridNrFddDl[dn] = np.full((self.nrScTot, self.nrSymbPerRfNormCp), NrResType.NR_RES_D.value)
            self.gridNrFddUl[dn] = np.full((self.nrScTot, self.nrSymbPerRfNormCp), NrResType.NR_RES_U.value)
        else:
            return False
        
        return True

part of initTddGrid function:

tddCfgMap = {'D':NrResType.NR_RES_D.value, 'F':NrResType.NR_RES_F.value, 'U':NrResType.NR_RES_U.value}
        scale = self.baseScsTd // self.nrTddCfgRefScs
        self.ngwin.logEdit.append('scale=%d where baseScTd=%dKHz and tddCfgRefScs=%dKHz' % (scale, self.baseScsTd, self.nrTddCfgRefScs))
        if sfn % 2 == 0:
            for i in range(len(self.tddPatEvenRf)):
                for j in range(scale):
                    self.gridNrTdd[dn][:,i*scale+j] = tddCfgMap[self.tddPatEvenRf[i]] 
        else:
            for i in range(len(self.tddPatOddRf)):
                for j in range(scale):
                    self.gridNrTdd[dn][:,i*scale+j] = tddCfgMap[self.tddPatOddRf[i]]

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值