Sounding Reference Sequence (SRS)

The sounding reference signal (SRS) is designed in 5G for various purposes. Some of these utilities are defined below:

  • Uplink sounding

  • CSI acquisition

  • Radio resource management

  • UL/DL Scheduling

  • Uplink based positioning

The SRS is Zadoff-Chu based reference signal designed with the coverage and complexity limitation of UEs in mind. Its a multiport (up-to 4) sequence where the sequence is orthogonal for each port. The implementation details of CSI-RS are provided in section 7.4.1.5 of 3GPP TS 38.211 [3GPPTS38211_SRS].

If sequenceId is a scalar:

nrofSRS_Ports           = 2
transmissionComb        = 4
nrofSymbols             = 8
startPosition           = 6
nrOfCyclicShift         = 2
groupOrSequenceHopping  = "sequenceHopping"
sequenceId              = 974
slotIndex               = 4

length                  = 12

srs      = SRS(nrofSRS_Ports, transmissionComb, nrOfCyclicShift, groupOrSequenceHopping, sequenceId, nrofSymbols, startPosition, slotIndex)
sequence = srs(length)

print("******************************************************")
print("           SRS sequence: "+str(sequence.shape))
print("         Expected shape: "+str((numIDs, nrOfCyclicShift, nrofSRS_Ports, nrofSymbols, int(length))))
print("******************************************************")
**************************************************
           SRS sequence: (1, 2, 2, 8, 12)
         Expected shape: (1, 2, 2, 8, 12)
**************************************************

If sequenceId is an array:

nrofSRS_Ports           = 4
transmissionComb        = 2
nrofSymbols             = 2
startPosition           = 1
nrOfCyclicShift         = 2
groupOrSequenceHopping  = "groupHopping"
sequenceId              = np.array([5, 10, 15])
slotIndex               = 1

length                  = 408

srs      = SRS(nrofSRS_Ports, transmissionComb, nrOfCyclicShift, groupOrSequenceHopping, sequenceId, nrofSymbols, startPosition, slotIndex)
sequence = srs(length)

print("******************************************************")
print("           SRS sequence: "+str(sequence.shape))
print("         Expected shape: "+str((numIDs, nrOfCyclicShift, nrofSRS_Ports, nrofSymbols, int(length))))
print("******************************************************")
**************************************************
           SRS sequence: (3, 2, 4, 2, 408)
         Expected shape: (3, 2, 4, 2, 408)
**************************************************

API Documentation The details about the input-output interface of the SSS implementation is provided below.

class toolkit5G.SequenceGeneration.SRS(nrofSRS_Ports, transmissionComb, nrOfCyclicShift, groupOrSequenceHopping, sequenceId, nrofSymbols, startPosition, slotIndex)[source]
Parameters:
  • nrofSRS_Ports (int) – Defines number of antenna ports configured for SRS. It can take an integer value from the set {1,2,4}. For positioning SRS supports only a single port.

  • transmissionComb (int) – Defines Comb factor configured for SRS. The parameter is denoted by \(\text{K}_\text{TC} \in \{2,4,8\}\) in section 5.2.2 of TS 38.211.

  • nrOfCyclicShift (int) – Defines the number of Cyclic Shifts. This parameter is used for generating the SRS sequence for cyclic shift number of \(n_{SRS}^{cs,i} \in \{0,1,\dots,\) nrOfCyclicShift \(-1\}\). The maximum value this parameter can take is 8,12 and 6 for the comb factor of 2, 4 and 8 respectively. It can be accessed using parameter nrOfCyclicShiftMax.

  • groupOrSequenceHopping (str) – Defines the type of Hopping used by SRS. It can take one of the values from the set \(\{\) “neither”, “groupHopping”, “sequenceHopping” \(\}\)

  • sequenceId (int or NumPy array of int) –

    Defines the higher layer parameter sequenceId in the SRS-Resource IE. It is denoted by \(\text{n}_\text{ID}^\text{SRS}\)

    • If SRS is configured for Channel sounding, it can take values from the set \(\text{n}_\text{ID}^\text{SRS} \in \{0,1,2,\dots,65535 \}\).

    • If SRS is configured for Positioning, it can take values from the set \(\text{n}_\text{ID}^\text{SRS} \in \{0,1,2,\dots,1023 \}\).

  • nrofSymbols (int) – Defines the number of consecutive OFDM symbols allocated to SRS. It is denoted by \(N_\text{symb}^\text{SRS} \in \{1,2,4,8,10,12,14\}\) in section 6.4.1.4.1 of 3GPP TS 38.211.

  • startPosition (int) – Defines the start position of SRS allocation. It is denoted by \(0 \leq l_{0} \leq 14- N_\text{symb}^\text{SRS}\) in section 6.4.1.4.1 of 3GPP TS 38.211.

  • slotIndex (int) – Defines the slot Index in which the SRS is to be transmitted. It is denoted by \(n_\text{s,f}^{\mu} \in \{0,1,\dots,10\times 2^{\mu} - 1\}\) in section 6.4.1.4.1 of 3GPP TS 38.211.

Input:

lengthOfSequence (int) – Defines the length Of SRS Sequence to be generated. It should either be >=36 otherwise must be a multiple of 6.

Output:

(numSequenceIDs, nrOfCyclicShift, nrofSRS_Ports, nrofSymbols, lengthOfSequence) – Returns the SRS sequence for the configured parameters where numSequenceIDs defines the number of sequence IDs configured = np.size(sequenceId)

Attributes:
  • nrOfCyclicShiftMax (int) – Defines the maximum number of cyclic shifts supported. It is computed using transmissionComb.

  • symbolIndices (int or NumPy array of integers) – Symbol Indices where SRS will be loaded in the resource Grid.

  • case (int) – Defines the case invoked for SRS Generation. 3 cases are possible {0,1,2}

Raises:
  • ValueError – [Error-SRS]: Unexpected Behaviour!

  • ValueError – [Error-SRS]: Invalid value of ‘groupOrSequenceHopping’!

  • ValueError – [Error-SRS]: Invalid value of ‘groupOrSequenceHopping’!

  • ValueError – [Error-SRS]: ‘nrOfCyclicShift’ should always be positive integer < ‘nrOfCyclicShiftMax’ = “+str(self.nrOfCyclicShiftMax)+”!

  • TypeError – [Error-SRS]: ‘nrOfCyclicShift’ should be an scalar integer/float or numpy integer/float array

  • ValueError – [Error-SRS]: ‘startPosition’ should always be between 0 and 14-‘nrofSymbols’!

  • TypeError – [Error-SRS]: ‘startPosition’ should be an scalar integer/float or numpy integer/float array

  • ValueError – [Error-SRS]: ‘nrofSymbols’ should always be between 1 and 14!

  • TypeError – [Error-SRS]: ‘nrofSymbols’ should be an scalar integer/float or numpy integer/float array

  • ValueError – [Error-SRS]: ‘symbolIndex’ should always be positive!

  • TypeError – [Error-SRS]: ‘symbolIndex’ should be an scalar integer/float or numpy integer/float array

  • ValueError – [Error-SRS]: ‘sequenceId’ should always be positive!

  • ValueError – [Error-SRS]: ‘sequenceId’ should always be positive!

  • TypeError – [Error-SRS]: ‘sequenceId’ should be an scalar integer/float or numpy integer/float array

  • ValueError – [Error-SRS]: ‘lengthOfSequence’ = numRBs*12/(2**delta) should always be either >= 36 or belong to the set {6,12,18,24}! Please chose the value of ‘numRBs’ and ‘delta’ accrodingly!

property lengthOfSequence

Defines the length of SRS. It is denoted by \(\text{M}_{sc,b}^\text{SRS} = \frac{12\times m_{{SRS},b}}{K_\text{TC}\times P_\text{F}}\) computed using SRS bandwidth (m), transmissionComb (\(\text{K}_\text{TC}\)), and, repetitionFactor (\(\text{P}_\text{F}\)) in section 5.2.2 of TS 38.211. It can be scalar or vector of integers.

property nrOfCyclicShift

Defines Number Of Cyclic Shifts. The parameter is denoted by \(0 < n_\text{SRS}^\text{cs,i} \leq\) nrOfCyclicShiftMax in section 5.2.2 of TS 38.211. It is an integer.

property nrofSymbols

Defines the number of consecutive OFDM symbols allocated to SRS. It is denoted by \(N_\text{symb}^\text{SRS} \in \{1,2,4,8,10,12,14\}\) in section 6.4.1.4.1 of 3GPP TS 38.211.

property sequenceId

Defines the higher layer parameter sequenceId in the SRS-Resource IE. It is denoted by \(\text{n}_\text{ID}^\text{SRS}\)

  • If SRS is confiured for Channel sounding, it can take values from the set \(\text{n}_\text{ID}^\text{SRS} \in \{0,1,2,\dots,65535 \}\).

  • If SRS is confiured for Positioning, it can take values from the set \(\text{n}_\text{ID}^\text{SRS} \in \{0,1,2,\dots,1023 \}\).

property slotIndex

Defines slot Index/Number value. The parameter is denoted by \({n}_\text{s,f}^{\mu} \in \{0,1,...,\text{N}_\text{slot}^{frame}-1\}\) in section 5.2.2 of TS 38.211. It takes integer values.

property startPosition

Defines the start position of SRS allocation. It is denoted by \(0 \leq l_{0} \leq 14- N_\text{symb}^\text{SRS}\) in section 6.4.1.4.1 of 3GPP TS 38.211.

property symbolIndices

Defines the symbol Ind(ex)(ices) where SRS will be loaded in the resource grid. The parameter is denoted by \(l' + l_0\) in section 5.2.2 of TS 38.211. It can be scalar or vector of integers.

property transmissionComb

Defines transmissionComb value. The parameter is denoted by \(\text{K}_\text{TC} \in \{2,4,8\}\) in section 5.2.2 of TS 38.211. It takes integer values.

References:
[3GPPTS38211_SRS]

3GPP TS 38.211 “Physical channels and modulation (Release 17)”, V17.1.0 (2022-03).