Interleaving
The interleaver module allows to permute tensors with either pseudo-random permutations or by row/column swapping.
To simplify distributed graph execution (e.g., by running interleaver and deinterleaver in a different sub-graph/device), the interleavers are implemented stateless. Thus, the internal seed cannot be updated on runtime and does not change after the initialization. However, if required, an explicit random seed can be passed as additional input to the interleaver/deinterleaver pair when calling the layer.
The following code snippet shows how to setup and use an instance of the interleaver:
# set-up system
interleaver = RandomInterleaver(seed=1234, # an explicit seed can be provided
keep_batch_constant=False, # if True, all samples in the batch are permuted with the same pattern
axis=-1) # axis which shall be permuted
deinterleaver = Deinterleaver(interleaver=interleaver) # connect interleaver and deinterleaver
# --- simplified usage with fixed seed ---
# c has arbitrary shape (rank>=2)
c_int = interleaver(c)
# call deinterleaver to reconstruct the original order
c_deint = deinterleaver(c_int)
# --- advanced usage ---
# provide explicit seed if a new random seed should be used for each call
s = tf.random.uniform((), minval=0, maxval=12345678, dtype=tf.int32)
c_int = interleaver([c, s])
c_deint = deinterleaver([c_int, s])
Interleaver
RowColumnInterleaver
- class sionna.fec.interleaving.RowColumnInterleaver(row_depth, axis=-1, inverse=False, dtype=tf.float32, **kwargs)[source]
Interleaves a sequence of inputs via row/column swapping.
The class inherits from the Keras layer class and can be used as layer in a Keras model.
- Parameters:
row_depth (int) – The row depth, i.e., how many values per row can be stored.
axis (int) – The dimension that should be interleaved. First dimension (axis=0) is not allowed.
inverse (bool) – A boolean defaults to False. If True, the inverse permutation is performed.
dtype (tf.DType) – Defaults to tf.float32. Defines the datatype for internal calculations and the output dtype.
- Input:
inputs (tf.DType) – 2+D tensor of arbitrary shape and arbitrary dtype. Must have at least rank two.
- Output:
tf.DType – 2+D tensor of same shape and dtype as
inputs
.- Raises:
AssertionError – If
axis
is not an integer.AssertionError – If
row_depth
is not an integer.AssertionError – If
axis
> number of input dimensions.
Note
If the sequence length is not a multiple of
row_depth
, additional filler bits are used for the last row that will be removed internally. However, for the last positions the interleaving distance may be slightly degraded.To permute the batch dimension, expand_dims at axis=0, interleave and remove new dimension.
- property axis
Axis to be permuted.
- call_inverse(inputs)[source]
Implements deinterleaver function corresponding to call().
- Input:
inputs (tf.DType) – 2+D tensor of arbitrary shape and arbitrary dtype. Must have at least rank two.
- Output:
tf.DType – 2+D tensor of same shape and dtype as
inputs
.
- property keep_state
Row-column interleaver always uses same internal state.
- property perm_seq
Permutation sequence.
- property perm_seq_inv
Inverse permutation sequence.
- property row_depth
Row depth of the row-column interleaver.
RandomInterleaver
- class sionna.fec.interleaving.RandomInterleaver(seed=None, keep_batch_constant=True, inverse=False, keep_state=True, axis=-1, dtype=tf.float32, **kwargs)[source]
Random interleaver permuting a sequence of input symbols.
The class inherits from the Keras layer class and can be used as layer in a Keras model.
- Parameters:
seed (int) – Integer defining the random seed used if option
keep_state
is True.keep_batch_constant (bool) – Defaults to True. If set to True each sample in the batch uses the same permutation. Otherwise, unique permutations per batch sample are generate (slower).
inverse (bool) – A boolean defaults to False. If True, the inverse permutation is performed.
keep_state (bool) – A boolean defaults to True. If True, the permutation is fixed for multiple calls (defined by
seed
attribute).axis (int) – Defaults to -1. The dimension that should be interleaved. First dimension (axis=0) is not allowed.
dtype (tf.DType) – Defaults to tf.float32. Defines the datatype for internal calculations and the output dtype.
- Input:
(x, seed) – Either Tuple
(x, seed)
orx
only (no tuple) if the internal seed should be used:x (tf.DType) – 2+D tensor of arbitrary shape and dtype.
seed (int) – An integer defining the state of the random number generator. If explicitly given, the global internal seed is replaced by this seed. Can be used to realize random interleaver/deinterleaver pairs (call with same random seed).
- Output:
tf.DType – 2+D tensor of same shape and dtype as the input
x
.- Raises:
AssertionError – If
axis
is not int.AssertionError – If
seed
is not None or int.AssertionError – If
axis
> number of input dimensions.AssertionError – If
inverse
is not bool.AssertionError – If
keep_state
is not bool.AssertionError – If
keep_batch_constant
is not bool.InvalidArgumentError – When rank(
x
)<2.
Note
To permute the batch dimension, expand_dims at
axis=0
, interleave and remove new dimension.The interleaver layer is stateless, i.e., the seed is either random during each call or must be explicitly provided during init/call. This simplifies XLA/graph execution.
This is NOT the 5G interleaver sequence.
- property axis
Axis to be permuted.
- call_inverse(inputs)[source]
Implements deinterleaver function corresponding to call().
- Input:
(x, seed) – Either Tuple
(x, seed)
orx
only (no tuple) if the internal seed should be used:x (tf.DType) – 2+D tensor of arbitrary shape and dtype.
seed (int) – An integer defining the state of the random number generator. If explicitly given, the global internal seed is replaced by this seed. Can be used to realize random interleaver/deinterleaver pairs (call with same random seed).
- Output:
tf.DType – 2+D tensor of same shape and dtype as the input
x
.- Raises:
InvalidArgumentError – When rank(
x
)<2.ValueError – If
keep_state
is False and no explicit seed is provided.
Note
In case of inverse interleaving (e.g., at the receiver),
keep_state
should be True as otherwise a new permutation is generated and the output is not equal to the original sequence. Alternatively, an explicit seed must be provided as function argument.
- find_s_min(seed, seq_length, s_min_stop=0)[source]
Find \(S\) parameter such that \(\pi(i)-\pi(j)>S\) for all \(i-j<S\). This can be used to find optimized interleaver patterns.
s_min_stop
is an additional stopping condition, i.e., stop if current \(S\) is already smaller thans_min_stop
.Please note that this is a Numpy utility function and usually not part of the graph.
- Input:
seed (int) – seed to draw random permutation that shall be analyzed.
seq_length (int) – length of permutation sequence to be analyzed.
s_min_stop (int) – Defaults to 0. Enables early stop if already current s_min<
s_min_stop
.
- Output:
float – The S-parameter for the given
seed
.
- property keep_state
Generate new random seed per call.
- property seed
Seed to generate random sequence.
Turbo3GPPInterleaver
- class sionna.fec.interleaving.Turbo3GPPInterleaver(inverse=False, axis=-1, dtype=tf.float32, **kwargs)[source]
Interleaver as used in the 3GPP Turbo codes [3GPPTS36212_I] and, thus, the maximum length is given as 6144 elements (only for the dimension as specific by
axis
).The class inherits from the Keras layer class and can be used as layer in a Keras model.
- Parameters:
inverse (bool) – A boolean defaults to False. If True, the inverse permutation is performed.
axis (int) – Defaults to -1. The dimension that should be interleaved. First dimension (axis=0) is not allowed.
dtype (tf.DType) – Defaults to tf.float32. Defines the datatype for internal calculations and the output dtype.
- Input:
x (tf.DType) – 2+D tensor of arbitrary shape and dtype.
- Output:
tf.DType – 2+D tensor of same shape and dtype as the input
x
.- Raises:
AssertionError – If
axis
is not int.AssertionError – If
axis
> number of input dimensions.AssertionError – If
inverse
is not bool.InvalidArgumentError – When rank(
x
)<2.
Note
Note that this implementation slightly deviates from the 3GPP standard [3GPPTS36212_I] in a sense that zero-padding is introduced for cases when the exact interleaver length is not supported by the standard.
- property axis
Axis to be permuted.
- call_inverse(inputs)[source]
Implements deinterleaver function corresponding to call().
- Input:
x (tf.DType) – 2+D tensor of arbitrary shape and dtype.
- Output:
tf.DType – 2+D tensor of same shape and dtype as the input
x
.- Raises:
InvalidArgumentError – When rank(
x
)<2.
- find_s_min(frame_size, s_min_stop=0)[source]
Find \(S\) parameter such that \(\pi(i)-\pi(j)>S\) for all \(i-j<S\). This can be used to find optimized interleaver patterns.
s_min_stop
is an additional stopping condition, i.e., stop if current \(S\) is already smaller thans_min_stop
.Please note that this is a Numpy utility function and usually not part of the graph.
- Input:
frame_size (int) – length of interleaver.
s_min_stop (int) – Defaults to 0. Enables early stop if already current s_min<
s_min_stop
.
- Output:
float – The S-parameter for the given
frame_size
.
Deinterleaver
- class sionna.fec.interleaving.Deinterleaver(interleaver, dtype=None, **kwargs)[source]
Deinterleaver that reverts the interleaver for a given input sequence.
The class inherits from the Keras layer class and can be used as layer in a Keras model.
- Parameters:
interleaver (Interleaver) – Associated Interleaver which shall be deinterleaved by this layer. Can be either
RandomInterleaver
orRowColumnInterleaver
.dtype (None or tf.DType) – Defaults to None. Defines the datatype for internal calculations and the output dtype. If no explicit dtype is provided the dtype from the associated interleaver is used.
- Input:
(x, seed) – Either Tuple
(x, seed)
orx
only (no tuple) if the internal seed should be used:x (tf.DType) – 2+D tensor of arbitrary shape.
seed (int) – An integer defining the state of the random number generator. If explicitly given, the global internal seed is replaced by this seed. Can be used to realize random interleaver/deinterleaver pairs (call with same random seed).
- Output:
tf.DType – 2+D tensor of same shape and dtype as the input
x
.- Raises:
AssertionError – If
interleaver
is not a valid instance of Interleaver.
Note
This layer provides a wrapper of the inverse interleaver function.
- property interleaver
Associated interleaver instance.
References: