NG Toolset開發筆記--5GNR Resource Grid(55)

7/23 update:

aotSrs is OK, including:

*(TODO) transmission of DSR for Msg5 scheduling

*(TODO) and PDCCH occasion detection within CORESET1/USS (need the 'SRS resource indication' field in DCI 0_1)

*(TODO) and subsequent transmission of Msg5

*transmission of SRS

 

7/28 update:

(1) bugfix for aotSrs: k0Bar per antenna port when cs >= csMax/2, in which case the k0Bar differs between port0/2 and port 1/3 for SRS with 4 ports.

example debug output(4 ports, 4 combs, cyclicShift=11):
see below

(2) bugfix for aotSrs: co-existence of PUSCH/PUCCH/SRS (only partially implemented), refre to 3GPP 38.214

*PUSCH must precede SRS in the same slot

*SRS symbol-skipping if overlapped with PUCCH

example debug output for PUSCH/PUCCH/SRS co-existence validation:
---->inside aotSrs(hsfn=0,sfn=4,slot=7)
valid slot for periodic SRS(srsResId=0,period=10slots,offset=7slots): hsfn=0,sfn=4,slot=7
antenna port pi=1000(numScsSrs=48): k0Bar=0, k0=[384, 384, 384, 384]
antenna port pi=1001(numScsSrs=48): k0Bar=2, k0=[386, 386, 386, 386]
antenna port pi=1002(numScsSrs=48): k0Bar=0, k0=[384, 384, 384, 384]
antenna port pi=1003(numScsSrs=48): k0Bar=2, k0=[386, 386, 386, 386]
sl=7, lap=0, l0=10, srsSymbsInBaseScsTd=[216, 217]
validate PUSCH/PUCCH/SRS: setPusch=set(), setPucch={220, 221, 222, 223}, setSrs={216, 217}
sl=7, lap=1, l0=10, srsSymbsInBaseScsTd=[218, 219]
validate PUSCH/PUCCH/SRS: setPusch=set(), setPucch={220, 221, 222, 223}, setSrs={218, 219}
sl=7, lap=2, l0=10, srsSymbsInBaseScsTd=[220, 221]
validate PUSCH/PUCCH/SRS: setPusch=set(), setPucch={220, 221, 222, 223}, setSrs=set()
sl=7, lap=3, l0=10, srsSymbsInBaseScsTd=[222, 223]
validate PUSCH/PUCCH/SRS: setPusch=set(), setPucch={220, 221, 222, 223}, setSrs=set()

valid slot for periodic SRS(srsResId=0,period=10slots,offset=7slots): hsfn=0,sfn=4,slot=17
antenna port pi=1000(numScsSrs=48): k0Bar=0, k0=[0, 0, 0, 0]
antenna port pi=1001(numScsSrs=48): k0Bar=2, k0=[2, 2, 2, 2]
antenna port pi=1002(numScsSrs=48): k0Bar=0, k0=[0, 0, 0, 0]
antenna port pi=1003(numScsSrs=48): k0Bar=2, k0=[2, 2, 2, 2]
sl=17, lap=0, l0=10, srsSymbsInBaseScsTd=[496, 497]
validate PUSCH/PUCCH/SRS: setPusch=set(), setPucch=set(), setSrs={496, 497}
sl=17, lap=1, l0=10, srsSymbsInBaseScsTd=[498, 499]
validate PUSCH/PUCCH/SRS: setPusch=set(), setPucch=set(), setSrs={498, 499}
sl=17, lap=2, l0=10, srsSymbsInBaseScsTd=[500, 501]
validate PUSCH/PUCCH/SRS: setPusch=set(), setPucch=set(), setSrs={500, 501}
sl=17, lap=3, l0=10, srsSymbsInBaseScsTd=[502, 503]
validate PUSCH/PUCCH/SRS: setPusch=set(), setPucch=set(), setSrs={502, 503}

 

(1) Detection of DCI 0_1 scheduling Msg5 (TODO)

alwaysOnTr needs update:

if self.msg4Recved:
            if not self.error:
                self.aotCsirs(hsfn, sfn, slot)

            if not self.error and self.dci01SriRecved:
                self.aotSrs(hsfn, sfn, slot)

Currently, assume self.dci01SriRecved = True.

(2) SRS transmission

CB-PUSCH and nonCB-PUSCH details:

SRS scheme is different depends on 'txConfig' of PUSCH, that's, CB PUSCH or nonCB PUSCH. CB is abbreviation of 'codebook'.

For CB PUSCH:

**there are one srs-ResourceSet configured as 'codebook', and there are 1~2 srs-Resources in the srs-ResourceSet;

**each srs-Resource must have same port number, that's, either port1, ports2 or ports4;

**each srs-Resource must have same time-domain behaviour, that's, same period(in slot) and same offset(in slot);

**'SRS resource indication' field (abbreviated as SRI) in DCI 0_1 can be used to select one out of max 2 SRS resources;

**the 'Precoding information and number of layers' field in DCI 0_1 together with 'maxRank' of PUSCH,  are used to determine PUSCH transmission rank(or layers), which is used to determine PUSCH DMRS ports

** the 'maxRank' of PUSCH and the 'nrofSRS-Ports' of srs-Resource are related somehow; for example, if maxRank=3/4, nrofSRS-Ports should be set to 'ports4'.

For nonCB PUSCH:

**there are one srs-ResourceSet configured as 'nonCodebook', and there are 1~4 srs-Resources in the srs-ResourceSet;

**all srs-Resources must be configured as port1;

**each srs-Resource must have same time-domain behaviour, that's, same period(in slot) and same offset(in slot);

**SRI in DCI 0_1 together with Lmax (max number of layers supported by UE), are used to select SRS resources, as specified in 38.212.

**number of selected SRS resources is the PUSCH transmission rank(or layers), which is used to determine PUSCH DMRS ports

srsIndicated = []
        if self.nrDedPuschTxCfg == 'codebook':
            #one set with at most 2 resources for CB PUSCH, use the 'SRI field' in DCI 0_1 to select one SRS resource
            if len(self.nrSrsResSet0ResList) == 1:
                resId = self.nrSrsResSet0ResList[0]
            else:
                sri = self.nrDci01PuschSri
                resId = self.nrSrsResSet0ResList[sri]

            srsIndicated.append(resId)
        else:
            #one set with at most 4 resources for nonCB PUSCH, use the 'SRI field' in DCI 0_1 to select SRS resource(s)
            for resId in self.nrDci01NonCbSrsList:
                srsIndicated.append(resId)

Note:

(1) self.nrDci01NonCbSrsList is determined using Table 7.3.1.1.2-28~Table 7.3.1.1.2-31 of 3GPP 38.212.

 

SRS frequency hopping and repetion details:

**There are four related parameters: bSrs, bHop, repetitionFactor(R) and nrofSymbols(Ns)

according to 38.211, frequency hopping is enabled if bHop < bSrs;

according to 38.214, there are three cases:

(1) if Ns == R, "When frequency hopping within an SRS resource in each slot is not configured (R=Ns), each of the antenna ports of the SRS resource in each slot is mapped in all the Ns symbols to the same set of subcarriers in the same set of PRBs."

for example(Ns=4, R=4):

part of configurations(CB-PUSCH, SRI=0):
contents of ["srsRes0"]: {'resId': '0', 'numPorts': 'ports2', 'nonCbPtrsPort': 'n0', 'numCombs': 'n2', 'combOff': '0', 'cs': '0', 'startPos': '3', 'numSymbs': 'n4', 'repetition': 'n4', 'freqPos': '0', 'freqShift': '0', 'cSrs': '12', 'bSrs': '1', 'bHop': '0', 'type': 'periodic', 'period': 'sl10', 'offset': '7', 'mSRSb': (48, 16, 8, 4), 'Nb': (1, 3, 2, 2)}
contents of ["srsResSet0"]: {'resSetId': '0', 'resIdList': '0,1', 'type': 'periodic', 'usage': 'codebook'}
debug output:
---->inside aotSrs(hsfn=0,sfn=4,slot=7)
valid slot for periodic SRS(srsResId=0,period=10slots,offset=7slots): hsfn=0,sfn=4,slot=7
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=1, nb=2
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=1, nb=2
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=1, nb=2
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=1, nb=2
antenna port pi=1000(numScsSrs=96): k0Bar=0, k0PerSymb=[384, 384, 384, 384]
sl=7, lap=0, l0=10, srsSymbsInBaseScsTd=[216, 217]
sl=7, lap=1, l0=10, srsSymbsInBaseScsTd=[218, 219]
sl=7, lap=2, l0=10, srsSymbsInBaseScsTd=[220, 221]
sl=7, lap=3, l0=10, srsSymbsInBaseScsTd=[222, 223]
valid slot for periodic SRS(srsResId=0,period=10slots,offset=7slots): hsfn=0,sfn=4,slot=17
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=1, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=1, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=1, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=1, nb=0
antenna port pi=1000(numScsSrs=96): k0Bar=0, k0PerSymb=[0, 0, 0, 0]
sl=17, lap=0, l0=10, srsSymbsInBaseScsTd=[496, 497]
sl=17, lap=1, l0=10, srsSymbsInBaseScsTd=[498, 499]
sl=17, lap=2, l0=10, srsSymbsInBaseScsTd=[500, 501]
sl=17, lap=3, l0=10, srsSymbsInBaseScsTd=[502, 503]

(2) if R == 1, "When frequency hopping within an SRS resource in each slot is configured without repetition (R=1), according to the SRS hopping parameters B_SRS, C_SRSand b_hop defined in Subclause 6.4.1.4 of [4, TS 38.211], each of the antenna ports of the SRS resource in each slot is mapped to different sets of subcarriers in each OFDM symbol, where the same transmission comb value is assumed for different sets of subcarriers."

for example(Ns=4, R=1):

part of configurations (CB-PUSCH, SRI=0):
contents of ["srsRes0"]: {'resId': '0', 'numPorts': 'ports2', 'nonCbPtrsPort': 'n0', 'numCombs': 'n2', 'combOff': '0', 'cs': '0', 'startPos': '3', 'numSymbs': 'n4', 'repetition': 'n1', 'freqPos': '0', 'freqShift': '0', 'cSrs': '12', 'bSrs': '1', 'bHop': '0', 'type': 'periodic', 'period': 'sl10', 'offset': '7', 'mSRSb': (48, 16, 8, 4), 'Nb': (1, 3, 2, 2)}
contents of ["srsResSet0"]: {'resSetId': '0', 'resIdList': '0,1', 'type': 'periodic', 'usage': 'codebook'}

 

debug output:
---->inside aotSrs(hsfn=0,sfn=4,slot=7)
valid slot for periodic SRS(srsResId=0,period=10slots,offset=7slots): hsfn=0,sfn=4,slot=7
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=1, nb=2
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=1, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=1, nb=1
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=1, nb=2
antenna port pi=1000(numScsSrs=96): k0Bar=0, k0PerSymb=[384, 0, 192, 384]
sl=7, lap=0, l0=10, srsSymbsInBaseScsTd=[216, 217]
sl=7, lap=1, l0=10, srsSymbsInBaseScsTd=[218, 219]
sl=7, lap=2, l0=10, srsSymbsInBaseScsTd=[220, 221]
sl=7, lap=3, l0=10, srsSymbsInBaseScsTd=[222, 223]
valid slot for periodic SRS(srsResId=0,period=10slots,offset=7slots): hsfn=0,sfn=4,slot=17
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=1, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=1, nb=1
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=1, nb=2
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=1, nb=0
antenna port pi=1000(numScsSrs=96): k0Bar=0, k0PerSymb=[0, 192, 384, 0]
sl=17, lap=0, l0=10, srsSymbsInBaseScsTd=[496, 497]
sl=17, lap=1, l0=10, srsSymbsInBaseScsTd=[498, 499]
sl=17, lap=2, l0=10, srsSymbsInBaseScsTd=[500, 501]
sl=17, lap=3, l0=10, srsSymbsInBaseScsTd=[502, 503]

(3) if Ns == 4 and R == 2, "When both frequency hopping and repetition within an SRS resource in each slot are configured (Ns=4, R=2), each of the antenna ports of the SRS resource in each slot is mapped to the same set of subcarriers within each pair of R adjacent OFDM symbols, and frequency hopping across the two pairs is according to the SRS hopping parameters B_SRS, C_SRS and b_hop."

for example(Ns=4,R=2):

part of the configurations(CB-PUSCH, SRI=0):
contents of ["srsRes0"]: {'resId': '0', 'numPorts': 'ports2', 'nonCbPtrsPort': 'n0', 'numCombs': 'n2', 'combOff': '0', 'cs': '0', 'startPos': '3', 'numSymbs': 'n4', 'repetition': 'n2', 'freqPos': '0', 'freqShift': '0', 'cSrs': '12', 'bSrs': '1', 'bHop': '0', 'type': 'periodic', 'period': 'sl10', 'offset': '7', 'mSRSb': (48, 16, 8, 4), 'Nb': (1, 3, 2, 2)}
contents of ["srsResSet0"]: {'resSetId': '0', 'resIdList': '0,1', 'type': 'periodic', 'usage': 'codebook'}
debug output:
---->inside aotSrs(hsfn=0,sfn=4,slot=7)
valid slot for periodic SRS(srsResId=0,period=10slots,offset=7slots): hsfn=0,sfn=4,slot=7
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=1, nb=1
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=1, nb=1
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=1, nb=2
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=1, nb=2
antenna port pi=1000(numScsSrs=96): k0Bar=0, k0PerSymb=[192, 192, 384, 384]
sl=7, lap=0, l0=10, srsSymbsInBaseScsTd=[216, 217]
sl=7, lap=1, l0=10, srsSymbsInBaseScsTd=[218, 219]
sl=7, lap=2, l0=10, srsSymbsInBaseScsTd=[220, 221]
sl=7, lap=3, l0=10, srsSymbsInBaseScsTd=[222, 223]
valid slot for periodic SRS(srsResId=0,period=10slots,offset=7slots): hsfn=0,sfn=4,slot=17
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=0, b=1, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=1, b=1, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=2, b=1, nb=1
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=0, nb=0
C_SRS=12, B_SRS=1, b_hop=0: lap=3, b=1, nb=1
antenna port pi=1000(numScsSrs=96): k0Bar=0, k0PerSymb=[0, 0, 192, 192]
sl=17, lap=0, l0=10, srsSymbsInBaseScsTd=[496, 497]
sl=17, lap=1, l0=10, srsSymbsInBaseScsTd=[498, 499]
sl=17, lap=2, l0=10, srsSymbsInBaseScsTd=[500, 501]
sl=17, lap=3, l0=10, srsSymbsInBaseScsTd=[502, 503]

Procedure to determine k0 for each SRS symbol:

k0PerSymb = []
                for lap in range(numSymbsSrs):
                    k0 = k0Bar
                    for b in range(bSrs + 1):
                        mSRSb = self.nrSrsRes[resId]['mSRSb'][b]
                        Nb = self.nrSrsRes[resId]['Nb'][b]
                        if bHop >= bSrs:
                            #freq hopping disabled, m_SRS,b and N_b are constants with b = bSrs
                            nb = math.floor(4 * nRrc / mSrs) % N
                        else:
                            #freq hopping enabled
                            if b <= bHop:
                                nb = math.floor(4 * nRrc / mSRSb) % Nb
                            else:
                                nSrs = (sfn * self.nrSlotPerRf[self.nrScs2Mu[self.nrDedUlBwpScs]] + sl - offset) / period * (numSymbsSrs / R) + math.floor(lap / R)

                                t1 = 1
                                t2 = 1
                                for bap in range(bHop, b + 1):
                                    Nbap = self.nrSrsRes[resId]['Nb'][bap] if bap != bHop else 1
                                    t1 *= Nbap
                                    if bap < b:
                                        t2 *= Nbap

                                if Nb % 2 == 0:
                                    Fb = (Nb // 2) * math.floor((nSrs % t1) / t2) + math.floor((nSrs % t1) / (2 * t2))
                                else:
                                    Fb = math.floor(Nb / 2) * math.floor(nSrs / t2)

                                nb = (Fb + math.floor(4 * nRrc / mSRSb)) % Nb

                        self.ngwin.logEdit.append('C_SRS=%d, B_SRS=%d, b_hop=%d: lap=%d, b=%d, nb=%d' % (cSrs, bSrs, bHop, lap, b, nb))
                        qApp.processEvents()

                        k0 += numCombs * numScsSrs * nb

                    k0PerSymb.append(k0)

                self.ngwin.logEdit.append('antenna port pi=%d(numScsSrs=%d): k0Bar=%d, k0PerSymb=%s' % (pi, numScsSrs, k0Bar, k0PerSymb))
                qApp.processEvents()

Procedure to determine the starting postion (k0Bar and l0) in time/freq-domain of SRS:

#time-domain starting pos
                l0 = self.nrSymbPerSlotNormCp - 1 - startPos

                #freq-domain starting pos
                if nCsSrs in range(nCsMaxSrs // 2, nCsMaxSrs) and numApSrs == 4 and pi in (1001, 1003):
                    kTC = (kBarTC + numCombs // 2) % numCombs
                else:
                    kTC = kBarTC

                k0Bar = nShift * self.nrScPerPrb + kTC
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章