Cyclic Redundancy Check (CRC)
A cyclic redundancy check adds parity bits to detect transmission errors. The following code snippets show how to add CRC parity bits to a bit sequence and how to verify that the check is valid.
First, we need to create instances of CRCEncoder
and CRCDecoder
:
encoder = CRCEncoder(crc_degree="CRC24A") # the crc_degree denotes the number of added parity bits and is taken from the 3GPP 5G NR standard.
decoder = CRCDecoder(crc_encoder=encoder) # the decoder must be associated to a specific encoder
We can now run the CRC encoder and test if the CRC holds:
# u contains the information bits to be encoded and has shape [...,k].
# c contains u and the CRC parity bits. It has shape [...,k+k_crc].
c = encoder(u)
# u_hat contains the information bits without parity bits and has shape [...,k].
# crc_valid contains a boolean per codeword that indicates if the CRC validation was successful.
# It has shape [...,1].
u_hat, crc_valid = decoder(c)
CRCEncoder
- class sionna.fec.crc.CRCEncoder(crc_degree, output_dtype=tf.float32, **kwargs)[source]
Adds cyclic redundancy check to input sequence.
The CRC polynomials from Sec. 5.1 in [3GPPTS38212_CRC] are available: {CRC24A, CRC24B, CRC24C, CRC16, CRC11, CRC6}.
The class inherits from the Keras layer class and can be used as layer in a Keras model.
- Parameters:
crc_degree (str) – Defining the CRC polynomial to be used. Can be any value from {CRC24A, CRC24B, CRC24C, CRC16, CRC11, CRC6}.
dtype (tf.DType) – Defaults to tf.float32. Defines the output dtype.
- Input:
inputs ([…,k], tf.float32) – 2+D tensor of arbitrary shape where the last dimension is […,k]. Must have at least rank two.
- Output:
x_crc ([…,k+crc_degree], tf.float32) – 2+D tensor containing CRC encoded bits of same shape as
inputs
except the last dimension changes to […,k+crc_degree].- Raises:
AssertionError – If
crc_degree
is not str.ValueError – If requested CRC polynomial is not available in [3GPPTS38212_CRC].
InvalidArgumentError – When rank(
inputs
)<2.
Note
For performance enhancements, we implement a generator-matrix based implementation for fixed k instead of the more common shift register-based operations. Thus, the encoder need to trigger an (internal) rebuild if k changes.
- property crc_degree
CRC degree as string.
- property crc_length
Length of CRC. Equals number of CRC parity bits.
- property crc_pol
CRC polynomial in binary representation.
- property k
Number of information bits per codeword.
- property n
Number of codeword bits.
CRCDecoder
- class sionna.fec.crc.CRCDecoder(crc_encoder, dtype=None, **kwargs)[source]
Allows cyclic redundancy check verification and removes parity-bits.
The CRC polynomials from Sec. 5.1 in [3GPPTS38212_CRC] are available: {CRC24A, CRC24B, CRC24C, CRC16, CRC11, CRC6}.
The class inherits from the Keras layer class and can be used as layer in a Keras model.
- Parameters:
crc_encoder (CRCEncoder) – An instance of
CRCEncoder
to which the CRCDecoder is associated.dtype (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:
inputs ([…,k+crc_degree], tf.float32) – 2+D Tensor containing the CRC encoded bits (i.e., the last crc_degree bits are parity bits). Must have at least rank two.
- Output:
(x, crc_valid) – Tuple:
x ([…,k], tf.float32) – 2+D tensor containing the information bit sequence without CRC parity bits.
crc_valid ([…,1], tf.bool) – 2+D tensor containing the result of the CRC per codeword.
- Raises:
AssertionError – If
crc_encoder
is not CRCEncoder.InvalidArgumentError – When rank(
x
)<2.
- property crc_degree
CRC degree as string.
- property encoder
CRC Encoder used for internal validation.
- References: