摘 要:Turbo乘積碼是一種性能卓越的前向糾錯碼,具有譯碼復(fù)雜度低,且在低信噪比時可以獲得近似最優(yōu)的性能。介紹基于Chase算法的Turbo乘積碼軟入軟出(SISO)迭代譯碼算法,提出基于VHDL硬件描述語言的TPC譯碼器設(shè)計方案,并在FPGA芯片上進行了仿真和驗證。仿真結(jié)果證明該譯碼器有很大的實用性和靈活性。
關(guān)鍵詞:TPC碼; 軟判決譯碼; 迭代譯碼; VHDL; FPGA
中圖分類號:TN911.22 文獻標識碼:A
文章編號:1004-373X(2010)07-0073-04
Design of TPC Decoder Based on VHDL
XIANG Bing
(China Airborne Missile Academy, Luoyang 471009, China)
Abstract: Turbo product code(TPC) is a kind of forward error correction codes with excellent performance. TPC has low decoding complexity and achieves near-optimum performances at low signal-to-noise ratio. The soft in soft out(SISO) iteration decoding algorithm for Turbo product code which is based on Chase algorithm and a method of hardware design for Turbo product code iterative decoder based on VHDL are introduced. The decoder is simulated and implemented on FPGA circuit. The simulation results prove that the decoder has functions of validity and feasibility.
Keywords: TPC; soft-decision; iterative decoding; VHDL; FPGA
0 引 言
C.Berrou等學(xué)者在1993年提出基于軟輸入軟輸出(SISO)迭代譯碼算法的Turbo卷積碼,它可以在多次迭代后非常逼近香農(nóng)限,因此得到廣泛關(guān)注。但是其譯碼算法太復(fù)雜,且結(jié)構(gòu)不利于并行處理,從而限制了在高速通信系統(tǒng)中的應(yīng)用。受迭代譯碼思想的啟發(fā),R.Pyndiah等人于1994年在Chase的基礎(chǔ)上提出了線性分組碼的SISO算法,并通過迭代的方式應(yīng)用于乘積碼,稱為Turbo乘積碼(TPC)。TPC在譯碼性能上能夠接近Turbo卷積碼,同時算法復(fù)雜度較低,結(jié)構(gòu)適合并行處理,在采用流水線機制的基礎(chǔ)上,可以實現(xiàn)高速編譯碼器。
VHDL語言目前已經(jīng)成為EDA領(lǐng)域首選的硬件設(shè)計語言,電子業(yè)界越來越多的數(shù)字系統(tǒng)設(shè)計正在使用VHDL語言來完成。原因是通過VHDL語言設(shè)計的“軟核”便于存檔,程序模塊的移植和ASIC設(shè)計源程序的交付更為方便。
本文介紹了一種基于VHDL語言的TPC譯碼器設(shè)計方案,并且在FPGA芯片上進行了仿真和驗證。結(jié)果表明,該譯碼器具有很好的實用性和靈活性。
1 TPC編碼結(jié)構(gòu)
乘積碼是線性分組碼在空間維上的擴展。二維TPC的構(gòu)造如下:待編碼的數(shù)據(jù)被填充到一個矩形中,兩維的長度分別定義成k1,k2,對每一維的信息序列用線性分組碼Ci(ni,ki,di)進行編碼,ni,ki,di分別表示碼字長度、信息序列長度和最小漢明距離。子碼一般采用擴展?jié)h明碼(碼型可以相同,也可以不同)。編碼后的數(shù)據(jù)形成一個新的矩形,兩維的長度分別是n1,n2。二維TPC的編碼結(jié)構(gòu)如圖1所示。
圖1 二維TPC編碼結(jié)構(gòu)
2 TPC的譯碼原理
2.1 代數(shù)譯碼
代數(shù)譯碼也叫硬判決譯碼,如果一致校驗矩陣為H的分組碼C(n,k,d),經(jīng)信道傳輸后對應(yīng)的碼字為R,代數(shù)譯碼器的主要任務(wù)就是設(shè)法從中得到正確的錯誤圖樣E′,然后計算估值碼字C′,具體的譯碼步驟如下:
(1) 計算伴隨式S=H*RT;
(2) 根據(jù)伴隨式找出錯誤圖樣E;
(3) 得到譯碼器的輸出——估值碼字C′=R-E,若C′=C則譯碼正確,否則譯碼錯誤。
經(jīng)過解調(diào)硬判決的Turbo乘積碼數(shù)據(jù)可以通過行列迭代進行代數(shù)譯碼,如圖2所示。硬判決迭代譯碼比單純的分組碼譯碼性能要好,但是它并沒有體現(xiàn)出乘積碼的性能優(yōu)勢。
圖2 硬判決迭代譯碼
2.2 乘積碼的軟判決譯碼算法
雖然乘積碼的硬判決譯碼器復(fù)雜度低,容易實現(xiàn),但是采用軟判決譯碼器能提高通信系統(tǒng)的性能。一般而言,采用軟判決譯碼可以獲得超過3 dB的編碼增益。
1972年,Chase針對線性分組碼提出了接近最大似然譯碼(ML)的“Chase算法”,這是一種低復(fù)雜度的次最佳算法。
假設(shè)發(fā)送信號為E,接收信號為R,對此信號進行最大似然譯碼,當(dāng)SNR較高時,產(chǎn)生的碼字將以極大的概率落于以Y=(y1,y2,…,yj,…,yn)為中心,δ-1為半徑的球域中。其中,Y是接收信號的初步硬判決值。因此可以不用像ML算法那樣考慮所有的碼字,而只考慮以Y為中心,(δ-1)為半徑的球域內(nèi)的點即可。
Chase算法實現(xiàn)方法如下:
(1) 通過考察yj的可靠度,確定Y的p個最不可靠位。譯碼性能隨著p的增加逐漸改善,它的代價是譯碼復(fù)雜度的指數(shù)增加。當(dāng)p>4時,不可靠位的增加對譯碼性能改善不大,在本方案中p取2;
(2) 構(gòu)造測試圖樣Tq,如圖3所示;
圖3 測試圖樣生成示意圖
(3) 構(gòu)造測試序列:Zq=Y+Tq;
(4) Zq進行代數(shù)譯碼,得到譯碼結(jié)果C′,將譯碼結(jié)果作如下映射:0→+1,1→-1,然后歸入集合Ω;
(5) 分別求集合Ω中的碼字Ci與接收信號R間的歐氏距離,歐氏距離最小的碼字即為判決碼字D。
為了實現(xiàn)對乘積碼的高效譯碼,必須采用迭代方式,串行迭代譯碼的結(jié)構(gòu)如圖4所示。譯碼器的輸出為軟數(shù)據(jù),即帶有可靠度度量值的數(shù)據(jù)。
圖4 串行迭代譯碼結(jié)構(gòu)
在進行迭代譯碼時,設(shè)接收向量矩陣為[R],外部信息值矩陣為[W(m)],那么每一次迭代的軟輸入信息矩陣可以表示為:
[R(m)]= [R]+α(m)[W(m)]
(1)
式中:m表示迭代次數(shù);[R(m)]表示每一次迭代譯碼時,傳遞給譯碼單元的軟輸入信息序列矩陣;α(m)是第m次迭代的反饋系數(shù),稱為縮放因子,理論上需要根據(jù)子碼碼型和迭代次數(shù)進行調(diào)整,實際應(yīng)用采用經(jīng)驗值,性能沒有明顯惡化,但是復(fù)雜度大為降低。
硬判決值dj可靠度的計算需要兩個碼字C+1j和C-1j,硬判決碼字D是其中一個,因此需要找到另外一個碼字C,C即為D的競爭碼字,當(dāng)cj≠dj時與接收信號R具有最小的歐氏距離。
譯碼器的軟輸出值為:
r′j=
|R-C|2-|R-D|24dj, C∈Ω
β(m)×dj+rj,CΩ
(2)
式中:β(m)為可靠度因子;外信息Wj可用以下公式計算:
Wj=R-C2-R-D24dj-rj,C∈Ω
β(m)×dj,CΩ
(3)
從上式可以看出:譯碼器的軟輸出r′與dj符號相同,其絕對值代表了硬判決的可靠度;如果C不存在于集合Ω中,表明dj的可靠性非常高;如果C與R的歐氏距離很大,同樣表明dj的可靠性非常高。
3 基于VHDL語言的譯碼器設(shè)計
在本方案中,TPC子碼采用(32,26,5)的擴展?jié)h明碼;由p=2個最不可靠位產(chǎn)生4個測試圖樣;迭代次數(shù)設(shè)為10次;縮放因子和可靠度因子分別取值如下:
α(m)=[0.0,0.2,0.3,0.5,0.7,0.9,1.0,1.0,1.0,1.0];
β(m)=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0];
譯碼器的工作原理框圖如圖5所示,接收機解調(diào)數(shù)據(jù)經(jīng)過歸一化處理后數(shù)據(jù)范圍為[-1,+1]之間,采用8位定點數(shù)(Q6)表示;外部因子初始化為0,同樣采用8位定點數(shù)(Q6)表示。為了便于訪問,解調(diào)數(shù)據(jù)和外部因子合并成一個16位寬度的數(shù)據(jù)一起寫入RAM的一個地址單元,在本方案中TPC譯碼的數(shù)據(jù)塊大小為32×32,因此RAM的地址寬度為10位,高5位為行地址,低5位為列地址。
圖5 譯碼器工作原理框圖
根據(jù)TPC迭代譯碼的原理,譯碼器需要完成以下功能:
① 讀入一行(列)32個軟信息;
② 由式(1)得到32個軟輸入信息;
③ 計算32個軟輸入信息的不可靠度;
④ 對32位軟輸入信息進行初步硬判決;
⑤ 由2個最不可靠位得到4個測試序列;
⑥ 對4個測試序列進行代數(shù)譯碼;
⑦ 計算歐氏距離并排序;
⑧ 計算軟輸出和外部因子;
⑨ 更新外部因子矩陣。
在基于VHDL語言的譯碼器設(shè)計中,必須根據(jù)譯碼器的功能規(guī)劃好電路的時序。在本設(shè)計中,采用以下幾個計數(shù)器來控制電路完成不同的功能:
迭代次數(shù)計數(shù)器DM(0~10):0~9進行迭代,10迭代完成,空閑等待。
行列計數(shù)器KN(0~31):當(dāng)DM為偶數(shù)時進行行迭代,KN從0計數(shù)到26,當(dāng)DM為奇數(shù)時進行列迭代,KN從0計數(shù)到31,當(dāng)KN計滿之后完成一次半迭代,DM加1。
工作模式計數(shù)器SM(0~3):SM=0,完成譯碼器功能①~⑥;SM=1,完成譯碼器功能⑦;SM=2,完成譯碼器功能⑧~⑨;SM=3,空閑;當(dāng)SM計數(shù)到3之后,KN加1,繼續(xù)進行下一行(列)的譯碼。
工作模式0計數(shù)器N0(0~71):當(dāng)SM=0時,N0從0計數(shù)到31完成讀入32個軟信息數(shù)據(jù)R和外部因子矢量W;從32計數(shù)到63,根據(jù)式(1)計算軟輸入信息,計算的同時進行比較,得到2個最不可靠位,并且進行初步硬判距得到硬判決矢量Y;從64計數(shù)到67,得到4個測試序列ZQ;從68計數(shù)到71,完成測試序列的代數(shù)譯碼。
工作模式1計數(shù)器N1(0~3):當(dāng)SM=1時,N1從0計數(shù)到3,計算歐式距離并進行排序。
工作模式2計數(shù)器N2(0~63):當(dāng)SM=1時,N1從0計數(shù)到31,根據(jù)歐式距離計算軟輸出和外部因子矢量;從32計數(shù)到63,更新外部因子矢量。
DM計數(shù),從0計數(shù)到10之后,迭代譯碼完成,當(dāng)新的解調(diào)數(shù)據(jù)再次寫滿RAM,就將計數(shù)器DM重新置零,TPC譯碼模塊重新開始迭代。以下是TPC譯碼模塊的部分VHDL程序代碼:
IF CLK0′EVENT AND CLK0=′1′ THEN
IF SM=″00″ THEN
IF N0<32 THEN
--讀入軟信息和外部因子
RJ(Q0)<=SIGNED(RD(17 DOWNTO 9));
WZ(Q0)<=SIGNED(RD(8 DOWNTO 0));
ELSIF N0<64 THEN
--計算軟輸入信息
RJ(Q0)<=RJ_TMP;
--硬判決
YJ(Q0)<=RJ_TMP(8);
--尋找兩個最不可靠位
IF RJ_ABS<=RJ_MINA THEN
RJ_MINA<=RJ_ABS;
RJ_SA<=Q0;
RJ_MINB<=RJ_MINA;
RJ_SB<=RJ_SA;
ELSIF RJ_ABS<=RJ_MINB THEN
RJ_MINB<=RJ_ABS;
RJ_SB<=Q0;
END IF;
ELSIF N0<68 THEN
--得到測試序列
ZQ(Q1)<=YJ XOR SA ;
ELSE
--代數(shù)譯碼
ZQ(Q1)<=ZQ(Q1) XOR SA;
END IF;
END IF;
IF SM=″01″ THEN
--計算歐氏距離
IF N1<4 THEN
RL(Q1)<=RL_TMP;
--歐氏距離排序
IF RL_TMP RL_MINA<=RL_TMP; RL_SA<=Q1; RL_MINB<=RL_MINA; RL_SB<=RL_SA; RL_MINC<=RL_MINB; RL_SC<=RL_SB; RL_MIND<=RL_MINC; RL_SD<=RL_SC; ELSIF RL_TMP RL_MINB<=RL_TMP; RL_SB<=Q1; RL_MINC<=RL_MINB; RL_SC<=RL_SB; RL_MIND<=RL_MINC; RL_SD<=RL_SC; ELSIF RL_TMP RL_MINC<=RL_TMP; RL_SC<=Q1; RL_MIND<=RL_MINC; RL_SD<=RL_SC; ELSIF RL_TMP RL_MIND<=RL_TMP; RL_SD<=Q1; END IF; END IF; END IF; IF SM=″10″ THEN --計算外部因子 IF N2<32 THEN WZ(Q0)<=WZ_TMP; END IF; END IF; END IF; 4 結(jié) 語 本設(shè)計在Altera公司Stratix Ⅱ系列的EP2S60開發(fā)板上進行了仿真驗證,TPC譯碼器僅占用6%的邏輯資源,在工作時鐘為50 MHz的情況下,完成(32,26)×(32,26)迭代譯碼需要時間為0.8 ms左右,可以滿足1 Mb/s數(shù)據(jù)流的實時譯碼。通過修改程序中的參數(shù),本設(shè)計可以適用于任意碼率、任意碼長的TPC譯碼。 參考文獻 [1]李琦,張海林.基于FPGA的TPC信道編碼系統(tǒng)實現(xiàn)方法[J].電子科技,2005(10):30-33. [2]陳超,羅漢文,徐友云.基于FPGA的TPC編譯碼器的設(shè)計與實現(xiàn)[J].電子技術(shù),2004(9):32-35. [3]顧麗旺.Turbo乘積碼的譯碼算法及FPGA實現(xiàn)[D].濟南:山東大學(xué),2007. [4]方敏.分組Turbo碼的研究[D].成都:四川大學(xué),2003. [5]王曉波,羅霞.Turbo乘積碼及其FPGA實現(xiàn)[J].遙測遙控,2007(3):31-36. [6]羅霞.Turbo乘積碼技術(shù)研究及其FPGA實現(xiàn)[D].西安:西北工業(yè)大學(xué),2007. [7]彌憲梅.Turbo乘積碼譯碼的FPGA實現(xiàn)[D].哈爾濱:哈爾濱工業(yè)大學(xué),2006. [8]郭麗.寬帶無線系統(tǒng)中的TPC碼迭代譯碼研究[D].長沙:國防科技大學(xué),2006. [9]張宇橙.糾錯編碼原理與應(yīng)用[M].北京:電子工業(yè)出版社,2003. [10]馬馨睿.Turbo譯碼器的設(shè)計與實現(xiàn)[D].上海:上海交通大學(xué),2005.