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说电子书资源不能上传,有需要的人可以私信我。
FEC的有效载荷都是4个字节,一个字节标识Source Block Number (SBN),以说明该数据包中涉及到的编码符号来自于哪一个源块。剩余三个字节表示数据包内编码符号的标识符Encoding Symbol ID (ESI)。相比RFC,说明源块变少了,需要的编码符号变多了。
为了收发两端的同步设置了以下需要传输的Object Transmission Information (OTI),这些参数可以通过内容传送协议(CDP)交付到接收端辅助解码:
标准中所定义的OTI的Common项(共8bytes):
同5053:F的传输长度受限于符号尺寸2^16-1。将一个源块中的符号数限制为56403。源块数量限制为 2 8 2^8 28
标准中所定义的对象传输信息项Object Transmission Information (OTI)的Specific项(共4bytes):
The number of source blocks (Z): 8-bit 表示源块数量。
The number of sub-blocks (N): 16-bit 表示子块数量。
A symbol alignment parameter (Al):表示符号对齐参数。后续的有些参数的设定必须是该参数的倍数,比如设置(子)符号大小时。
用于对象传送的RaptorQ编码器方案和RaptorQ解码器方案需要CDP提供以下信息:
用于对象传送的RaptorQ编码器方案和RaptorQ解码器方案需要CDP提供以下信息:
参数推导算法:
输入:
- 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)
建议每个数据包正好包含一个符号。 然而,接收者应支持接收包含多个符号的数据包。
源对象分解为Z个源块,源块编号(SBN)从0~Z-1。每个源块被划分为K个源符号,每个符号的大小为T个八位字节,编码符号标识符(ESI)从0 ~ K-1。
每个有K个源符号的源块被分成N个子块,每个子块包含大小为T’的K个子符号,子块小到可以在工作存储器中解码。
注意,解码的基本单位是块。每次完成一个块的解码。
需求:
一个对象的每个源块其中包含的符号数量不一定相同,但必须保证独立源块中每一个符号大小是相同的。
很好理解,解码时是一个个源块为基本单元,源块余源块间是相互独立的。解码器从只比源符号数量稍多的编码符号中恢复源块。可以源块大小不同,因为上一个源块不会影响下一个源块的解码,源块中符号数多接收端就多收点编码符号即可,但源块解码时要对符号间进行异或操作,所以源块中每个符号大小必须相同。
每个源块包含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 IL∗JL+IS∗JS=I, J S + J L = J JS+JL=J JS+JL=J
在Partition[I,J]函数的基础上,得到:
将传输对象F划分成连续的源块
- Kt = ceil(F/T),得到一共有多少个符号,如果 K t ∗ T > F Kt*T>F Kt∗T>F,最后一个符号需要填充 K t ∗ T − F Kt*T-F Kt∗T−F个的零字节。
- (KL, KS, ZL, ZS) = Partition[Kt, Z],将Kt个符号分为Z个源块,KL个符号的块有ZL个,KS个符号的块有ZS个。
源块中符号的生成:符号划分为子符号
- (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时,一个符号不是对象的连续部分。
每个编码数据包包含:
注意每个源数据包只包含第一个源符号的编码符号ID。后续源符号按顺序具有编码符号ID X+1至X+G-1,其中G是数据包中的符号数。
对于接收端来说,发送了多少修复数据包是没有知道的必要的。
接收者可以使用收到的对象的每个源块的编码符号来恢复该源块的源符号。
如果源块没有划分成子块,即N=1,那么原始对象中与源块相关的原始顺序的数据部分由连续ESI顺序的源块的源符号串连组成。
如果每个源块有多个子块,即N>1,那么原始对象中与源块相关的原始顺序的数据部分由与源块相关的子块串联组成,其中每个子块内的子符号是连续的ESI顺序。 在这种情况下,根据接收器的随机存取存储器(RAM)的可用数量,有不同的接收器源块恢复策略值得考虑,如下所述。
一种策略是利用Sec5所述的应用于源块接收符号的解码程序来恢复源块的源符号,然后对源符号的子符号进行重新排序。 如果接收器有足够的RAM来解码整个源块,这种策略就特别适用。
另一种策略是分别恢复源块的子块。 如果接收器有足够的RAM,一次只能解码一个子块,那么这种策略就特别适用。
本节需要对线性代数、矩阵运算和有限域有基本了解。 特别是,混合伽罗华域GF[2]和GF[256]下的矩阵乘法和矩阵求逆。对稀疏线性方程以及利用稀疏线性方程的高效算法的基本熟悉。
术语定义:
LT和Raptor编码的设计和分析通常是假设BP解码和非常大的源块。然而,在实践中经常使用中等大小的源块。在有限长度下,往往采用具有可控的复杂度的ML解码算法,该类算法被称为失活解码。
符号定义:
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个源符号的源块。
编码端:
源符号 -> 扩展符号 -> 中间符号 -> 源符号 + 修复符号
对于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个源符号。
本质是预编码步骤。中间符号满足两个约束条件,使得一组源符号 C’[0], …, C’[K’-1] 对应唯一的中间符号C[0], …, C[L-1]:
For each X, 0 <= X < K’
(d[X], a[X], b[X], d1[X], a1[X], b1[X]) = Tuple[K, X]
LDPC符号共有S个,其生成过程如下:
该算法定义的LDPC是线性的,可以视为一个 S x B 矩阵 G_LDPC,1(由第一个循环体定义),和一个 S x P 矩阵 G_LDPC,2(由第二个循环体定义)满足:
第二组预编码关系在于 HDPC :
该算法定义的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’) 的修复符号
解码过程 D=A*C 和 生成过程 C = (A^^-1)*D,当然实际操作中按照Enc函数进行编码操作。
LDPC生成和HDPC生成已经在上面给出。两个单位矩阵I_S和I_H。此处补充 G_ENC:
解码器中如何生成G_ENC:接受到的编码符号都是中间符号的已知线性组合。解码的本质是给出了一个中间符号之间的线性方程组。
后续补充四段解码过程。