基於FEC信道編碼丟包恢復技術

FEC 前向差錯恢復編碼

FEC 是一種前向差錯恢復編碼技術,是通過對原生信息序列進行編碼生成監督碼,這些監督碼作爲冗餘信息序列與原生信息序列一起被傳輸,當原生信息序列發生錯誤或丟失,可通過冗餘信息序列以一定能力恢復原生信息序列。
對於生成的冗餘數據,我們希望生成數據大小範圍與原生數據一致,以免使用更多冗餘來表示,比如在計算機中,以一個字節單位的數據來生成的編碼數據我們不希望是個兩個字節或更大數據。因此,編碼通常利用了有限域的數學方法,在有限域中進行四則運算,使得編碼後的數據還是在一樣的大小範圍內。

伽羅瓦域(galois field)

域是一個可以在其上進行加法、減法、乘法和除法運算而結果不會超出域的集合。如果域F只包含有限個元素,則稱其爲有限域。有限域亦稱伽羅瓦域(galois field),它是伽羅瓦(Galois,E.)於18世紀30年代研究代數方程根式求解問題時引出的。

伽羅瓦域的階(元素個數)必爲素數的冪,即有限域的階可表示爲pn (p是素數、n是正整數),記爲GF(pn) 。計算機應用一般取 p=2 來計算二進制運算。

GF(pn) 中有 pn 個元素,除了 0,1 之外的元素由本原多項式 P(x) 生成。本原多項式(primitive polynomial)是一個不可約多項式,不能夠進行因子分解,它 只能整除x2n1+1 , 而不能整除其他xJ1+1 , 其中 J<(2n1) 。當一個域上的本原多項式確定了,這個域上的運算也就確定了。本原多項式一般通過查表可得,同一個域往往有多個本原多項式。通過將域中的元素化爲多項式形式,可以將域上的乘法運算轉化爲普通的多項式乘法再模本原多項式。

GF(pn) 中元素加法和乘法單位元分別是 0和1,對於域中的乘法,當p爲素數時,才能保證集合中的所有的元素都有乘法逆元(0除外)。

通過本原多項式生成元素

GF(24) , 其本原多項式 P(x)=x4+x+1 , 令 GF(24) 的元素爲 01a1a2a14 , 則ai 生成的多項式爲 ximod(P(x)) , 如下表:

元素 多項式 對應數值
0 0modP(x)=0 0000 (0)
1 1modP(x)=1 0001 (1)
a1 x1modP(x)=x 0010 (2)
a2 x2modP(x)=x2 0100 (4)
a3 x3modP(x)=x3 1000 (8)
a4 x4modP(x)=x+1 0011 (3)
a5 x5modP(x)=x2+x 0110 (6)
a6 x6modP(x)=x3+x2 1100 (12)
a7 x7modP(x)=x3+x+1 1011 (11)
a8 x8modP(x)=x2+1 0101 (5)
a9 x9modP(x)=x3+x 1010 (10)
a10 x10modP(x)=x2+x+1 0111 (7)
a11 x11modP(x)=x3+x2+x 1110 (14)
a12 x12modP(x)=x3+x2+x+1 0010 (15)
a13 x13modP(x)=x3+x2+1 1101 (13)
a14 x14modP(x)=x3+1 1001 (9)

上面例子建立GF中元素與數值一一對應關係。

上述可以看出,GF 的元素其實就是二進制多項式構成的循環碼,由循環碼的特性,定義GF中元素的四則運算,保證了運算後的結果還是域的中元素。例如,加法 a4+a9=(0011)xor(1010)=(1001)=a14 , 即元素的加法是對應數值的異或結果對應的元素;a4a9=a((4+9)mod15)=a13 , 即元素相乘爲其冪值相加求模對應的元素。

設數值 y,u,v,z , 元素ai,aj,a((i+j)mod(n1)),a((ij)mod(n1)) 分別爲y,u,v,zGF(2n) 中對應的元素,爲則GF中四則運算爲:
加減法:數值異或 kl
乘法:kla((i+j)mod(n1))v
除法:k/la((ij)mod(n1))z

常用本原多項式:

n 本原多項式
4 x4+x+1
8 x8+x4+x3+x2+1
16 x16+x12+x3+x+1
32 x32+x22+x2+x+1
64 x64+x4+x3+x+1

爲了乘除法計算方便,一般將數值與元素對應關係列表。計算時,將數值根據錶轉爲對應各自的元素乘法,得到結果元素,再根據錶轉爲對應的數值。

RS編碼丟包恢復

通過使用多項式對應的GF來實現對非二進制數據運算並進行變換其實就是RS編碼技術。RS(Reed-Solomon)碼是一類糾錯能力很強的特殊的非二進制BCH碼。

對於簡單普通抗丟技術,增加冗餘是對原生數據一份複製,也就是增加數據的一倍冗餘來恢復對應的一個數據。這種恢復性能非常低。而RS編碼變換則能實現高效抗丟。

例如,有四個數據 a b c d被傳輸 , 則通過變換得到e=f(a,b,c,d) ,這時若a b c d 中有一個丟失,如a丟失,那麼可以通過逆變換a=fH(b,c,d,e) 恢復。也就是通過增加四分之一的冗餘,來抵抗一個包的丟失,但這種抵抗是任何一個數據。而如果要抗所有數據丟失,那麼需要增加一倍的冗餘,即四個原生數據變換到四個冗餘數據。

RS編碼

FD=C , 變換中涉及到的四則運算都在GF中進行,D 是原生數據,C 是監督數據(冗餘數據), F 是一個線性無關矩陣(變換方程組係數),其實現有範德蒙矩陣(vandermode)和柯西矩陣。範德蒙矩陣實現比較方便,可以構建任意 n*n 的非奇異可逆矩陣,其形式如下:

111112222n113323n11nn2nn1

例如,選取子範德蒙矩陣對 a b c d ,變換爲 e f g h :

111112481416641864256abcd=efgh
RS恢復

如果在n個原生數據 D 中丟失m個數據Dm ,那麼可以從冗餘數據C 中任意m個數據Cm 和原生未丟失數據Dnm 通過F 對應的子矩陣進行逆變換求解計算出丟失的Dm

例如,a b d 丟失, 我們任取冗餘數據中的 e g h 和爲丟失的c來恢復 :

11114811664164256abcd=egh

上面先將f 對應的矩陣F 那一行係數去掉,接着將c 對應矩陣F 那一列係數與c相乘,移位到等式右邊與 e g h 分別相加:
111148164256abd=e+cg+16ch+64c

整理爲:
111148164256abd=e+cg+16ch+64c

則逆變換可得 a b d:
abd=111148164256He+cg+16ch+64c

RS編碼通常將每n個原生數據爲一組,通過n*n 的範德蒙矩陣換成一組n個冗餘數據,如果丟失m個,那麼任意的m個冗餘便可用來逆變換恢復原生數據,最多可恢復連續n個丟失包,其中任意的冗餘數據就能來用恢復這一點是普通的增加冗餘的本質區別,因爲冗餘數據也會丟失,如果任意就能恢復那麼恢復能力也就更強; RS變化中涉及的運算是在定義在GF中的,這使的不因爲數據表示的大小而增加冗餘開銷 。

信道丟包恢復技術

在網絡通信傳輸場景,數據通常以包形式被連續傳輸,爲了抗丟包,可以採用FEC技術生成冗餘數據包,來恢復丟包, 將上述例子中數據用數據換成數據包,是一樣邏輯。通常將原生數據包分組,生成一組檢驗包(冗餘包),將檢驗包作爲下一組的冗餘, 例如:

a0b0c0d0a1e0b1f0c1g0d1h0

上述中,每4個包 a b c d 爲一組,生成的檢驗包e f g h分別做爲下一組包傳輸,這樣就可以前一組的丟包情況(丟少個),當收到下一組的就可以通過冗餘包恢復。對於實時傳輸情況,這樣爲了等待冗餘包,勢必造成延遲, 分組大小對應着延遲大小,犧牲時效性保證可靠性。

參考文獻

[1] James S. Plank. Erasure Codes For Storage Application.
https://web.eecs.utk.edu/~plank/plank/papers/FAST-2005.pdf
[2] James S. Plank. A Tutorial on Reed-Solomon Coding for Fault-Tolerance in RAID-like Systems
https://web.eecs.utk.edu/~plank/plank/papers/CS-96-332.pdf
[3] Reed-Solomon Codes.
https://www.cs.duke.edu/courses/spring10/cps296.3/rs_scribe.pdf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章