天天看點

FEC之我見二

曾經有位大神在文章裡這麼寫着:采用改進型的vandermonde矩陣RS算法.其優點算法運算複雜度更低且解決了利用矩陣構造RS碼當矩陣奇異時,構造的糾錯碼不為RS碼的問題。

FEC的方案:在RTP或私有協定頭上擴充出包組頭(Group head),一個Group有k個媒體包和r個備援包組成,他們在Group内擁有不同的組号,通過組号的連續性可以判斷本組内資料包的丢失情況,進而選擇性的予以恢複(備援包丢失無需恢複)、因為UDP協定保障了包内資料的正确性,是以我們無需考慮包内糾錯的情況。Group是一個完整的獨立的FEC處理單元,不同Group之間無相關性。由于備援性的存在,一個Group中任意k個資料包可以用來重建k個原始媒體包,如果丢失資料包數小于等于r,接受者收到一個Group中任意的k個資料包後,即可以通過組号資訊确定丢失包的相對位置并進行FEC解碼,以恢複k個原始媒體包。這裡我們定義備援包數r與原始媒體包數k的比值為FEC編碼備援度r/k,備援度越高,抗丢包能力越強,同時傳輸效率也越低。

下面借鑒大神的FEC編解碼算法進行簡述:

1)資料包分割

對資料包FEc編碼運算首先進行的是包内分割,将資料包分割為多個定長單元,定長單元成為自,設字長為w bits,w的取值一般為8/16/32。FEc編碼對k個原始媒體包朱子進行處理,生成m個備援資料包與之對應的字。

例如:現有兩個原始資料包D1、D2,包的長度都為b bytes(對于包長不足b bytes的使用0補齊)-- b B,字長為w  bits -- w 位,那麼一個資料包的總字長為1 = 8b/w。用這兩個備援包C1、C2的過程簡述如下:

FEC之我見二

圖中F代表FEC編碼運算

2)Vandermonde編解碼以及改進

設k個原始媒體包D=(D1,D2,...,Dk),,r個備援資料包C=(C1,C2,...,Cr),那麼傳輸組Group表示為Y=(Y1,Y2,...,Yn),其中Yi=Di(0<=i<=k-1),Y

j=Cj(k<=j<=n-1)。B為 n x k 維 FEC生成矩陣,有機關矩陣I和矩陣G組成,則一個Group可表示為如下所示:

FEC之我見二

通過這種方式構造的RS碼是系統碼,資訊組以不變的形式在碼組的任意k位(通常在最前面: D1,D2,...,Dk)。如果以資料包為對象,那麼傳輸組的前k個包就是k個被保護的資料包。在接收端,如果接收者收到了Group中的任意k個資料包,即可根據所收到的資料包在Group中的位置資訊,從FEC生成矩陣B中提取對應的行,組成一個新的 kxk 維矩陣B‘,顯然 

FEC之我見二

如果B’ 為非奇異矩陣,那麼就可以通過如下逆變換得到原始資料報,完成恢複。

FEC之我見二

設計RS碼的關鍵在于怎樣設計生成矩陣B,也就是其系數矩陣G。本方案使用Vandermonde矩陣來建構系數矩陣G。正常定義Vandermonde矩陣V,r x k 維,如下所示:

FEC之我見二

系數矩陣G=V,該矩陣元素的運算都是在有限域GF(2^8)中進行的。Gij(i=0,1,...,r-1; j=0,1,...,k-1)為系數矩陣的元素,Ci(i=1,2,。。。,r)表示第i個備援包,Dj(j=1,2,。。。,k)表示第j個原始媒體包,根據下式:

FEC之我見二

上式運算時以包分割後的資料為運算機關的,模運算使用查表方式實作。例如發端使用k=6,r=2的榮譽模式,那麼對應的系數矩陣為:

FEC之我見二

根據上面系數矩陣,可以計算得到備援包為:

FEC之我見二

生成備援包C1C2,發送端就可以一次發送原始媒體包和備援包。如果發送的途中原始媒體包D3,D4丢失,那麼接收端就可以根據收到的包恢複丢失的原始媒體包,具體過程如下:

由于接收到的原始媒體包再次産生備援包:

FEC之我見二

将其與接收到的備援包作比較,就能得到丢失的原始媒體包的表達式:

FEC之我見二

要求出D3、D4,可利用高斯消除法求出系數矩陣 的逆 矩陣,前提是該矩陣是非奇異的。

傳統的Vandermonde矩陣構造RS碼是,需要非奇異矩陣,由于Vandermonde矩陣元素取值與有限域,且元素的運算遵循有限域的運算規則,就會存在一定機率出現矩陣奇異,用該矩陣構造的糾錯碼就不是RS碼,不能從任意k個包中恢複出原始媒體包。為此長沙這位大嬸對該傳統Vandermonde矩陣進行改進,解決了矩陣機率奇異的問題,具體實作見代碼。

3)私有協定/RTP與FEC的結合,下文繼續講解

繼續閱讀