【问题标题】:Reed Solomon Decoding - Error Correction - Syndromes CalculationReed Solomon 解码 - 纠错 - 综合征计算
【发布时间】:2017-01-11 15:52:07
【问题描述】:

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

【问题讨论】:

  • 这更像是关于 Reed-Solomon 代码的数学问题,而不是 C++ 问题,而且您的问题不涉及 C++ 细节。考虑删除 C++ 标签。你可以看看 stackexchange 的数学部分。

标签: qr-code reed-solomon


【解决方案1】:

查看二维码参考资料后,对于版本 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。

【讨论】:

  • 假设我们有高纠错级别,我们有 9 个数据码字和 17 个纠错码字 = 版本 1 QR 码总共有 26 个码字。此外,对于 High ECL ,计算所需的校正子为 16,S0...S15,遵循 ISO/IEC 的 QR 码,导致生成多项式从 a^0 开始,即 g(x) = (x-a^0)*(x-a ^1)*... 所以,R(x) = DC's + ECC's 。我的问题是,来自 r(x) poly 的数据和错误码字是否设置为:首先是最不重要的,依此类推...
  • @dimkatsi - Euclid 有一个特殊的结尾情况,有时 Omega 有一个前导零(我不知道是否可以有多个前导零)。在我的两个移位寄存器实现中,我在我的主 Euclid 循环中移出前导被除数零,但在循环之后,我检查了应该在 Omega 中的项数并右移以带回前导零如果需要。
  • @dimkatsi - 在第 20 页上解释了有限域多项式的导数存在一个问题。在wiki formal derivative 中进行了解释,具体而言,在导数中乘以 (exponent-1) 是重复加法。由于 GF(256) 或 GF(16) 中的加法是异或,那么对于 f(x) = 1 + f1 x + f2 x^2 + f3 x^3 ... f'(x) = f1 + (f2 x + f2 x) + (f3 x^2 + f3 x^2 + f3 x^2) + ... = f1 + f3 x^2 + ... 。偶数项 = 0,奇数项系数 = fn。给定 Λ(x) = 5 x^2 + 5x + 15,那么 Λ'(x) = 5 与 x 无关。
  • 关于擦除,如 Wiki 中所述,它们是错误,但我们知道它们发生的位置。因此,我们不需要计算错误定位多项式,而只需计算错误幅度多项式并像错误一样纠正它们。但问题仍然存在,我的代码如何知道哪个是错误,哪个是先擦除?
  • @dimkatsi - wikiversity RS for coders 中描述了错误和擦除。它也在我的演示代码 eccdemo8.zip 中处理。我不知道您的特定 QR 码阅读器如何工作以及如何检测擦除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 2014-08-26
相关资源
最近更新 更多