程序說明 算法 V0.0 2015/1/24編程 |
LDPC譯碼算法代碼概述函數 |
概述性能 |
本文介紹了包括LDPC_Simulation.m, ldpcdecoderbp1.m,ldpcdecoderminsum.m, ldpcdecoderbp2.m,ldpcdecoderminsum2.m在內的MATLAB代碼的編寫思路,基本原理和功能,具體代碼可見文後。本文暫不涉及LDPC校驗矩陣的構造和編碼程序,此部分由他人提供。 學習 |
修訂歷史測試 |
如下表格展現了本文檔的修訂過程 編碼
|
簡介 |
本程序基於MATLAB 2014a 編寫,本文檔中提到的"MATLAB"均指該特定版本MATLAB。本文提到的LDPC編碼均指二進制LDPC編碼,多進制暫時不進行討論。 LDPC(低密度奇偶校驗)編碼,顧名思義有兩個特性:糾錯編碼採用奇偶校驗,該種編碼方式具備低密度的特色。在學習LDPC編碼以前,必需要對線性分組碼的基本概念有詳細的瞭解,包括線性分組碼的映射思想、生成矩陣、校驗矩陣等。這部份內容可參考《通訊原理》等書籍。有限域上的編碼可不作了解,這一點我如今也不懂。 低密度的意思是對於校驗矩陣H而言,1的個數遠小於0的個數。這對於譯碼算法而言是相當重要的,這表如今兩個方面。其一是對於一個大的校驗矩陣而言,太多的1會致使計算上的困難;其二是譯碼算法(此處特指置信傳播類算法)中的不少假設其實是不成立的,在H不知足低密度約束下對其性能會有很大影響。 LDPC的置信傳播算法包括如下假設:
關於置信傳播的具體原理和假設將在《學習筆記:LDPC編譯碼基本原理》中作具體闡述,此處再也不詳細說明。(因爲《學習筆記:LDPC編譯碼基本原理》還未開始撰寫,該部份內容可能會有較大變更) |
程序設計 |
程序結構 校驗矩陣和編碼程序已經給定程序(腳本)按順序由如下幾個部分構成
校驗矩陣已知,且命名爲H(800,480).mat,採用load('H(800,480).mat')便可載入,校驗矩陣爲H。隨機序列(數據)生成和編碼採用ldpcencoder(H)調用函數,返回數據及其編碼。本文僅對AWGN信道和譯碼程序作說明。
AWGN信道 加性高斯白噪聲信道,說明信道的仿真只須要加上一個高斯白噪聲就能夠了。"白"意味着任意兩個不一樣時刻的噪聲都是不相關的,"高斯"即服從高斯分佈,知足這兩個要求很簡單,採用randn生成一組序列便可。惟一不肯定的就是噪聲的方差了。 對於零均值信號而言,方差表明的就是功率。問題就轉變成了如何經過EbN0計算噪聲的功率?EbN0是一個比值,每比特能量/噪聲功率譜密度。若是咱們將信號功率歸一化,那麼噪聲功率就是信噪比SNR的倒數。
在本程序中,校驗矩陣爲480×800(比特速率爲碼速率的0.4),採樣頻率等於碼速率(帶寬爲採樣頻率的一半),所以有 SNR_dB = EbN0_dB((nEbN0)) + 10*log10(2)+10*log10(0.4);
譯碼程序編寫思想(置信傳播爲例) 譯碼算法其實是很簡單的,問題在於呢,如何早到那些要乘的數。就是下式中所表現的
對於這個問題,有兩個考慮方式: 1. 傳播都是在邊上的,那麼從邊入手。 H矩陣中有多少個非零元素,就有多少條邊,記爲L。對於每一條邊而言,用兩個個長度也爲L的向量保存邊所鏈接的變量節點和校驗節點的編號(r_Mark,c_Mark)。 初始化: 變量節點傳遞的信息是P(X|Y),那麼只須要知道邊所對應的變量節點(c_Mark(l))就知道了傳遞的信息。 迭代: 對於每一次的迭代,從第一條邊開始。找出邊的r=r_Mark(l),以後找到全部的r_Mark = r的邊,計算校驗節點的信息。 同理計算變量節點傳播的信息 判決 ……
問題在於: 找在MATLAB中採用find就能夠了,可是複雜度究竟是多少呢?每一個循環都要find一下實在是太浪費了……
2. 利用H矩陣的自然結構 也就是說實際上咱們要取的集合是H對應的每一行或每一列的數。若是咱們採用和H矩陣徹底相同的方式去構造信息傳遞的兩個矩陣,那麼在尋址的過程當中將會容易不少。 想法1對應的程序是ldpcdecoderbp1和ldpcdecoderminsum,想法2對應的程序是ldpcdecoderbp2和ldpcdecoderminsum2。實驗證實,程序對應的校驗矩陣如本代碼所附時,採用方式1運行效率高。 |
算法 |
置信傳播 如下內容是置信傳播算法的編程具體實現方式,按上述思路1編寫對應ldpcdecoderbp1 LDPC譯碼過程能夠用Tanner圖直觀表示,如圖 1所示,接收到的序列表示爲
圖 1 Tanner圖
本文不敘述過多原理性問題,僅列出計算步驟,此處假定編碼後的星座映射爲 1.初始化:(P0,P1 = 1-P0)
2.校驗消息處理:(校驗節點傳遞信息rmn0,rmn1 = 1-rmn0) 3.變量消息處理:(k爲歸一化常數) 4.譯碼判決:(求0,1後驗機率之比值qn0_1,大於1判決爲0) 若是知足 最小和算法 如下內容是最小和算法的編程具體實現方式,按上述思路2編寫,對應ldpcdecoderminsum2。 對於最小和算法,尤爲要注意的是發送端的映射關係。對於置信傳播算法而言,若是把關係搞錯了,會發現誤碼率大約是1減正確狀況下誤碼率,這個時候很快就能發現毛病所在;但在最小和中,弄錯了的話,誤碼率會變得怪怪的。 最小和算法本質上和置信傳播沒有什麼區別。正如咱們所觀察到的,置信傳播算法中有兩個能夠改進的地方:其一是對於機率來講,不是0就是1,沒有必要採用兩組變量,更好的選項多是採用比值的形式;其二是算法中採用的乘法取對數以後會變成加法,這樣能減小運算量。從這兩點出發,提出了對數似然比算法,最小和算法其實是對數似然比算法的近似。 同置信傳播算法的前提假設,但以想法2爲例,最小和算法闡述以下。 1.初始化: (按校驗矩陣結構對應vl至vnm)
2.校驗消息處理:(校驗節點傳遞信息unm) 3.變量消息處理:(變量節點) 4.譯碼判決:(qn0_1,大於0判決爲0) 若是知足 |
改進思路 |
改進的意思是這一程序是對的,可是可以作得更好。譯碼程序的初步驗證過程是將EbN0設置爲一個較大的值,在這一狀況下迭代次數應該是1。很顯然這裏的四個譯碼函數都完成了這一個測試,可是否真正無誤還有待更進一步的考驗。 作得更好的"好"每每是必須有一個標準的,若是咱們將程序計算複雜度和空間複雜度下降、且易於FPGA實現做爲"好"的標準,那麼能夠從如下幾個方面改進
|
參考 |
《LDPC碼基礎與應用》 賀鶴雲 An Introduction to Low-Density Parity Check Codes Daniel J. Costello, Jr. |
代碼 |
…… |