CCSDS Reed Solomon编码

时间:2015-03-25 22:05:28

标签: c# zxing reed-solomon

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

2 个答案:

答案 0 :(得分:4)

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

在数字计算机上实现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字节之外的所有数据,然后对其进行编码。您的区块将如下所示:

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

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

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

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

padding [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同步和频​​道编码-概念和合理性摘要”(第5节)

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

CCSDS参考:“ TM同步和信道编码”第4节。

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

答案 1 :(得分:1)

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

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

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

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

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