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).