查看二维码参考资料后,对于版本 1,级别 H,具有 9 个数据字节和 17 个纠错字节,使用生成多项式 g(x) = (x-1)(x-a)(x-a^2).. .(x-a^(16)) 对于 i = 0 到 16,您应该使用校正子 S(i) = R(a^i)。在没有错误的情况下,所有 17 个校正子都应该为零。
Reed Solomon 纠错有一篇不错的 wiki 文章:
http://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction
wiki 文章包含一个指向美国宇航局技术简报 RSCC 教程的链接:
http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19900019023.pdf
一个控制台程序的 C 源代码链接,该程序演示了 8 位字段的 RSEC 方法(用户从 29 个可能的字段中选择)。我使用 Microsoft 编译器或 Visual Studio 编译它并使用 Windows 运行它,但它应该可以在大多数系统上运行。
注意 - 我更新了 ecc 演示程序以处理除错误之外的擦除,以防万一它有用。在不使用欧几里德方法的情况下,还添加了计算误差值多项式 Omega 的代码。链接和之前一样:
http://rcgldr.net/misc/eccdemo8.zip
根据cmets中的问题更新:
我关于哪个 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,p = 0 用于级别 M、Q、H,依赖于位置范围 (44/255)^(8 或 11 或 14),误校正概率为 7.87 E-7、4.04E-9、2.07E-11。