LDPC译码算法代码概述
程序說明 V0.0 2015/1/24 | LDPC譯碼算法代碼概述 |
?
概述 | ? 本文介紹了包括LDPC_Simulation.m, ldpcdecoderbp1.m,ldpcdecoderminsum.m, ldpcdecoderbp2.m,ldpcdecoderminsum2.m在內(nèi)的MATLAB代碼的編寫思路,基本原理和功能,具體代碼可見文后。本文暫不涉及LDPC校驗矩陣的構(gòu)造和編碼程序,此部分由他人提供。 |
修訂歷史 | 以下表格展示了本文檔的修訂過程
|
簡介 | ? 本程序基于MATLAB 2014a 編寫,本文檔中提到的"MATLAB"均指該特定版本MATLAB。本文提到的LDPC編碼均指二進制LDPC編碼,多進制暫時不進行討論。 LDPC(低密度奇偶校驗)編碼,顧名思義有兩個特性:糾錯編碼采用奇偶校驗,該種編碼方式具有低密度的特點。在學(xué)習(xí)LDPC編碼之前,必須要對線性分組碼的基本概念有詳細的了解,包括線性分組碼的映射思想、生成矩陣、校驗矩陣等。這部分內(nèi)容可參考《通信原理》等書籍。有限域上的編碼可不做了解,這一點我現(xiàn)在也不懂。 低密度的意思是對于校驗矩陣H而言,1的個數(shù)遠小于0的個數(shù)。這對于譯碼算法而言是至關(guān)重要的,這表現(xiàn)在兩個方面。其一是對于一個大的校驗矩陣而言,太多的1會導(dǎo)致計算上的困難;其二是譯碼算法(此處特指置信傳播類算法)中的很多假設(shè)實際上是不成立的,在H不滿足低密度約束下對其性能會有很大影響。 LDPC的置信傳播算法包括以下假設(shè):
關(guān)于置信傳播的具體原理和假設(shè)將在《學(xué)習(xí)筆記:LDPC編譯碼基本原理》中做具體闡述,此處不再詳細說明。(由于《學(xué)習(xí)筆記:LDPC編譯碼基本原理》還未開始撰寫,該部分內(nèi)容可能會有較大變動) |
程序設(shè)計 | ? 程序結(jié)構(gòu) 校驗矩陣和編碼程序已經(jīng)給定程序(腳本)按順序由以下幾個部分構(gòu)成
校驗矩陣已知,且命名為H(800,480).mat,采用load('H(800,480).mat')即可載入,校驗矩陣為H。隨機序列(數(shù)據(jù))生成和編碼采用ldpcencoder(H)調(diào)用函數(shù),返回數(shù)據(jù)及其編碼。本文僅對AWGN信道和譯碼程序做說明。 ? AWGN信道 加性高斯白噪聲信道,說明信道的仿真只需要加上一個高斯白噪聲就可以了。"白"意味著任意兩個不同時刻的噪聲都是不相關(guān)的,"高斯"即服從高斯分布,滿足這兩個要求很簡單,采用randn生成一組序列即可。唯一不確定的就是噪聲的方差了。 對于零均值信號而言,方差代表的就是功率。問題就轉(zhuǎn)變成了如何通過EbN0計算噪聲的功率?EbN0是一個比值,每比特能量/噪聲功率譜密度。如果我們將信號功率歸一化,那么噪聲功率就是信噪比SNR的倒數(shù)。
在本程序中,校驗矩陣為480×800(比特速率為碼速率的0.4),采樣頻率等于碼速率(帶寬為采樣頻率的一半),因此有 SNR_dB = EbN0_dB((nEbN0)) + 10*log10(2)+10*log10(0.4); ? 譯碼程序編寫思想(置信傳播為例) 譯碼算法實際上是很簡單的,問題在于呢,如何早到那些要乘的數(shù)。就是下式中所表現(xiàn)的 集合中的數(shù)據(jù)
對于這個問題,有兩個考慮方式: 1. 傳播都是在邊上的,那么從邊入手。 H矩陣中有多少個非零元素,就有多少條邊,記為L。對于每一條邊而言,用兩個個長度也為L的向量保存邊所連接的變量節(jié)點和校驗節(jié)點的編號(r_Mark,c_Mark)。 初始化: 變量節(jié)點傳遞的信息是P(X|Y),那么只需要知道邊所對應(yīng)的變量節(jié)點(c_Mark(l))就知道了傳遞的信息。 迭代: 對于每一次的迭代,從第一條邊開始。找出邊的r=r_Mark(l),之后找到所有的r_Mark = r的邊,計算校驗節(jié)點的信息。 同理計算變量節(jié)點傳播的信息 判決 …… ? 問題在于: 找在MATLAB中采用find就可以了,但是復(fù)雜度到底是多少呢?每個循環(huán)都要find一下實在是太浪費了…… ? 2. 利用H矩陣的天然結(jié)構(gòu) 也就是說實際上我們要取的集合是H對應(yīng)的每一行或每一列的數(shù)。如果我們采用和H矩陣完全相同的方式去構(gòu)造信息傳遞的兩個矩陣,那么在尋址的過程中將會容易很多。 想法1對應(yīng)的程序是ldpcdecoderbp1和ldpcdecoderminsum,想法2對應(yīng)的程序是ldpcdecoderbp2和ldpcdecoderminsum2。實驗證明,程序?qū)?yīng)的校驗矩陣如本代碼所附時,采用方式1運行效率高。 |
算法 | ? 置信傳播 以下內(nèi)容是置信傳播算法的編程具體實現(xiàn)方式,按上述思路1編寫對應(yīng)ldpcdecoderbp1 LDPC譯碼過程可以用Tanner圖直觀表示,如圖 1所示,接收到的序列表示為 ,校驗節(jié)點為 ,我們要求的是 的條件后驗概率。
圖 1 Tanner圖 ? 本文不敘述過多原理性問題,僅列出計算步驟,此處假定編碼后的星座映射為 。 1.初始化:(P0,P1 = 1-P0)
2.校驗消息處理:(校驗節(jié)點傳遞信息rmn0,rmn1 = 1-rmn0) ???? 3.變量消息處理:(k為歸一化常數(shù)) ???? 4.譯碼判決:(求0,1后驗概率之比值qn0_1,大于1判決為0) ???? 如果滿足 或達到最大迭代次數(shù),返回譯碼后結(jié)果,退出循環(huán);否者回到步驟2。 最小和算法 以下內(nèi)容是最小和算法的編程具體實現(xiàn)方式,按上述思路2編寫,對應(yīng)ldpcdecoderminsum2。 對于最小和算法,尤其要注意的是發(fā)送端的映射關(guān)系。對于置信傳播算法而言,如果把關(guān)系搞錯了,會發(fā)現(xiàn)誤碼率大約是1減正確情況下誤碼率,這個時候很快就能發(fā)現(xiàn)毛病所在;但在最小和中,弄錯了的話,誤碼率會變得怪怪的。 最小和算法本質(zhì)上和置信傳播沒有什么區(qū)別。正如我們所觀察到的,置信傳播算法中有兩個可以改進的地方:其一是對于概率來說,不是0就是1,沒有必要采用兩組變量,更好的選項可能是采用比值的形式;其二是算法中采用的乘法取對數(shù)之后會變成加法,這樣能減少運算量。從這兩點出發(fā),提出了對數(shù)似然比算法,最小和算法實際上是對數(shù)似然比算法的近似。 同置信傳播算法的前提假設(shè),但以想法2為例,最小和算法闡述如下。 1.初始化: (按校驗矩陣結(jié)構(gòu)對應(yīng)vl至vnm)
2.校驗消息處理:(校驗節(jié)點傳遞信息unm) ???? 3.變量消息處理:(變量節(jié)點) ???? 4.譯碼判決:(qn0_1,大于0判決為0) ???? 如果滿足 或達到最大迭代次數(shù),返回譯碼后結(jié)果,退出循環(huán);否者回到步驟2。 |
改進思路 | ? 改進的意思是這一程序是對的,但是能夠做得更好。譯碼程序的初步驗證過程是將EbN0設(shè)置為一個較大的值,在這一情況下迭代次數(shù)應(yīng)該是1。很顯然這里的四個譯碼函數(shù)都完成了這一個測試,但是否真正無誤還有待更進一步的考驗。 做得更好的"好"往往是必須有一個標準的,如果我們將程序計算復(fù)雜度和空間復(fù)雜度降低、且易于FPGA實現(xiàn)作為"好"的標準,那么可以從以下幾個方面改進
|
參考 | ? 《LDPC碼基礎(chǔ)與應(yīng)用》 賀鶴云 An Introduction to Low-Density Parity Check Codes Daniel J. Costello, Jr. |
代碼 | …… |
轉(zhuǎn)載于:https://www.cnblogs.com/sea-wind2/p/4268408.html
總結(jié)
以上是生活随笔為你收集整理的LDPC译码算法代码概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Prefetcher中取消robots
- 下一篇: FileUpload控件