郭 勇, 楊 歡
(南京北方信息產業集團有限公司產品研發中心,江蘇 南京 211153)
在無線通信中,由于信道的噪聲和畸變,必然會對其中傳輸的信息引入失真和信號判決錯誤,因此需要使用糾錯編碼來降低誤碼率。卷積碼的糾錯性能優于分組碼。在譯碼算法中,Viterbi譯碼算法性能最優[1]。其中(2,1,7)卷積碼應用非常廣泛。現采用Xilinx的FPGA設計(2,1,7)卷積碼和Viterbi譯碼器,并對設計的譯碼器進行糾錯能力測試,測試結果表明,該譯碼器糾錯性能良好。
(2,1,7)卷積碼編碼器的 k0=1, n0=2, N =7。碼生成多項式為: G0= ( 171)8, G1=(133)8。

設輸入為1 1 0 1 0 0 1 0 0 1 0 0 0,編碼后的輸出為11 01 01 11 01 10 10 01 10 11 10 10 00 00 01 11 00。用Verilog語言設計編碼器模塊,并編寫仿真測試文件,在ModelSimSE6.4a中得到編碼器的仿真波形,如圖1所示[2]。

圖1 (2,1,7)卷積碼編碼器的仿真波形
Viterbi譯碼算法是1967年由維特比提出的基于最大似然概率的譯碼算法。相比于序列譯碼和門限譯碼,Viterbi譯碼算法有更好的糾錯性能。
分支度量單元是計算譯碼輸入與各狀態分支間的距離度量值,并作為加-比-選(ACS)模塊的輸入。對BMU模塊進行設計,仿真結果如圖2所示[3]。

圖2 BMU模塊仿真波形
ACS模塊的功能是在每個狀態節點上分別對兩個前一狀態輸入支路的路徑度量值和相應分支度量值相加并進行比較,并將其中較小的值作為該節點新的路徑度量值。如果相加以后的值相同,則任意選擇一條路徑。這里采用全并行結構,因此需要64個ACS單元[4]。在每個時鐘的上升沿對64個狀態并行地進行一次加-比-選運算。對ACS模塊進行設計,仿真結果如圖3所示。

圖3 ACS模塊仿真波形
對譯碼器來說,每送入2位譯碼輸入,64個ACS模塊并行地進行一次加-比-選運算,并儲存運算的結果。這里需要計算 42次,即回溯的譯碼深度。回溯深度要求是約束長度的5~10倍。這里選擇6倍。為防止累加的過程中發生溢出,在編程中設定,如果經過ACS模塊計算后,S0~S63的64個狀態的路徑度量值都大于4,則所有的值都減去4,實際的糾錯性能滿足要求。EN00~EN63是每個狀態比較的結果,需要并行的輸出,作為回溯模塊找到正確路徑的判據[5]。
在經過 42次計算后,所有可能的路徑匯聚到一起,形成唯一一條最大似然路徑,這條路徑回溯后得到的輸出序列為正確的譯碼序列,仿真結果如圖4所示。

圖4 路徑量度迭代更新模塊仿真波形
當迭代運算進行完 42步以后,唯一的一條幸存路徑已經生成,回溯操作的目的就是找到這條幸存路徑。
當所有的狀態回溯完成后,下一步送到譯碼輸出模塊輸出正確的譯碼序列,結果如圖5所示。

圖5 狀態回溯模塊仿真波形
把回溯的狀態轉移路徑輸入到譯碼輸出模塊,得到正確的譯碼輸出結果[6]。
輸入編碼器的比特為1 1 0 1 0 0 1 0 0 1 0 0 0,送入譯碼器的是有誤碼的編碼序列11 01 01 11 01 11 10 01 10 11 10 10 11 00 01 11 00,加粗為誤碼,譯碼器輸出的是正確的1 1 0 1 0 0 1 0 0 1 0 0 0 。譯碼器實現了預先的糾錯功能,圖6的仿真結果表明該譯碼器實現了預期的糾錯功能。

圖6 譯碼輸出模塊的仿真波形
設進入編碼器的比特序列為:11011 00111 01101 00111。(偽隨機序列用Matlab中的randint函數產生)。
正確的編碼輸出為:11 01 01 11 10 00 10 11 00 00 01 11 11 11 01 10 10 10 10 11 01 00 10 10 10 11 00 00 00 00,仿真波形如圖7所示。
送入譯碼器的有誤碼的編碼為:11 01 01 00 10 00 10 11 01 00 01 11 11 11 00 10 11 10 10 11 01 00 10 10 10 11 01 00 00 00 00 00 00 00。加粗表示誤碼。
經過譯碼器糾錯,輸出正確的未編碼序列。仿真波形如圖8所示。

圖7 編碼輸入仿真波形

圖8 譯碼輸出仿真波形
給出了(2,1,7)卷積碼編碼器和采用Viterbi算法的譯碼器各功能模塊的設計方法,并對譯碼器糾錯性能進行了測試,測試結果表明該譯碼器有良好的糾錯性能。該譯碼器適用于對運算速度要求高、對資源占用較敏感的高速數字通信系統中。
[1] 王新梅,肖國鎮. 糾錯碼—原理與方法[M]. 西安:西安電子科技大學出版社,2001:74-80.
[2] 西瑞克斯.無線通信的Matlab和FPGA實現[M].北京:人民郵電出版社,2009:46-52.
[3] 安樂,李實秋. Viterbi譯碼器的應用及其硬件設計與實現[J]. 通信技術,2008,41(05):26-28.
[4] 傅民倉,馮立杰,李立波,等. 基于FPGA的高速Viterbi譯碼器的優化設計和實現[J]. 現代電子技術,2006,29(07):52-54.
[5] 周沖,胡劍浩,張忠培,等. CDMA系統通用高速Viterbi譯碼器的設計與實現[J]. 通信技術,2009,42(12):10-13.
[6] 張傳達,李小文. 卷積碼編碼及其Viterbi譯碼的實現[J]. 無線電工程,2006,36(07):45-48.