Reed Solomon解码 - 误差校正 - 综合症计算

时间:2017-01-11 15:52:07

标签: qr-code reed-solomon

我正在使用C ++实现用于QR码解码的Reed Solomon解码。 到目前为止,我已经实现了解码和错误检测的主要部分。我遵循了ISO / IEC 18004:2006手册。 正如我在附件B中看到的:纠错解码步骤,Syndromes S(i) 计算为S(i)= R(a ^ i)。假设我们有高误差修正等级,因此我们有9个数据代码字和17个纠错代码字,当我们处于QR代码版本1时,它们总共给出了26个代码字。因此,我假设多项式R (x)如ISO / IEC 18004:2006手册第76页所示,将是一系列的 数据代码字和纠错码字的权重分别为x。因此,S(i)= R(a ^ j),其中i = 0 ... 15且j = 0 ... 25用于高误差校正水平。但是,当我运行我的代码并且因为我有一个没有错误的整个QR码矩阵时,我希望所有的综合症都等于零,因此我认为非零的综合症。我是否通过里德所罗门解码在Galois Field Arithmetic下对Syndromes计算有什么不妥?

1 个答案:

答案 0 :(得分:1)

在查看QR码参考时,对于版本1,级别H,具有9个数据字节和17个纠错字节,使用生成多项式g(x)=(x-1)(xa)(xa ^ 2).. 。(xa ^(16))对于i = 0到16,你应该使用综合症S(i)= R(a ^ i)。在无错误的情况下,所有17个综合症都应该为零。

Reed Solomon纠错有一篇不错的维基文章:

http://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction

维基文章包含指向美国国家航空航天局技术简介RSECC教程的链接:

http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19900019023.pdf

链接到控制台程序的C源代码,该程序演示了8位字段的RSECC方法(用户从29个可能的字段中选择)。我使用Microsoft编译器或Visual Studio来编译它和Windows来运行它,但它应该适用于大多数系统。

注意 - 我更新了ecc演示程序以处理除错误之外的擦除,以防它可能有用。在未使用Euclid方法的情况下,还添加了用于计算误差值多项式Omega的代码。链接与以前相同:

http://rcgldr.net/misc/eccdemo8.zip

根据评论中的问题进行更新:

关于哪个GF(2 ^ 8):

的问题
GF(2^8) is based on 9 bit polynomial
        x^8 + x^4 + x^3 + x^2 + 1 = hex 11d
        primitive is x + 0 (hex 2)

查找QR码参考,根据校正级别使用不同的生成多项式:L(低),M(中),Q(质量),H(高)。

关于使用矩阵解码的问题。 Sklar纸显示使用线性方程和矩阵求逆的解码。此过程必须假设最大错误情况 t ,它将是floor(e / 2),其中e是纠错字节数(也称为奇偶校验字节或冗余字节)。如果行列式为零,则尝试 t -1错误,如果为零,则尝试 t -2错误,依此类推,直到行列式为非零或t减少为止为零。

Euclid或Berlekamp Massey解码方法将自动确定错误的数量。

在所有情况下,如果存在超过 t 错误,则可能会发生误校正,具体取决于产生t位置的可能性,其中没有一个位置超出范围。如果从纠错中找到的任何t位置超出范围,则检测到无法纠正的错误。

更新#2

我快速浏览了ISO文档。

生成多项式是(x - 1)(x - 2)(x - 2 ^ 2)...,所以要检查的校正子是S(0)到S(n-1),如前所述,在零错误的情况下,所有校正子S(0)到S(n-1)应为零。

ISO文档使用术语代码字来指代字节(或符号),但在大多数ecc文章中,术语代码字是指包括数据和纠错字节的字节数组,而纠错字节通常称为奇偶校验字节字节,冗余字节或余数字节。因此,如果阅读其他ecc文章,请记住这一点。

ISO文件的第37页提到了“删除”和“错误”,这是RSECC的术语。 “擦除”是指在RSECC之外检测到的已知位置处的坏(或可能是坏的)数据字节。 “错误”是指在RSECC之外未检测到的坏字节,并且仅在RSECC解码期间确定。该文件随后指出,没有无效的数据位模式,这意味着没有“擦除”检测。然后通过显示包含擦除和错误计数的等式来增加混淆。

如果你很好奇,RSECC上的Nasa pdf文件解释了从第86页开始的删除处理,但我认为这不适用于QR码。

http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19900019023.pdf

回到ISO文档,它使用 p 来记录用于错误代码保护的数字或纠错字节,而不是用于纠正。这显示在第38页的表9中。对于版本1,您似乎正在使用它,重新解释:

error correction level
|    number of data bytes
|    |    number of ecc bytes used for correction
|    |    |    number of ecc bytes used for misdecode protection (p)
|    |    |    |    correction capability
L   19    4    3    2/26 ~ 07.69%
M   16    8    2    4/26 ~ 15.38%
Q   13   12    1    6/26 ~ 23.08%
H    9   16    1    8/26 ~ 30.77%

鉴于此表显示在不使用擦除的情况下满足预期的校正能力,那么即使可以检测到擦除,也不需要它们。

使用GF(2 ^ 8),可以通过RSECC解码生成255个(不是256个)可能的错误位置,但在版本1中,只有26个有效位置。在26个有效位置之外的任何生成位置都将检测到无法纠正的错误。因此,对于 L 级别,3 p 字节转换为误差的几率为1 /(2 ^ 24),并且位置范围多达(26/255)^ 2为~6.20E-10概率。对于 H 级别,1 p 字节转换为错误校正的几率(1/2 ^ 8)和位置范围(26/255)^ 8为~4.56 E-11概率。

请注意,对于版本2,对于M,Q,H级别, p = 0,依赖于位置范围(44/255)^(8或11或14)的误差概率为7.87 E-7,4.04E-9,2.07E-11。