Low PAPR Sequence Type 1

The procedure of the implementation of low PAPR sequences used by SRS and/or uplink control channels in 5G networks. The details of the generation of this sequence are given in section 6.3.2 of [3GPPTS38211LowPAPR] and some of sequences parameters are detailed in section 9.2 of [3GPPTS38213LowPAPR].

Note

Low PAPR Sequences are used as base sequence by reference signals transmitted by coverage constrained devices. The other alternative available is gold sequence which have excellent time correlation properties but have a very high PAPR which limit its usage for small form factor devices which can’t transmit high power.

When u, alpha, v are scalar and lengthOfSequence ** is not passed:**

u       = 3
alpha   = np.pi/4
v       = 0

delta   = 0
m       = 8

lowPAPR = LowPAPRSequenceType1(alpha, u, v)
seq     = lowPAPR(m, delta)

print("******************************************************")
print("               sequence: "+str(seq.shape))
print("******************************************************")
**************************************************
               sequence: (1, 1, 1, 96)
**************************************************

When u, alpha, v are scalar and lengthOfSequence ** is passed:**

u       = 28
alpha   = 3*np.pi/8
v       = 1

delta   = 0
m       = 8

lowPAPR = LowPAPRSequenceType1(alpha, u, v)
seq     = lowPAPR(m, delta, lengthOfSequence=84)

print("******************************************************")
print("               sequence: "+str(seq.shape))
print("******************************************************")
**************************************************
               sequence: (1, 1, 1, 84)
**************************************************

When u, alpha, v are array and lengthOfSequence ** is not passed:**

u       = np.array([3,8,11])
alpha   = np.array([3*np.pi/4, np.pi/4, 2*np.pi/4, 5*np.pi/4])
v       = 0

delta   = 0
m       = 32

lowPAPR = LowPAPRSequenceType1(alpha, u, v)
seq     = lowPAPR(m, delta)

print("******************************************************")
print("               sequence: "+str(seq.shape))
print("******************************************************")
**************************************************
               sequence: (4, 1, 3, 384)
**************************************************

When u, alpha, v are array and lengthOfSequence ** is passed:**

u       = np.array([3,8])
alpha   = np.array([3*np.pi/4, 2*np.pi/4, 5*np.pi/4])
v       = np.array([0,1,0,1])

delta   = 0
m       = 32

lowPAPR = LowPAPRSequenceType1(alpha, u, v)
seq     = lowPAPR(m, delta, lengthOfSequence=131)

print("******************************************************")
print("               sequence: "+str(seq.shape))
print("******************************************************")
**************************************************
               sequence: (3, 4, 2, 131)
**************************************************

API Documentation

class toolkit5G.SequenceGeneration.LowPAPRSequenceType1(cyclicShift, groupNumber, baseSequenceNumber=0)[source]
Parameters:
  • cyclicShift (int/float or NumPy array of int/float) – Defines the cyclic shift used for generation of sequence.

  • groupNumber (int or NumPy array of integer) – Defines the group number for sequence generation.

  • baseSequenceNumber (int or NumPy array of integer) – Defines the base sequence number. This parameter is relevant only if numRBs \(\times \frac{12}{2^\delta}\) >= 36.

Input:
  • numRBs (int) – Defines number of Resource Blocks available for mapping LowPAPRSequenceType1.

  • delta (int) – Defines resource scaling factor (\(\delta\)) for LowPAPRSequenceType1.

  • lengthOfSequence (int) – Its an optional parameter. Define the length of sequence to be generated. It should either be >=36 otherwise must be a multiple of 6.

Note

If lengthOfSequence parameter is passed, then numRBs and delta will be ignored. In this case, you can pass any dummy values to numRBs and delta like numRBs = 0, delta = 0.

Output:

(\(N_c\), \(N_{\nu}\), \(N_u\), numRBs \(\times\) \(\frac{12}{2^\text{delta}}\)) – Return Low PAPR Sequence of Type-1 where

  • \(N_c\) is length of cyclicShift,

  • \(N_{\nu}\) is length of groupNumber,

  • \(N_u\) is length of baseSequenceNumber,

  • numRBs \(\times\) \(\frac{12}{2^\text{delta}}\) define the length of generated sequence.

Note

If lengthOfSequence parameter is passed, then dimension of out sequence will be (\(N_c\), \(N_{\nu}\), \(N_u\), lengthOfSequence)). In this case, the values of numRBs and delta will be ignored.

Attributes:

lengthOfSequence (int) – Define the length of generated sequence.

Raises:
  • ValueError – [Error-LowPAPRSequenceType1]: When ‘lengthOfSequence’ = “+str(self.lengthOfSequence)+” is less than 72, all the values of ‘baseSequenceNumber’ must be 0!

  • Exception – [Error-LowPAPRSequenceType1]: Invalid value for ‘lengthOfSequence’! Value of ‘lengthOfSequence’ = “+str(mZC)+”! Length of the Sequence can be either > 36 or from the set {6, 12, 18, 24}!

  • ValueError – [Error-LowPAPRSequenceType1]: ‘cyclicShift’ should always be positive!

  • ValueError – [Error-LowPAPRSequenceType1]: ‘cyclicShift’ should always be positive!

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

  • ValueError – [Error-LowPAPRSequenceType1]: ‘groupNumber’ should always be positive number less than 30!

  • ValueError – [Error-LowPAPRSequenceType1]: ‘groupNumber’ should always be positive number less than 30!

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

  • ValueError – [Error-LowPAPRSequenceType1]: ‘baseSequenceNumber’ should always be positive!

  • ValueError – [Error-LowPAPRSequenceType1]: ‘baseSequenceNumber’ should always be positive!

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

  • ValueError – [Error-LowPAPRSequenceType1]: ‘numRBs’ should always be positive number > 0!

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

  • ValueError – [Error-LowPAPRSequenceType1]: ‘delta’ should always be a positive number!

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

  • ValueError – [Error-LowPAPRSequenceType1]: ‘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 baseSequenceNumber

Defines Base Sequence Number. The parameter is denoted by \(\nu\) in section 5.2.2 of TS 38.211. It can be scalar or vector of integers.

property cyclicShift

Defines Cyclic Shift. The parameter is denoted by \(\alpha\) in section 5.2.2 of TS 38.211. It can be scalar or vector of numbers.

property delta

Defines resource scaling factor (\(\delta\)) for LowPAPRSequenceType1. It must be an integer.

property groupNumber

Defines Group Number. The parameter is denoted by u in section 5.2.2 of TS 38.211. It can be scalar or vector of integers.

property lengthOfSequence

Defines the length of the sequence. The parameter is either directly passed as an input or computed by numRBs \(\times\) \(\frac{12}{2^\delta}\). The details are listed in section 5.2.2 of TS 38.211. It can be scalar or vector of integers.

property numRBs

Defines Number of Resource Blocks. The parameter is denoted by m in section 5.2.2 of TS 38.211. It can be scalar or vector of integers.

References:
[3GPPTS38211LowPAPR]

(3GPP TS 38.211 version 17.1.0 Release 17) 5G;NR;Physical channels and modulation.

[3GPPTS38213LowPAPR]

(3GPP TS 38.213 version 16.5.0 Release 16) 5G;NR;Physical layer procedures for control.