Raptor(二):2011 RFC6330标准学习

2011 RaptorQ Forward Error Correction Scheme for Object Delivery

  对应FEC编码ID6。与RFC 5053中的Raptor编码相比具有更高的灵活性,支持更大的源块大小,并具有更好的编码效率。简化了RaptorQ代码在对象传送内容传送协议中的使用。同样采用系统RaptorQ形式。

后续会在Raptor(三): Shokrollahi, A. and M. Luby, “Raptor Codes”, Foundations and Trends in Communications and Information Theory: Vol. 6: No. 3-4, pp. 213-322, 2011.中补充原理。这本书由于CSDN说电子书资源不能上传,有需要的人可以私信我。

目录

  • 1. Introduction
  • 4. 标准中的符号定义和函数定义
    • 4.4 Object Delivery中设定的参数
      • 4.4.1 源块和子块的划分
      • 4.4.2 编码数据包的构建
      • 4.4.3 Example Receiver Recovery Strategies
  • 5. RaptorQ FEC Code 规范
    • 5.1 术语定义和符号定义
    • 5.2 系统RaptorQ FEC码概述
    • 5.3 编码
      • 从K’个源符号中生成中间符号L(>K')
      • 修复符号的生成
      • 生成矩阵角度看符号编解码
    • 5.4 解码

1. Introduction

  FEC的有效载荷都是4个字节,一个字节标识Source Block Number (SBN),以说明该数据包中涉及到的编码符号来自于哪一个源块。剩余三个字节表示数据包内编码符号的标识符Encoding Symbol ID (ESI)。相比RFC,说明源块变少了,需要的编码符号变多了。
Raptor(二):2011 RFC6330标准学习_第1张图片
为了收发两端的同步设置了以下需要传输的Object Transmission Information (OTI),这些参数可以通过内容传送协议(CDP)交付到接收端辅助解码:
  标准中所定义的OTI的Common项(共8bytes):
Raptor(二):2011 RFC6330标准学习_第2张图片

  • Transfer Length (F):40-bit unsigned integer,即传输长度,传输对象的整体大小。相比5053的 2 45 2^{45} 245变为946270874880,该数据不清楚如何设置的。
  • Symbol Size (T):16-bit unsigned integer,即每个符号的bit长度

同5053:F的传输长度受限于符号尺寸2^16-1。将一个源块中的符号数限制为56403。源块数量限制为 2 8 2^8 28

  标准中所定义的对象传输信息项Object Transmission Information (OTI)的Specific项(共4bytes):
Raptor(二):2011 RFC6330标准学习_第3张图片
The number of source blocks (Z): 8-bit 表示源块数量。
The number of sub-blocks (N): 16-bit 表示子块数量。
A symbol alignment parameter (Al):表示符号对齐参数。后续的有些参数的设定必须是该参数的倍数,比如设置(子)符号大小时。

4. 标准中的符号定义和函数定义

用于对象传送的RaptorQ编码器方案和RaptorQ解码器方案需要CDP提供以下信息:

  • F:对象的传输长度,以八位字节为单位
  • Al:符号对齐参数
  • T:符号大小,以八位字节为单位,必须是Al的倍数
  • Z:源块的数量
  • N:每个源块中子块的数量

用于对象传送的RaptorQ编码器方案和RaptorQ解码器方案需要CDP提供以下信息:

  • Source Block Number (SBN)
  • Encoding Symbol ID (ESI)
  • Encoding symbol(s)

参数推导算法:

输入:

  • F:对象的传输长度,以八位字节为单位
  • WS:工作存储器中可解码的最大尺寸块,单位为八位数 。用于生成可在解码器有限的工作存储器下有效解码的编码数据。
  • Al:符号对齐参数,以八位字节为单位
  • SS:一个参数,以设定子符号大小的理想下限为SS*Al
  • K’_max:每个源块的最大源符号数。5.1.2中设置为56403

输出:

  • T = P’
  • Kt = ceil(F/T),表示对象的源数据所需要的源符号总数
  • N_max = floor(T/(SS*Al))
  • for all n=1, …, N_max
    #  KL(n) is the maximum K’ value in Table 2 in Section 5.6 such that
      K’ <= WS/(Al*(ceil(T/(Al*n))))
  • Z = ceil(Kt/KL(N_max))
  • N is the minimum n=1, …, N_max such that ceil(Kt/Z) <= KL(n)

建议每个数据包正好包含一个符号。 然而,接收者应支持接收包含多个符号的数据包。

4.4 Object Delivery中设定的参数

  源对象分解为Z个源块,源块编号(SBN)从0~Z-1。每个源块被划分为K个源符号,每个符号的大小为T个八位字节,编码符号标识符(ESI)从0 ~ K-1。
  每个有K个源符号的源块被分成N个子块,每个子块包含大小为T’的K个子符号,子块小到可以在工作存储器中解码。

注意,解码的基本单位是块。每次完成一个块的解码。

4.4.1 源块和子块的划分

需求:
  一个对象的每个源块其中包含的符号数量不一定相同,但必须保证独立源块中每一个符号大小是相同的。

  很好理解,解码时是一个个源块为基本单元,源块余源块间是相互独立的。解码器从只比源符号数量稍多的编码符号中恢复源块。可以源块大小不同,因为上一个源块不会影响下一个源块的解码,源块中符号数多接收端就多收点编码符号即可,但源块解码时要对符号间进行异或操作,所以源块中每个符号大小必须相同。

每个源块包含K个源符号,每个子块包含K个子符号。源块的每个符号由每个子块的一个子符号组成。

Partition[I,J]函数:将一个大小为I的块分割成J个近似相等的块的参数。 更具体地说,它将I分割成长度为IL的JL块和长度为IS的JS块。 Partition[I, J]的输出是一个序列(IL, IS, JL, JS)

输入:

  • F:对象的传输长度,以八位字节为单位
  • Al:符号对齐参数,以八位字节为单位
  • T:符号大小,以八位数为单位,必须是Al的倍数
  • Z:源块的数量
  • N:每个源块中的子块数量

约束条件:

  • ceil(ceil(F/T)/Z) <= K’_max,应当使每个源块的符号数目小于给定的最大源符号数
    输出:
  • IL = ceil(I/J) # 向上取整块数
  • IS = floor(I/J) # 本质是商
  • JL = I - IS * J # 本质是余数
  • JS = J - JL # 本质是已有JL个块后,还需要多少个块

举个例子,(J,I)=(6,100),那么IL= 17,IS=16,JL=4,JS=2,此时 I L ∗ J L + I S ∗ J S = I IL*JL+IS*JS=I ILJL+ISJS=I J S + J L = J JS+JL=J JS+JL=J

在Partition[I,J]函数的基础上,得到:

  1. 将传输对象F划分成连续的源块

    • Kt = ceil(F/T),得到一共有多少个符号,如果 K t ∗ T > F Kt*T>F KtT>F,最后一个符号需要填充 K t ∗ T − F Kt*T-F KtTF个的零字节。
    • (KL, KS, ZL, ZS) = Partition[Kt, Z],将Kt个符号分为Z个源块,KL个符号的块有ZL个,KS个符号的块有ZS个。
  2. 源块中符号的生成:符号划分为子符号

    • (TL, TS, NL, NS) = Partition[T/Al, N],先将每个符号划分为子符号,即T/AI个符号组划分成N个子符号组,大小为T的符号划分为NL×TL×Al+NS×TS×Al的子符号组成。同时将每个源块也划分成N=NL+NS个子块,前NL个子块由TL*AI大小的K个子符号组成,后NS个子块由TS×Al大小的K个子符号组成。
    • 一个源块的每个子块符号大小不一定相同,但是每一个子块所具有的符号数应该相同。

此时,源块的第m个符号是由N个符号中每个符号组的第m个子符号组连接而成的。 请注意,这意味着当N>1时,一个符号不是对象的连续部分。

举例说明:
Raptor(二):2011 RFC6330标准学习_第4张图片

4.4.2 编码数据包的构建

每个编码数据包包含:

  • Source Block Number (SBN),利用该标识分辨该数据包是用于哪一个源块解码的。
  • Encoding Symbol ID (ESI),用该标识的0~K-1表示源符号,K及之后表示修复符号。每一个数据包要么只包含源符号要么只包含修复符号。

    注意每个源数据包只包含第一个源符号的编码符号ID。后续源符号按顺序具有编码符号ID X+1至X+G-1,其中G是数据包中的符号数。

  • encoding symbol(s)。一个数据包可以包含来自同一源块的任何数量的符号。如果一个源数据包中的最后一个源符号包括为FEC编码目的而添加的填充0字节,那么这些八位数不需要包括在数据包中。

对于接收端来说,发送了多少修复数据包是没有知道的必要的。

4.4.3 Example Receiver Recovery Strategies

接收者可以使用收到的对象的每个源块的编码符号来恢复该源块的源符号。

如果源块没有划分成子块,即N=1,那么原始对象中与源块相关的原始顺序的数据部分由连续ESI顺序的源块的源符号串连组成。

如果每个源块有多个子块,即N>1,那么原始对象中与源块相关的原始顺序的数据部分由与源块相关的子块串联组成,其中每个子块内的子符号是连续的ESI顺序。 在这种情况下,根据接收器的随机存取存储器(RAM)的可用数量,有不同的接收器源块恢复策略值得考虑,如下所述。

一种策略是利用Sec5所述的应用于源块接收符号的解码程序来恢复源块的源符号,然后对源符号的子符号进行重新排序。 如果接收器有足够的RAM来解码整个源块,这种策略就特别适用。

另一种策略是分别恢复源块的子块。 如果接收器有足够的RAM,一次只能解码一个子块,那么这种策略就特别适用。

5. RaptorQ FEC Code 规范

本节需要对线性代数、矩阵运算和有限域有基本了解。 特别是,混合伽罗华域GF[2]和GF[256]下的矩阵乘法和矩阵求逆。对稀疏线性方程以及利用稀疏线性方程的高效算法的基本熟悉。

5.1 术语定义和符号定义

术语定义:

  • Source block:包含K个源符号的块,用于RaptorQ编解码。
  • Extended Source Block:一个由K’源符号组成的块,其中K’>=K,由一个源块和多个0字节填充构成。
  • Symbol:以字节为单位的数据。
  • Source symbol:编码过程中最小的数据单位。 一个源块内的所有源符号都有相同的大小。
  • Padding symbol:全部为零位的符号,添加到源块中形成扩展源块。
  • Encoding symbol:编码符号由源块的源符号和从源块产生的修复符号组成。 从源块产生的修复符号与该源块的源符号具有相同的大小。
  • Repair symbol:根据源块的源符号生成。
  • Intermediate symbols:从源符号生成的符号。编码时,中间符号后续生成LT符号和PI符号。
  • LT symbols:从中间符号中生成LT码。
  • PI symbols:在5.4中建议的解码算法中会"permanently inactivated"的符号。解码算法第一阶段中会放入矩阵U。

    LT和Raptor编码的设计和分析通常是假设BP解码和非常大的源块。然而,在实践中经常使用中等大小的源块。在有限长度下,往往采用具有可控的复杂度的ML解码算法,该类算法被称为失活解码。

  • HDPC symbols:一部分中间符号是HDPC符号。每个HDPC符号与其他中间符号的大部分具有预编码关系。
  • LDPC symbols:每个LDPC符号与其他中间符号的一小部分具有预编码关系。
  • Internal Symbol ID (ISI): 用于编码和解码的唯一标识与扩展源块相关联的每个符号的信息。
  • Arithmetic operations on octets and symbols and matrices: 八位字节、符号和矩阵的算术运算

符号定义:

  • i, j, u, v, h, d, a, b, d1, a1, b1, v, m, x, y :表示一种或另一种类型的值或变量。
  • X: 表示一个非负整数值,根据上下文可以是ISI值或ESI值。
  • ceil(x)和floor(x):输入实数输出整数
  • min(x,y)和 max(x,y):返回x和y的最值
  • i % j 取余数,根据 i、j 类型确定是字节算术还是普通十进制算术。
  • i * j 乘积,根据 i、j 类型确定是字节算术还是普通十进制算术。
  • a ^^ b 如果a是字节,b是非负整数,则理解为表示 a ∗ a ∗ … ∗ a ( b 项) a*a*…*a(b项) aaab项),该乘积同字节算术。
  • u^v 表示等长bit流u和v的位异或。
  • Transpose[A] 矩阵A的转置矩阵。在本规范中,所有矩阵元素都是八位字节。
  • A^^-1 矩阵元素为字节,本标准中矩阵元素运算将按照第5.7节所述进行,A^^-1是A基于字节算术的矩阵逆。
  • K 表示单个源块中的符号数。
  • K’ 表示扩展源块符号的数目。标准中填充符号即附加源符号。
  • K’_max 单个源块中可以包含的最大源符号数。设置为56403。
  • L 表示单个扩展源块的中间符号数。
  • S 表示单个扩展源块的LDPC符号的数目。对于第5.6节Table 2中所示的K’的每个值,S的相应值是一个质数。同时会用于生成LT符号。
  • H 表示单个扩展源块的HDPC符号数。同时等价于PI符号。
  • B 表示(除LDPC符号之外的LT符号)中间符号的数量。
  • W 表示作为LT符号的中间符号的数量。对于第5.6节所示的表2中的K’的每个值,W的相应值是一个质数。
  • P 表示作为PI符号的中间符号的数量。包含所有HDPC符号。
  • P1 表示大于或等于P的最小素数。
  • U 表示作为PI符号的非HDPC中间符号的数量。
  • C表示中间符号的数组,C[0]、C[1]、C[2]、…、C[L-1]
  • C’表示扩展源块的符号阵列,其中C’[0]、C’[1]、C“[2]、…、C’[K-1]是源块的源符号,C’[K]、C’[K+1]、…,C’[K-1]为填充符号。
  • V0,V1,V2,V3 表示32位无符号整数的四个数组,5.5中会指明分别存放什么。
  • Rand[y,i,m] 表示伪随机数生成器。
  • Enc[K’,C,(d,a,b,d1,a1,b1)] 表示编码符号生成器。
  • Tuple[K’, X] 表示元组生成器函数。
  • T 表示以八位字节为单位的符号大小。
  • J(K′) 表示与K′相关的系统指数。
  • G 表示生成矩阵。
  • I_ S 表示S x S单位矩阵。

5.2 系统RaptorQ FEC码概述

  5.3中描述编码器编码过程:首先编码器从源块的源符号导出中间符号块。该中间块的特性是,可以使用相同的过程从其生成源符号和修复符号。其次源块的少量中间符号的异或生成修复符号。相同的过程可用于从中间块再现源符号。编码符号是源符号和修复符号的组合。
  5.4描述解码示例。从中间块生成源和修复符号的过程,解码可以从任何足够大的编码符号集合中恢复中间块,进而使用编码过程恢复源块的丢失源符号。
  5.8描述解码器的需求,5.4给出满足需求的有效解码算法。
  5.5描述5.3中的伪随机数生成器。
  5.7描述对应的字节算术。
  5.6节中提供了6~K’_max=56403个源符号之间的特定扩展源块大小时的systematic indices。因此,RaptorQ代码支持具有1到56403个源符号的源块。

5.3 编码

编码端:
源符号 -> 扩展符号 -> 中间符号 -> 源符号 + 修复符号
Raptor(二):2011 RFC6330标准学习_第5张图片
  对于K个源符号的给定源块,扩充K’-K个零字节符号,K’是第5.6节系统索引表2中至少为K的最小值(为编解码每个源块符号数量一致,实现更快的编码和解码,并最小化需要存储在编码器和解码器中的表信息量)

源块中的源符号的数K在发送器和接收器处已知,此时发送器和接收器可以从K计算K’,并且K’-K填充符号可以自动添加到源块,而不需要任何额外的通信。ESI接收器用于识别源块的编码符号源符号的ESI为0、1、2、…、K-1,修复符号的ESI为K、K+1、K+2、…

  编解码操作在扩展源块上进行。编码器和解码器使用 ISI 来识别与扩展源块相关联的符号,即用于生成编码符号和用于解码。ISI 的前K位也标识源符号,从K~K‘-1位标识填充符号,从K’位开始是修复符号。

ISI的作用是允许扩展源块的填充符号能以与其他源符号相同的方式处理。确保以一致的方式为扩展源块中的给定数量K’的源符号生成修复符号的前置,与K无关。

注意:原始K个源符号的ESI和ISI相同,K’-K个填充符号具有ISI,但没有相应的ESI(因为它们是既不发送也不接收的符号)。ESI和IST的确认由编解码器内部完成。

填充符号不是编码符号的一部分,不作为编码的一部分发送,仅参与中间符号编码辅助计算。在接收机处,可以基于K计算K′的值,然后接收机可以在K′个源符号的源块的末尾插入K′-K个填充符号,并从接收到的编码符号恢复源块的剩余K个源符号。

从K’个源符号中生成中间符号L(>K’)

  本质是预编码步骤。中间符号满足两个约束条件,使得一组源符号 C’[0], …, C’[K’-1] 对应唯一的中间符号C[0], …, C[L-1]:

  1. Tuple[] generator会为每一个源符号X生成一个元组,结合每个源符号的ISI,以上两个输入生成中间符号。

    For each X, 0 <= X < K’
       (d[X], a[X], b[X], d1[X], a1[X], b1[X]) = Tuple[K, X]

  2. 预编码关系在中间符号本身。

    Raptor(二):2011 RFC6330标准学习_第6张图片
    第一组预编码关系在于LDPC:

    LDPC符号共有S个,其生成过程如下:
    Raptor(二):2011 RFC6330标准学习_第7张图片
    该算法定义的LDPC是线性的,可以视为一个 S x B 矩阵 G_LDPC,1(由第一个循环体定义),和一个 S x P 矩阵 G_LDPC,2(由第二个循环体定义)满足:
    在这里插入图片描述

    第二组预编码关系在于 HDPC :

    Raptor(二):2011 RFC6330标准学习_第8张图片
    该算法定义的HDPC符号使得前K’+S个中间符号C[0],…,C[K’+S-1]和H个HDPC symbols C[K’+S], …, C[K’+S+H-1]满足:
    在这里插入图片描述

整个过程可以参考blog rfc6330 喷泉码 RaptorQ - 01 生成矩阵A中的案例。

修复符号的生成

  对于ISI X>K’的符号,同样生成一个元组(d、a、b、d1、a1、b1),然后采用Ecn[]生成器从中间符号中生成修复符号,该修复符号的ESI = X - (K’-K)。

注意源符号经过Ecn()后符号值和C’相同。

在第二个编码步骤中,通过 Enc[K’, (C[0], C[1], …, C[L-1) ]), (d, a, b, d1, a1, b1)] 生成具有 ISI X (X >= K’) 的修复符号

Raptor(二):2011 RFC6330标准学习_第9张图片

生成矩阵角度看符号编解码

  • D = K’ 个源符号 + (S+H)个 0 符号。一共 L 个符号。
  • C 表示 L 个中间符号。列向量形式
  • 生成矩阵 A

解码过程 D=A*C 和 生成过程 C = (A^^-1)*D,当然实际操作中按照Enc函数进行编码操作。

Raptor(二):2011 RFC6330标准学习_第10张图片
LDPC生成和HDPC生成已经在上面给出。两个单位矩阵I_S和I_H。此处补充 G_ENC:

在这里插入图片描述
解码器中如何生成G_ENC:接受到的编码符号都是中间符号的已知线性组合。解码的本质是给出了一个中间符号之间的线性方程组。

5.4 解码

后续补充四段解码过程。

你可能感兴趣的:(信号处理,学习)