深入理解噴泉碼------噴泉碼的編譯碼算法詳解及實現

引言

       噴泉碼不算一個特別新的碼字了,2002年Luby就提出了噴泉碼的概念,當年Luby也拿着這個東西去創業了,好像後面還是死掉了,但不管怎麼說,這個碼字還是十分有應用價值的,核心在於其編解碼算法理解簡單,實現也比較簡單,就是對於其度分佈的核心生成的推導十分複雜。系列文章分爲兩篇,第一篇主要是對於典型的噴泉碼,LT碼的編譯碼算法的詳解,第二篇會對於其度分佈生成的推導過程進行引導性的說明(核心的那一塊的隨機遊走過程太難說了,有興趣的自己看論文吧),對於LT碼的實現,我寫了一份放在GitHub上,網址爲:https://github.com/zk3326312/LT_code/中包含一份matlab的實現,方便理解整體的過程,一份是c++的,將LT碼的整體功能封裝爲了一個類,如果要使用只需註冊一個發送回調函數即可使用,另一份是純c語言編寫的,這一份代碼提供了LT碼的各種編譯碼功能函數,OK,下面我們開始對LT碼的編譯碼算法流程進行詳細的說明。

LT碼編譯碼算法流程詳解

       噴泉碼是一類基於圖的線性糾刪碼,而LT碼是一種被提到3GPP標準中的實際可用的噴泉碼,顧名思義,噴泉碼中,編碼包就如同噴泉的水滴,而接收方只要能接收到足夠多的水滴就能夠形成一桶水(譯碼得到原始數據)。反映在實際流程上,就是發送端對原始信息進行編碼,得到源源不斷的編碼信息並且發送,只要接收端能正確接收到足夠的編碼信息就可以譯出原始數據。在二進制刪除信道上(數據包要麼正確接收,要麼丟包),這個過程相比於反饋重傳的機制來說更爲有效,尤其適是RTT較大的環境。

      而LT碼的編譯碼過程並不複雜,尤其是編碼過程,十分簡單,依據相應的公式生成度分佈,按照流程生成相應的編碼包即可,具體流程如下

LT碼的編碼算法

      LT碼作爲第一種實用的噴泉碼,其編碼過程較爲簡單,下面就某一編碼包的產生過程介紹如下:

①   由已定的度分佈p(d)(度現有的良好度分佈爲魯棒孤波分佈,具體流程在後續表附錄);

②   隨機選取一個度值d;

③   將這d 個不同的數據包求異或和,生成該編碼包。

具體過程如下圖所示

 

      不斷重複上面的步驟,就可以得到無限多個編碼分組。在這些步驟中一些細節需要注意:LT 碼編碼之前要先確定度分佈函數,度值的確定由度分佈函數來計算。不同的度分佈,k的概率值是不同的,但度分佈概率函數只是確定了取度值爲d的概率是多少,而並不能確定這d個原始編碼分組是哪些,所以對於這d個原始編碼分組的選擇來說是任意的,本文對這d個原始編碼分組的選擇採用均勻分佈來進行選取,即從區間[1,k]中按均勻分佈隨機生成d個整數。區間[1,k]中所有整數被選取的概率是相等的。把這d個整數進行異或,就得到了一個編碼分組。

LT碼的譯碼算法

      LT碼的譯碼算法有兩種,BP(後向傳播)譯碼算法和GE(高斯消元)譯碼算法,本文先從圖的形式講述譯碼過程,再通過矩陣的形式講述譯碼過程,方便大家理解。我們之前提到的,噴泉碼時一類基於圖的線性糾刪碼,什麼意思呢?我們來看一個BP譯碼過程的Tanner圖

       對於一個編碼包來說,與他相連的所有原始消息進行異或得到了編碼消息,我們可以通過一個度數爲1的編碼包(也就是隻有一個原始消息參與的編碼包,即編碼包等於原始消息)來使與之關聯的編碼包的度數減1,什麼意思呢?我們稱“+”爲異或運算,我們知道a+a = 0。對於一個編碼數據包來說,編碼數據爲a+b+c,即此編碼包度數爲3,而我們此時收到了一個度數爲1,消息爲a的編碼包,我們可以通過a+b+c+a = b+c。此時編碼包度數爲2了,如果我們此時又收到一個度數爲1,消息爲b的數據包,則可以通過b+c+b = c,使編碼包度數變爲1,而此時這個編碼包的度數爲1,消息爲c,它可以參與到另一個編碼包如c+d的譯碼過程中去,通過這樣的不斷迭代,我們最終就可以把a,b,c,d.....所有原始數據包解出,這也就是所謂的BP譯碼算法。

       那麼怎麼從矩陣的角度來理解譯碼過程呢?設原始數據分片後的消息矩陣爲S,編碼過程相當於乘以一個生成矩陣G,設編碼後矩陣爲M,則整個編碼過程可以表示爲M= SG,式子可以通過向量表示爲: 

                                          

       生成矩陣G爲一個根據度分佈隨機生成的K*N的矩陣,其中K爲LT碼碼長,N爲生成的編碼包數量,其值理論上可以爲無窮大,G矩陣中的每一列中1的個數就表明生成的編碼包的度數,其中1的位置表明參與編碼的源數據包的序號,因此,當G的秩等於K(行滿秩)時,整個方程組是可解的,此時源消息可譯碼,當G的秩不足K時,接收端持續接收數據包,反應在矩陣上爲G的列數持續增加,直到G的秩滿足要求。解方程組的過程我們一般通過高斯消元進行,這也就是所謂的高斯消元譯碼。以矩陣的形式來看,BP譯碼也就是每次找尋一個1的個數僅爲1的Si來進行譯碼。

       講到這裏,基本的LT碼編譯碼流程就說完了,拿來用已經足夠了,如果你後續還想對LT碼有一些深入的理解,請看我後續的博文

附表-魯棒孤波分佈

                                                     

       其中:

                                                                        

\tau(i)和其對應的\rho(i)相加起來,然後再歸一化,就得到了魯棒孤波分佈的表達式:

                                                             

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