LDPC譯碼算法代碼概述


程序說明

V0.0 2015/1/24

LDPC譯碼算法代碼概述

 

概述

 

本文介紹了包括LDPC_Simulation.m, ldpcdecoderbp1.m,ldpcdecoderminsum.m, ldpcdecoderbp2.m,ldpcdecoderminsum2.m在內的MATLAB代碼的編寫思路,基本原理和功能,具體代碼可見文后。本文暫不涉及LDPC校驗矩陣的構造和編碼程序,此部分由他人提供。

修訂歷史

以下表格展示了本文檔的修訂過程

日期

版本號

修訂內容

2015/02/02

V1.0

初始版本,初步仿真正確

簡介

 

本程序基於MATLAB 2014a 編寫,本文檔中提到的"MATLAB"均指該特定版本MATLAB。本文提到的LDPC編碼均指二進制LDPC編碼,多進制暫時不進行討論。

LDPC(低密度奇偶校驗)編碼,顧名思義有兩個特性:糾錯編碼采用奇偶校驗,該種編碼方式具有低密度的特點。在學習LDPC編碼之前,必須要對線性分組碼的基本概念有詳細的了解,包括線性分組碼的映射思想、生成矩陣、校驗矩陣等。這部分內容可參考《通信原理》等書籍。有限域上的編碼可不做了解,這一點我現在也不懂。

低密度的意思是對於校驗矩陣H而言,1的個數遠小於0的個數。這對於譯碼算法而言是至關重要的,這表現在兩個方面。其一是對於一個大的校驗矩陣而言,太多的1會導致計算上的困難;其二是譯碼算法(此處特指置信傳播類算法)中的很多假設實際上是不成立的,在H不滿足低密度約束下對其性能會有很大影響。

LDPC的置信傳播算法包括以下假設:

  • Tanner圖無環
  • 各個校驗方程獨立
  • 矩陣設計過程中各個碼字距離足夠遠
  • 計算條件邊緣概率(?)
  • 其他

關於置信傳播的具體原理和假設將在《學習筆記:LDPC編譯碼基本原理》中做具體闡述,此處不再詳細說明。(由於《學習筆記:LDPC編譯碼基本原理》還未開始撰寫,該部分內容可能會有較大變動)

程序設計

 

程序結構

校驗矩陣和編碼程序已經給定程序(腳本)按順序由以下幾個部分構成

  • 參數設置
  • 隨機序列(數據)生成和編碼
  • AWGN信道仿真
  • 譯碼程序
  • 誤比特數等信息統計

校驗矩陣已知,且命名為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。

最小和算法

以下內容是最小和算法的編程具體實現方式,按上述思路2編寫,對應ldpcdecoderminsum2。

對於最小和算法,尤其要注意的是發送端的映射關系。對於置信傳播算法而言,如果把關系搞錯了,會發現誤碼率大約是1減正確情況下誤碼率,這個時候很快就能發現毛病所在;但在最小和中,弄錯了的話,誤碼率會變得怪怪的。

最小和算法本質上和置信傳播沒有什么區別。正如我們所觀察到的,置信傳播算法中有兩個可以改進的地方:其一是對於概率來說,不是0就是1,沒有必要采用兩組變量,更好的選項可能是采用比值的形式;其二是算法中采用的乘法取對數之后會變成加法,這樣能減少運算量。從這兩點出發,提出了對數似然比算法,最小和算法實際上是對數似然比算法的近似。

同置信傳播算法的前提假設,但以想法2為例,最小和算法闡述如下。

1.初始化: (按校驗矩陣結構對應vl至vnm)

2.校驗消息處理:(校驗節點傳遞信息unm)

    

3.變量消息處理:(變量節點)

    

4.譯碼判決:(qn0_1,大於0判決為0)

    

如果滿足 或達到最大迭代次數,返回譯碼后結果,退出循環;否者回到步驟2。

改進思路

 

改進的意思是這一程序是對的,但是能夠做得更好。譯碼程序的初步驗證過程是將EbN0設置為一個較大的值,在這一情況下迭代次數應該是1。很顯然這里的四個譯碼函數都完成了這一個測試,但是否真正無誤還有待更進一步的考驗。

做得更好的"好"往往是必須有一個標准的,如果我們將程序計算復雜度和空間復雜度降低、且易於FPGA實現作為"好"的標准,那么可以從以下幾個方面改進

  • 采用最小和算法
  • 采用了兩種變量存儲變量信息和校驗信息,但實際上一組足以
  • 可以選擇一種綜合1、2想法的存儲思路
  • 將1想法中需要find的取值預先存起來
  • 多參考譯碼器實現的學位論文
  • ……

參考

 

《LDPC碼基礎與應用》 賀鶴雲

An Introduction to Low-Density Parity Check Codes Daniel J. Costello, Jr.

代碼

……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM