CCSDS Reed Solomon 编码

CCSDS Reed Solomon Encoding

我正在开展一个项目,我需要将 896 字节的数据编码为 128 字节的代码字。我的项目的所有规范都由 CCSDS 在 pdf 的第 15 页上的这篇论文中定义。 http://public.ccsds.org/publications/archive/101x0b3s.pdf 该文档中未明确指定的一些内容是 J=8、E=16 (255/223) 和 I=4。

我已经多次通读这篇文章(以及许多其他文章),但我似乎丝毫没有理解发生了什么。我什至尝试过找到的代码 http://zxingnet.codeplex.com/SourceControl/latest#trunk/Source/lib/common/reedsolomon/GenericGF.cs

而且它也不适合我。有人用过这个吗?我需要一些指导,因为经过这么长时间的磨练后我感到迷茫。

对我来说最好的解决方案是,如果我只是将信息输入错误的 zxing 代码。

以下是我对 CCSDS 协议的解读:

J=8,表示每个符号 8 位(=1 字节)。 E=16,表示RS码纠正了16个错误。

这需要 32 个奇偶校验符号,因此 RS 码字长 255 个字节,包含 223 个信息字节。

I=4,表示一个交织器块由4个码字组成。

因此,一个块中可用的信息字节总数为 4*223 = 892 字节。这比您问题中所述的 896 少四个字节。我很确定你看错了 128 字节的代码字,所以你可能也看错了数字字节。

我迟到了这个问题,但以防万一这可以帮助其他人:

在数字计算机上实现 Reed Solomon 最简单和最常用的方法是使用 RS (255, 223) CCSDS 编码。这种编码由 CCSDS 指定,并已在深度 space 探测器和卫星等硬件中广泛使用数十年。

RS(255, 223)具有以下特点:

  • 每个符号有 2^8 种组合 (J = 8),所以每个符号都是一个字节。
  • 每个码字有 2^8 - 1 个符号,因此每个编码块的长度为 255 个字节。
  • 每个块可以编码的数据量是 223 字节
  • 每个块包含 32 个字节的 FEC 奇偶校验数据(223 个数据字节 + 32 个奇偶校验字节 = 255 个字节块)
  • 在不知道擦除(错误位置)的情况下,每个块最多可以纠正 16 个错误(E = 16,这始终等于奇偶校验字节数 / 2)
  • 当错误位置已知时,每个块最多可纠正 32 个错误(这始终等于奇偶校验字节数)
  • CCSDS指定使用1 + X + X^2 + X^7 + X^8的场生成多项式,第一个连续根= 112的代码生成器,以及11的本原元素。
  • CCSDS 还指定了双基多项式表示,以简化 encoder/decoder 在专用硬件中的实现。这是 RS(255、223)的许多现代软件实现中省略的一项功能,因为它对通用 CPU 没有实际用途,但在与旧硬件通信时仍然需要它。明确地弄清楚你是否需要这个 - 它可以通过 运行 通过查找 table before/after encoding/decoding.
  • 宁正态多项式输出来完成

一个 255 符号的代码字可以交织四次 (I = 4),总块大小为 892。这样做可以分散每个代码字之间的传输突发错误,增加成功代码字的机会更正。有关详细信息,请参阅下面链接的规范。

我不确定“128 字节代码字”是什么意思,但它可能与填充有关:

由于 2^8 的符号大小是一个相当严格的约束,每个代码字的长度必须为 255 个字节。但是,如果你不能一次发送一个255字节的块,或者更喜欢更多的错误保护,可以使用填充来有效地缩短255字节的块。

填充通过简单地将 223 个数据字节中的一些定义为填充而不是数据来工作。填充只是发送方和接收方都提前知道的一些固定值序列(CCSDS 将其称为 "virtual fill")。编码时,少量数据被添加到数据的开头以形成完整的 223 "data" 字节,并且这些数据像往常一样被送入编码器。编码后,填充从块的开头剥离,产生更短的块(或者更确切地说,数据和奇偶校验可能被复制到更小的数组)。然后传输。

解码时,填充会在解码器 运行 之前的块的开头插入。由于填充序列具有已知的固定值,因此这些字节包含错误的可能性为 0%。这意味着 16 个字节的错误保护将转移到块的其余部分。

因此,要从 RS (255, 223) 获取 127 字节的块,您可以从原始 223 字节中填充除 95 字节之外的所有数据,然后对其进行编码。您的块将如下所示:

填充[128] + 数据[95] + 奇偶校验[32] = 255 字节

然后在发送块之前删除填充:

数据[95] + 奇偶校验[32] = 127 字节

最后在解码器端,在解码前添加填充:

填充[128] + 数据[95] + 奇偶校验[32] = 255 字节

这实际上是一个 RS(127, 95) 代码,每 127 字节块提供 16 字节的 FEC。

CCSDS 标准规定虚拟填充:

  • 必须全为零
  • 不得转发
  • 不得更改特定物理频道上任务阶段的长度
  • 只能在代码块的开头插入
  • 只能插入 8I 位的整数倍。

如果您正在与之通话的遗留设备也严格实施这些(如果它是严格的 CCSDS,它会),您只需要遵守这些。

对于 RS (255, 223) 的 C# 实现,我这里有一个小库:

https://github.com/crozone/ReedSolomonCCSDS

这是基于 Phil Karn 的 C 实现,无处不在,包括 GNURadio 和 Android OS。

CCSDS 摘要:"TM SYNCHRONIZATION AND CHANNEL CODING— SUMMARY OF CONCEPT AND RATIONALE"(第 5 部分)

https://public.ccsds.org/pubs/130x1g2.pdf

CCSDS 参考:"TM SYNCHRONIZATION AND CHANNEL CODING" 第 4 节

https://public.ccsds.org/Pubs/131x0b3e1.pdf