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')的后两个参数指定了伽罗华域的生成多项式。

相关推荐
特种加菲猫8 分钟前
指尖上的魔法:优雅高效的Linux命令手册
linux·笔记
wuxuanok35 分钟前
Web后端开发-分层解耦
java·笔记·后端·学习
wuxuanok1 小时前
Web后端开发-请求响应
java·开发语言·笔记·学习
诗句藏于尽头2 小时前
内网使用rustdesk搭建远程桌面详细版
笔记
蜡笔小电芯2 小时前
【C语言】指针与回调机制学习笔记
c语言·笔记·学习
丰锋ff2 小时前
瑞斯拜考研词汇课笔记
笔记
DKPT4 小时前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式
KoiHeng7 小时前
操作系统简要知识
linux·笔记
巴伦是只猫8 小时前
【机器学习笔记Ⅰ】11 多项式回归
笔记·机器学习·回归
DKPT11 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式