我正在一个项目中,我需要将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)具有以下特征:
可以将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标准指定虚拟填充:
如果您要与之交谈的旧设备也严格执行这些操作,则仅需要遵守这些规则(如果使用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/