我正在开发一个项目,我需要将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代码错误。
答案 0 :(得分:4)
我迟到了这个问题,但是以防万一这可以帮助其他人:
在数字计算机上实现Reed Solomon的最简单,最常见的方法是使用RS(255,223)CCSDS编码。此编码由CCSDS指定,数十年来已广泛用于诸如深空探测器和卫星之类的硬件中。
RS(255,223)具有以下特征:
我不确定“ 128字节代码字”是什么意思,但可能与填充有关:
由于2 ^ 8的符号大小是一个相当严格的约束,因此每个码字必须为255个字节长。但是,如果您不能一次性发送255字节的块,或者希望提供更多的错误保护,则可以使用填充来有效地缩短255字节的块。
填充通过简单地将223个数据字节中的某些字节定义为填充而不是数据来工作。填充只是发送者和接收者都提前知道的一些固定的值序列(CCSDS将此称为“虚拟填充”)。编码时,会将少量数据添加到数据的开头,以形成完整的223个“数据”字节,然后将这些字节正常送入编码器。编码后,将填充从块的开头剥离,从而生成一个较短的块(或者,可以将数据和奇偶校验复制到较小的数组中)。然后将其发送。
解码时,然后在运行解码器之前,在块的开头重新插入填充。由于填充序列具有已知的固定值,因此这些字节包含错误的可能性为0%。这意味着16个字节的错误保护将转移到块的其余部分。
因此,要从RS(255、223)中获得127字节的块,可以填充原始223字节中除95字节之外的所有数据,然后对其进行编码。您的区块将如下所示:
padding [128] +数据[95] +奇偶校验[32] = 255字节
然后在发送块之前删除填充:
数据[95] +奇偶校验[32] = 127字节
最后在解码器端,在解码之前重新添加填充:
padding [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节。
答案 1 :(得分:1)
以下是我对CCSDS协议的解释:
J = 8,表示每符号8位(= 1字节)。 E = 16,表示由RS代码纠正的16个错误。
这需要32个奇偶校验符号,因此RS码字长255个字节,具有223个信息字节。
I = 4,表示一个交织器块由4个代码字组成。
因此,一个块中可用的信息字节总数为4 * 223 = 892字节。这比您问题中所述的896少四个字节。我很确定你误读了128字节的代码字,所以也许你误读了数字字节。