系统Reed-Solomon编码方法差异:校验符号结果不一致的疑问
我正在实现系统形式的Reed-Solomon编码器,生成消息后接校验符号的码字。为了对比验证,我参考了一份包含手动计算和LFSR说明的白皮书,其中RS(15,11)码的本原多项式为X⁴ + X + 1,输入消息为[1,2,3,4,5,6,7,8,9,10,11],得到的校验符号是[3,3,12,12]。我手动验证了这个结果,同时用维基百科Reed-Solomon条目引用的代码验证,结果一致。
但使用Python的galois包运行以下代码时,得到的校验符号是[11,10,14,6],且该结果和MATLAB的输出一致:
import galois rs = galois.ReedSolomon(15,11, primitive_poly = 19) GF = rs.field; ## Encode the message m = GF([1,2,3,4,5,6,7,8,9,10,11]) c = rs.encode(m)
我的疑问是:是否存在两种生成系统Reed-Solomon码字的算法,会产生不同的校验符号?若不存在,哪种方法是正确的?
解答
两种结果都是正确的,核心差异在于生成多项式的选取以及校验符号的排列顺序/定义方式,这是Reed-Solomon编码中常见的实现差异:
生成多项式的根的选择
Reed-Solomon码的生成多项式由有限域中的一组连续根确定。不同实现可能选择不同起始位置的根:- 白皮书和wikiversity代码可能选择从
α¹开始的连续根(α¹, α², α³, α⁴)构造生成多项式; galois包和MATLAB默认可能选择从α⁰(即1)开始的连续根(α⁰, α¹, α², α³),或者其他起始偏移的根集合。不同的根集合会直接导致生成多项式不同,最终计算出的校验符号自然不同。
- 白皮书和wikiversity代码可能选择从
校验符号的排列顺序
系统码的校验符号存在两种常见排列方式:- 一种是将校验符号按从低次到高次的顺序排列在消息后;
- 另一种是按从高次到低次的顺序排列。这也会导致校验符号的顺序完全反转,或者部分位置数值不同。
本原元的映射差异
虽然本原多项式都是X⁴ + X + 1,但不同实现可能对有限域元素的整数映射方式不同(比如将α映射为不同的整数表示),不过这种情况在你的例子中可能性较低——galois包中primitive_poly=19对应的就是X⁴+X+1(19是二进制10011,对应多项式系数),和白皮书的本原多项式一致。
总结来说,只要两种实现都严格遵循Reed-Solomon编码的数学定义,只是在生成多项式根的选择、校验符号排列顺序这类实现细节上有差异,那么它们的结果都是有效的系统Reed-Solomon码字,都能正确完成纠错功能。你可以通过对比两者的生成多项式结构,或者校验符号对应的伴随式计算来验证这一点。
内容的提问来源于stack exchange,提问作者Sean

