一種基于FPGA的QC_LDPC碼的譯碼器設(shè)計(jì)
文獻(xiàn)中也給出了4環(huán)和6環(huán)的檢驗(yàn)算法,同時(shí)可驗(yàn)證按照此方法得到的校驗(yàn)矩陣最小圍長為8。
本文引用地址:http://butianyuan.cn/article/246737.htm2 QC_LDPC碼的譯碼算法
置信傳播(Belief Propagation,BP)算法是LDPC的標(biāo)準(zhǔn)譯碼算法,在其基礎(chǔ)上又可改進(jìn)得到最小和(Min-Sum)算法、歸一化最小和(Nor malization Min-Sum,NMS)算法等。此類算法皆通過校檢節(jié)點(diǎn)更新和變量節(jié)點(diǎn)更新兩步完成一次譯碼迭代,因此又稱為2項(xiàng)迭代置信傳播(Two Phase Message Passing,TPMP)算法。TPMP算法因?yàn)樵谝淮蔚^程中,全部校檢節(jié)點(diǎn)更新完后,才對所有變量節(jié)點(diǎn)進(jìn)行更新,所以在一次迭代過程中,所有信息只能進(jìn)行一次更新,收斂速度較慢,譯碼延時(shí)較大。雖此后又提出了復(fù)用處理的方法,但未能從根本上提升算法的收斂性和譯碼性能。
2.1 QC_LDPC碼的分層譯碼策略
分層譯碼策略則改變了TPMP算法的譯碼方式,其將校檢矩陣按行或列劃分成若干分層。在一次迭代過程中,先并行更新第1分層中的所有校檢節(jié)點(diǎn)和相關(guān)的變量節(jié)點(diǎn),然后逐層進(jìn)行更新。因此在一次更新過程中,后更新的分層會利用已更新分層的輸出信息,變量節(jié)點(diǎn)在此過程中得到多次更新,大幅加快了譯碼的收斂速度,并提高了譯碼性能。但為確保變量節(jié)點(diǎn)信息在各分層之間能夠進(jìn)行傳遞,校檢矩陣一個(gè)分層中的列權(quán)重必須<1。
2.2 分層迭代譯碼算法
由上述子矩陣移位法構(gòu)造的是規(guī)則的QC_LDPC碼,因而采用分層譯碼時(shí)通常就是將校驗(yàn)矩陣行重的一個(gè)子塊行作為一個(gè)分層,以碼長3 456,碼率為1/2的(3,6)正規(guī)QC_LDPC碼為例,基陣大小為108×216,填充矩陣塊為16×16,以每個(gè)子塊行作為一個(gè)分層即每個(gè)分層16行,共有108個(gè)子層。
設(shè)高斯白噪聲信道的噪聲方差為σ2,接收到的信號序列為y,校驗(yàn)矩陣H的大小為M×N。迭代過程中信道固有信息Zn,校驗(yàn)節(jié)點(diǎn)信息Lm,n,變量節(jié)點(diǎn)信息Zm,n,其中0≤m≤M-1,0≤n≤N-1。以BPSK調(diào)制為例,NMSA為基礎(chǔ),將分層迭代譯碼算法的譯碼過程列述如下
(1)初始化
(2)迭代過程(第t次迭代的第k層)。
Step1分層更新。
Step2譯碼判決。若Zj<0,則
=1,否則
=0,更新譯碼結(jié)果
。 (3)譯碼結(jié)構(gòu)校驗(yàn)。完成一次迭代后,對更新的譯碼結(jié)果進(jìn)行校驗(yàn)。若滿足
xHT=0,或迭代次數(shù)達(dá)到系統(tǒng)設(shè)置的最大迭代次數(shù),則停止譯碼,并輸出譯碼結(jié)果。否則,跳回步驟(2)進(jìn)行新一次迭代。
3 正規(guī)QC_LDPC碼的譯碼器
3.1 譯碼器的結(jié)構(gòu)
對碼長為3 456,碼率為1/2的(3,6)正規(guī)QC_LDPC碼,子矩陣大小為16×16,共有108個(gè)子塊行,216個(gè)子塊列,648個(gè)非零子矩陣。采用分層迭代譯碼算法實(shí)現(xiàn)譯碼器,譯碼過程中只保存Zn和Lm,n兩種中間數(shù)據(jù),變量節(jié)點(diǎn)信息則通過式(2)計(jì)算得出,以減小數(shù)據(jù)存儲量。為便于硬件實(shí)現(xiàn),選擇α=0.75作為修正因子,這樣只需簡單的帶符號位右移和加法運(yùn)算便可完成數(shù)據(jù)修正。由于將每一個(gè)子塊行作為一個(gè)分層,因此譯碼器的并行度為108,即共需108個(gè)基本運(yùn)算單元。對譯碼器中的數(shù)據(jù)進(jìn)行6 bit量化,并對計(jì)算過程中產(chǎn)生的溢出數(shù)據(jù)采用截?cái)嗵幚?,這樣的量化處理使譯碼性能約有0.1 dB的損失,但節(jié)約了硬件資源。
圖1為分層譯碼器的整體硬件結(jié)構(gòu)。
(1)數(shù)據(jù)輸入模塊。接收解調(diào)模塊輸出量化后的對數(shù)似然比數(shù)據(jù),完成Zn的初始化。該模塊采用乒乓操作,即當(dāng)其中一個(gè)存儲器接收數(shù)據(jù)的同時(shí),譯碼器從另外一個(gè)存儲器中讀取數(shù)據(jù)進(jìn)行譯碼,以此來提高譯碼器的吞吐量。
(2)數(shù)據(jù)存儲模塊。根據(jù)譯碼過程中所存儲數(shù)據(jù)的不同,存儲模塊可劃分為3塊:1)后驗(yàn)概率存儲模塊Zmem,用于存儲Zn。單個(gè)Zn的長度為6位,每個(gè)子塊列對應(yīng)的存儲空間為6×16=96位,對應(yīng)子塊列數(shù),共需216個(gè)此類模塊。2)校驗(yàn)信息更新存儲模塊Lmem,用于存儲,單個(gè)的長度為6位,每一行有6個(gè)非零元素,所以每行對應(yīng)的存儲空間為6×6=36位,而每一子塊行所對應(yīng)的存儲空間為6×6×16=576位。對應(yīng)子塊行數(shù),共需108個(gè)此類存儲模塊。3)譯碼結(jié)果存儲模塊,用于存儲譯碼的結(jié)果。每一子塊列對應(yīng)的譯碼數(shù)據(jù)長度為16位,對應(yīng)子塊列數(shù),共需216個(gè)此類存儲空間。同樣為了提高吞吐量,譯碼數(shù)據(jù)輸出模塊也采用乒乓操作,當(dāng)一個(gè)存儲器進(jìn)行譯碼結(jié)果更新時(shí),另一個(gè)存儲器向外設(shè)輸出存儲器中的譯碼結(jié)果。
(3)校驗(yàn)節(jié)點(diǎn)更新模塊(Parity—Check UpdateBlock,PCUB)。校驗(yàn)節(jié)點(diǎn)模塊是譯碼器的核心處理單元,完成迭代的更新過程。共有108個(gè)PCUB模塊進(jìn)行并行處理,一次更新108組數(shù)據(jù)。每一組相關(guān)的6個(gè)變量節(jié)點(diǎn)信息串行輸入PCUB中的FIFO寄存器,并逐次進(jìn)行比較,尋找該組數(shù)據(jù)中的最小值與次最小值。當(dāng)一組數(shù)據(jù)輸入完成后,最小值與次最小值得以確定,再從FIFO寄存器中依次讀出數(shù)據(jù)同最小值與次最小值比較,再更新數(shù)據(jù)。迭代譯碼過程主要被劃分成兩個(gè)階段,變量節(jié)點(diǎn)信息輸入FIFO階段和變量節(jié)點(diǎn)信息輸出FIFO階段。這樣的結(jié)構(gòu)適合采用二級流水線,當(dāng)一組已輸入的變量節(jié)點(diǎn)信息從FIFO中讀取時(shí),將下一組變量節(jié)點(diǎn)信息輸入FIFO。通過二級流水線處理,提高了近一倍的數(shù)據(jù)吞吐率。
c++相關(guān)文章:c++教程
評論