REED-SOLOMON CODING R-S编码CCSDS规范

文章目录

  • [4.1 OVERVIEW](#4.1 OVERVIEW)
  • [4.2 GENERAL](#4.2 GENERAL)
    • [4.2.1 DATA RANDOMIZATION](#4.2.1 DATA RANDOMIZATION)
    • [4.2.2 FRAME VALIDATION](#4.2.2 FRAME VALIDATION)
  • [4.3 SPECIFICATION](#4.3 SPECIFICATION)
    • [4.3.1 PARAMETERS](#4.3.1 PARAMETERS)
    • [4.3.2 GENERAL CHARACTERISTICS](#4.3.2 GENERAL CHARACTERISTICS)
    • [4.3.3 FIELD GENERATOR POLYNOMIAL](#4.3.3 FIELD GENERATOR POLYNOMIAL)
    • [4.3.4 CODE GENERATOR POLYNOMIAL](#4.3.4 CODE GENERATOR POLYNOMIAL)
    • [4.3.5 SYMBOL INTERLEAVING](#4.3.5 SYMBOL INTERLEAVING)
    • [4.3.7 SHORTENED CODEBLOCK LENGTH](#4.3.7 SHORTENED CODEBLOCK LENGTH)
    • [4.3.8 REED-SOLOMON 码块分区和虚拟填充](#4.3.8 REED-SOLOMON 码块分区和虚拟填充)
  • 代码示例以及尝试

关于4.3.3和4.3.4中的伽罗华域生成器
https://ww2.mathworks.cn/help/comm/ref/rsgenpoly.html

4.1 OVERVIEW

本节中定义的里德-所罗门 (R-S) 码是强大的突发纠错码。,可以选择两种不同的纠错选项之一。,为了获得最大性能(以伴随的开销为代价),E=16 选项可以纠正每个码字中的 16 个 R-S 符号错误。,为了降低开销(性能降低),E=8 选项可以纠正每个码字 8 个 R-S 符号。,里德-所罗门码可以单独使用,因此它在突发噪声信道中提供了优异的前向纠错能力。,然而,如果单独的里德-所罗门码不能提供足够的编码增益,则可以将其与第3节中定义的卷积码级联。这样使用时,里德-所罗门码是外码,而卷积码是内码,。

4.2 GENERAL

4.2.1 DATA RANDOMIZATION

应使用第 10 节中定义的伪随机化器,除非系统设计者验证以下注释中确定的问题已通过其他方式解决。

推荐的里德-所罗门码本身不能保证足够的位转换来保持接收器符号同步器锁定。,由于这些代码的准循环性质,不正确的代码块同步可能会导致未检测到的解码错误。,伪随机化器还用于帮助信号采集并减轻传输信号中的谱线。

4.2.2 FRAME VALIDATION

参考文献[1]、[2]和[6]中指定的FECF是可选的。,系统设计者可以选择使用它进行额外的代码块验证,特别是对于 E=8 代码。

E=16 的 Reed-Solomon 码具有极低的未检测到错误率,而 E=8 的 Reed-Solomon 码的未检测到错误率对于某些应用来说足够低。,因此,R-S 解码器可以单独使用来验证代码块,从而验证所包含的 TM 传输帧(参考文献 [1])、AOS 传输帧(参考文献 [2])或 USLP 传输帧(参考文献 [6])。

4.3 SPECIFICATION

4.3.1 PARAMETERS

所选Reed-Solomon(R-S)码的参数如下:

a) J 应为每个 R-S 符号 8 位。

b) E 应为 16 或 8 个 R-S 符号。

E 应为 16 或 8 个 R-S 符号。

4.3.2 GENERAL CHARACTERISTICS

该代码应符合以下一般特征:

a) J、E 和 I(交织深度)是独立参数。

b) 每个 R-S 码字 n = 2 J -- 1 = 255 n = 2^J--1 = 255 n=2J--1=255 个符号。

c) 2E是表示奇偶校验的R-S码字的n个符号中的R-S符号的数量。

d) k = n--2E 是表示信息的 R-S 码字的 n 个 R-S 符号中的 R-S 符号的数量。

4.3.3 FIELD GENERATOR POLYNOMIAL

场发生器多项式应为:
F ( x ) = x 8 + x 7 + x 2 + x + 1 \mathrm{F}(x)=x^8+x^7+x^2+x+1 F(x)=x8+x7+x2+x+1

over GF(2).

显然,CCSDS中的初始伽罗华域生成器与matlab中的函数不同。

4.3.4 CODE GENERATOR POLYNOMIAL

代码生成多项式应为:
g ( x ) = ∏ j = 128 − E 127 + E ( x − α 11 j ) = ∑ i = 0 2 E G i x i g(x)=\prod\limits_{j=128-E}^{127+E}(x-\alpha^{11j})\quad\quad\quad\quad=\sum\limits_{i=0}^{2E}G_ix^i g(x)=j=128−E∏127+E(x−α11j)=i=0∑2EGixi

o v e r G F ( 2 8 ) , w h e r e F ( α ) = 0. \mathrm{over~GF}(2^8),\mathrm{where~F}(\alpha)=0. over GF(28),where F(α)=0.

Notes:

1 应该认识到,α11 是 GF(28) 中的本原元素,并且当 E = 16 时,F(x) 和 g(x) 表征为 (255,223) Reed-Solomon 码;当 E = 8 时,表征为 (255,239) ReedSolomon 码.

2 所选择的代码是系统代码。这会产生系统的代码块。

4.3.5 SYMBOL INTERLEAVING

4.3.5.1 交织深度允许值为I=1、2、3、4、5、8。

注 -- I=1 相当于没有交错。

4.3.5.2 任务阶段的物理信道上的交织深度通常应固定。

注 -- 符号交织的讨论包含在 4.4.1 中。

4.3.6 最大码块长度

最大码块长度(以 R-S 符号表示)应由以下等式确定:
L max ⁡ = n I = ( 2 J − 1 ) I = 255 I L_{\max}=nI=(2^J-1)I=255I Lmax=nI=(2J−1)I=255I

4.3.7 SHORTENED CODEBLOCK LENGTH

4.3.7.1 可以使用缩短的码块长度来容纳小于最大值的帧长度。

注 --- 然而,由于里德-所罗门码是块码,因此解码器必须始终在完整块的基础上进行操作。

4.3.7.2 为了实现完整的码块,应添加"虚拟填充"以弥补缩短的块与最大码块长度之间的差异。

注 1:虚拟填充的特性和限制见 4.3.8.2。

2 由于虚拟填充不被传输,因此编码器和解码器都需要设置以正确的长度插入虚拟填充,以便正确执行编码和解码过程。

4.3.7.3 当编码器(在块开始处初始清零)接收到表示信息的 kI--Q 符号(其中 Q 表示填充,是 I 的倍数,并且小于 kI)时,应计算 2EI 个校验符号,over kI个符号,其中前导Q符号应被视为全零符号。

注 -- A (nI--Q, kI--Q) 缩短的代码块结果。

4.3.7.4 生成的缩短码块的前导 Q 符号(全零)不应输入编码器,也不应传输。

以这种方式缩短传输的码块长度会在一定程度上改变整体性能,具体取决于所使用的虚拟填充量。,由于它不包含虚拟填充,因此最大代码块长度可以充分发挥性能。,此外,随着码块中虚拟填充的增加(在特定比特率下),解码器必须处理的每单位时间的码块数量也增加。,因此,应注意不要超过解码器的最大运行速度(每单位时间的代码块)。

4.3.8 REED-SOLOMON 码块分区和虚拟填充

4.3.8.1 分区 Reed-Solomon 码块的各部分(见图 4-1)定义如下:

a) Reed-Solomon 校验符号应由码块的尾部 2EI 符号(2EIJ 位)组成。

注 1 例如,当 E = 16 且 k = 223 时,对于 I=5,这始终是 1280 位。 ,

2 传输帧由TM空间数据链路协议(参考文献[1])、AOS空间数据链路协议(参考文献[2])或统一空间数据链路协议(参考文献[6])定义。 ,(有关传输帧长度的限制,请参阅第 11 节。)

b) 与 R-S 代码 1) 一起使用的附加同步标记应为第 9 节中规定的 32 位模式; ,2) 应位于传输的代码块之前。

注 -- 因此,帧同步器应设置为在每个传输的代码块 + 32 位处都有一个标记。

c) 传输的码块应由传输帧(不带 32 位同步标记)和 R-S 校验符号组成。

注 1:传输的代码块是物理上馈入 R-S 解码器的接收数据实体。 ,(例如,当E = 16且k = 223时,使用I = 5并且没有虚拟填充,传输的码块的长度将为10,200位;如果使用虚拟填充,则它会逐渐变短,具体取决于数量,用过的。)

2 逻辑代码块是由 R-S 解码器操作的逻辑数据实体。,它可以具有与传输的代码块不同的长度,因为它考虑了引入的虚拟填充量。 ,(例如,当 E = 16 且 k = 223 时,对于 I=5,逻辑代码块的长度似乎总是恰好为 10,200 位。)

3 R-S 码块的划分如图 4-1 所示。


代码示例以及尝试

在Reed-Solomon (RS) 编码中,场发生器多项式(Field Generator Polynomial)是用来定义Galois域(GF)的生成多项式,它在编码和译码中起着关键作用。RS编码中的每个GF元素都可以用多项式表示,而场发生器多项式就是用来定义GF的生成方式。

在 G F ( 2 m ) GF(2^m) GF(2m)上,每个元素都可以表示为m位二进制数。一个 G F ( 2 m ) GF(2^m) GF(2m)的元素可以用一个m次的多项式来表示,其中多项式的系数为0或1。例如,在GF(2^8)上,一个元素可以用8位二进制数表示,也可以用一个8次多项式表示,其系数为0或1。

场发生器多项式定义了如何在GF(2^m)上生成元素。它是一个m次的不可约多项式,即它不能被分解为两个次数低于m的多项式的乘积。在RS编码中,通常选择的场发生器多项式是一个m次的不可约二进制多项式,因为这样可以更容易地进行编码和译码。

例如,对于GF(2^8),可以选择的场发生器多项式可以表示为一个8次的不可约二进制多项式。这个多项式可以用一个数组来表示,数组的每个元素对应多项式的一个系数。例如,[1 1 0 0 0 1 1 1]表示的是多项式 x 8 + x 7 + x 2 + x + 1 x^8+x^7+x^2+x+1 x8+x7+x2+x+1over GF(2)。

当进行RS编码时,使用的场发生器多项式决定了编码后的纠错能力和性能。因此,选择适当的场发生器多项式是RS编码中非常重要的一步。


当使用数组表示多项式时,数组中的每个元素对应于多项式中相应的系数。在GF(2)上,多项式中的系数只能是0或1,因此数组中的每个元素也只能是0或1。

对于 [1 1 0 0 0 1 1 1] 这个数组,它表示的是一个8次多项式。每个数组元素对应的是多项式中相应次数的系数。

  • 第一个元素对应的是 x 7 x^7 x7的系数,因为它在数组中的位置是7。
  • 第二个元素对应的是 x 6 x^6 x6的系数,因为它在数组中的位置是6。
  • 以此类推,最后一个元素对应的是 x 0 x^0 x0(即常数项)的系数。

因此, [1 1 0 0 0 1 1 1] 这个数组表示的是一个8次多项式,其系数分别为1、1、0、0、0、1、1、1。转换成多项式形式就是:

x 7 + x 6 + x 2 + x + 1 x^7 + x^6 + x^2 + x + 1 x7+x6+x2+x+1

这样就对应上了多项式 x 8 + x 7 + x 2 + x + 1 x^8+x^7+x^2+x+1 x8+x7+x2+x+1 over GF(2)。


当涉及到RS编码和译码时,Matlab提供了许多有用的函数来简化这些过程。下面是一个基本的RS编码和译码的示例流程:

matlab 复制代码
 % RS 编码
    N_GF = 255; % 'N' :(N,N-d_min+1 ,d_min): (N,K,d_min)
    t = 16; % 't': radius of the bounded sphere: error correcting capability
    d_min = 2*t+1; % minimum distance of the RS code: should be odd number:
    K_GF = N_GF-d_min+1; 
    % DONOT CHANGE THIS
    m = 8; % dimension of the finite field: 2 is the characterstic: GF(2^8)
    data_size = K_GF*m;
    nSymbol = data_size;     % 每种信噪比下发送的符号数  n = 7, k = 5的情况下要求数据的长度必须是1500

    % -- GENERATOR POLYNOMIAL FOR THE RS code ------------
    gen_poly = Gen_Poly_RS(m, d_min);  % D 8 4 3 2 1   285decimal

    n = 255; % 编码字长度
    E = 16; % 错误纠正能力的一半
    k = 255 - 2 * E; % 消息字长度   % 223
    encoder = comm.RSEncoder('BitInput',true,'CodewordLength',n,'MessageLength',k , 'GeneratorPolynomial', gen_poly);
    decoder = comm.RSDecoder('BitInput',true,'CodewordLength',n,'MessageLength',k, 'GeneratorPolynomial', gen_poly);

关键函数

matlab 复制代码
function [gen_poly] = Gen_Poly_RS(m,d_min)  % decimal 391
a2 = gf(2,m,'D8+D7+D2+D1+1');

temp = gf([1 a2],m,'D8+D7+D2+D1+1');

for i1=1:d_min-1 
    temp = conv(temp,gf([1 a2^(i1)],m,'D8+D7+D2+D1+1'));
end
gen_poly = temp;
end

gf(2,m,'D8+D7+D2+D1+1')的后两个参数指定了伽罗华域的生成多项式。

相关推荐
看山还是山,看水还是。15 分钟前
MySQL 管理
数据库·笔记·mysql·adb
训山1 小时前
【11】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-模块化语法与自定义组件
笔记·学习·华为·harmonyos·鸿蒙系统
alfiy2 小时前
Elasticsearch学习笔记(四) Elasticsearch集群安全配置一
笔记·学习·elasticsearch
向上的车轮2 小时前
Django学习笔记十一:部署程序
笔记·学习·django
alfiy3 小时前
Elasticsearch学习笔记(五)Elastic stack安全配置二
笔记·学习·elasticsearch
pumpkin845143 小时前
CXO、CRO、CMO、CDMO相关概念
笔记
结衣结衣.3 小时前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
Starry_hello world6 小时前
二叉树实现
数据结构·笔记·有问必答
唐·柯里昂79813 小时前
[3D打印]拓竹切片软件Bambu Studio使用
经验分享·笔记·3d
sml_542113 小时前
【笔记】连续、可导、可微的概念解析
笔记·线性代数