Reed-Solomon algorithm

Reed-Solomon’s are group of codes being a part of error-correcting codes.

The idea of RS has been developed into many algorithms, but the one widely used is Berkelkamp-Massey. As the approach to decoding stated in this algorithm clearly respond to the needs of decoding in DAB+ Reed-Solomon, it has also been used in the project of sdrdab.

The aim of RS is to provide the one-way communication (in our case of radio receiver) with capability to correct errors which could appear during the transmission. As there is no chance of resending information, it is essential to provide the device with ability to use the part of the received data to repair the other parts. However, the additional computation shouldn’t be done if not necessary.

Including additional bytes of data in each 110B, the RS provides the device with ability to correct up to bytes of data, or up to 10 erasures (although this feature is not used in our case).

The code used for our project is the RS library rscode, providing us with functions of generating proper finite fields (also called Galois Fields). According to [1], the code is using the polynomial , based on GF(28) and also the code generator polynomial . Library implements exponential and logarithmic tables, used to generate and decode encoded with RS data.

The function ReedSolomonCorrection, implemented in DataDecoder class, works on vectors of 1680B length, but is also capable of decoding any multiple of 120B, encoded with RS before the transmission. The data is then divided into 120B arrays and passed to RS library functions for decoding. Returned 110B of corrected data are then copied into 1680B input vector and RSCorrection function passes then the next 120B of data to decoding. After all 14 iterations of decoding the InSource vector is still 1680B long, although it now contains 1540B of eventually (if errors existed and were fewer than 5B) corrected data.

The formal demand is that the RS functions should be working (encoding/decoding) on full length of the used symbols, 28 in case of bytes used in sdrdab. However, to trick the coder, it is possible to use shorter vectors, for example 110B only, and fill the remaining part (255-110=145B) with zeros. The whole coder will still remain as functional as it would be using longer words. This feature is implemented in the rscode library.