Main Content


Reed-Solomon decoder


decoded = rsdec(code,n,k)
decoded = rsdec(code,n,k,genpoly)
decoded = rsdec(...,paritypos)
[decoded,cnumerr] = rsdec(...)
[decoded,cnumerr,ccode] = rsdec(...)


decoded = rsdec(code,n,k) attempts to decode the received signal in code using an [n,k] Reed-Solomon decoding process with the narrow-sense generator polynomial. code is a Galois array of symbols having m bits each. Each n-element row of code represents a corrupted systematic codeword, where the parity symbols are at the end and the leftmost symbol is the most significant symbol. n is at most 2m-1. If n is not exactly 2m-1, rsdec assumes that code is a corrupted version of a shortened code.

In the Galois array decoded, each row represents the attempt at decoding the corresponding row in code. A decoding failure occurs if rsdec detects more than (n-k)/2 errors in a row of code. In this case, rsdec forms the corresponding row of decoded by merely removing n-k symbols from the end of the row of code.

decoded = rsdec(code,n,k,genpoly) is the same as the syntax above, except that a nonempty value of genpoly specifies the generator polynomial for the code. In this case, genpoly is a Galois row vector that lists the coefficients, in order of descending powers, of the generator polynomial. The generator polynomial must have degree n-k. To use the default narrow-sense generator polynomial, set genpoly to [].

decoded = rsdec(...,paritypos) specifies whether the parity symbols in code were appended or prepended to the message in the coding operation. paritypos can be either 'end' or 'beginning'. The default is 'end'. If paritypos is 'beginning', a decoding failure causes rsdec to remove n-k symbols from the beginning rather than the end of the row.

[decoded,cnumerr] = rsdec(...) returns a column vector cnumerr, each element of which is the number of corrected errors in the corresponding row of code. A value of -1 in cnumerr indicates a decoding failure in that row in code.

[decoded,cnumerr,ccode] = rsdec(...) returns ccode, the corrected version of code. The Galois array ccode has the same format as code. If a decoding failure occurs in a certain row of code, the corresponding row in ccode contains that row unchanged.


collapse all

Set the RS code parameters.

m = 3;                   % Number of bits per symbol
n = 2^m-1;               % Codeword length
k = 3;                   % Message length

Generate three codewords composed of 3-bit symbols. Encode the message with a (7,3) RS code.

msg = gf([2 7 3; 4 0 6; 5 1 1],m);
code = rsenc(msg,n,k);

Introduce one error on the first codeword, two errors on the second codeword, and three errors on the third codeword.

errors = gf([2 0 0 0 0 0 0; 3 4 0 0 0 0 0; 5 6 7 0 0 0 0],m);
noisycode = code + errors;

Decode the corrupted codeword.

[rxcode,cnumerr] = rsdec(noisycode,n,k);

Observe that the number of corrected errors matches the introduced errors for the first two rows. In row three, the number of corrected errors is -1 because a (7,3) RS code cannot correct more than two errors.

cnumerr = 3×1



n and k must differ by an even integer. n must be between 3 and 65535.


rsdec uses the Berlekamp-Massey decoding algorithm. For information about this algorithm, see the works listed in References below.


[1] Wicker, S. B., Error Control Systems for Digital Communication and Storage, Upper Saddle River, NJ, Prentice Hall, 1995.

[2] Berlekamp, E. R., Algebraic Coding Theory, New York, McGraw-Hill, 1968.

Version History

Introduced before R2006a

See Also

| |