我正在一个项目中,我需要将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代码中。

最佳答案

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

在数字计算机上实现Reed Solomon的最简单,最常见的方法是使用RS(255,223)CCSDS编码。此编码由CCSDS指定,数十年来已广泛用于诸如深空探测器和卫星之类的硬件中。

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还指定了双基多项式表示形式,以简化专用硬件中的编码器/解码器实现。这是许多现代的RS(255,223)软件实现中都省略的一项功能,因为该功能在通用CPU中没有实际用途,但是在与传统硬件进行通信时仍然需要此功能。绝对确定您是否需要这样做-可以通过在编码/解码之前/之后通过查找表运行普通多项式输出来实现。

  • 可以将255个符号的码字进行四次交织(I = 4),以提供892的总块大小。这样做可以在每个码字之间扩展传输突发错误,从而增加了成功进行码字校正的机会。有关详细信息,请参见下面链接的规范。

    我不确定“128字节代码字”的含义,但可能与填充有关:

    由于2 ^ 8的符号大小是一个相当严格的约束,因此每个码字的长度必须为255个字节。但是,如果您不能一次性发送255字节的块,或者无法提供更好的错误保护,则可以使用填充来有效地缩短255字节的块。

    通过简单地将223个数据字节中的某些字节定义为填充而不是数据,即可进行填充。填充只是发送者和接收者都提前知道的固定值序列(CCSDS将此称为“虚拟填充”)。编码时,会将少量数据添加到数据的开头,以形成完整的223个“数据”字节,然后将这些字节正常送入编码器。编码后,将填充从块的开头剥离,从而生成一个较短的块(或者,可以将数据和奇偶校验复制到较小的数组中)。然后将其发送。

    解码时,然后在运行解码器之前,在块的开头重新插入填充。由于填充序列具有已知的固定值,因此这些字节包含错误的可能性为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标准指定虚拟填充:
  • 必须包含全零
  • 不得传输
  • 不得更改特定物理 channel 上的任务阶段的长度
  • 必须仅在代码块
  • 的开头插入
  • 必须仅以8I位的整数倍插入。

  • 如果您要与之交谈的旧设备也严格执行这些操作,则仅需要遵守这些规则(如果使用CCSDS,则必须严格执行)。

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

    https://github.com/crozone/ReedSolomonCCSDS

    这是基于Phil Karn的C实现的,该实现在任何地方都可以找到,包括GNURadio和Android OS。

    CCSDS摘要:“TM同步和信道编码—概念和合理性摘要”(第5节)

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

    CCSDS引用:“TM同步和信道编码”,第4节。

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

    关于c# - CCSDS里德·所罗门编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29267440/

    10-08 22:08