卷積編碼及Viterbi 解碼的FPGA 實現(xiàn)及應(yīng)用
0 引言
在現(xiàn)代通信系統(tǒng)中,信道編碼技術(shù)得到了廣泛的應(yīng)用。卷積碼結(jié)構(gòu)簡單,硬件實現(xiàn)容易,同時有著較好的查錯糾錯能力,因此在無線通信中經(jīng)常使用,而其解碼方式常用Viterbi譯碼。
1 卷積編碼
卷積碼(Convolutional Coding)是由PgElias 于20 世紀50年代提出的一種非分組碼。它實現(xiàn)非常簡單,將要發(fā)送的信息序列經(jīng)過一個特定的線性移位寄存器,即完成了編碼。
卷積編碼常用(n,k,m) 表示,一般n 和k 的值都比較小,其中m 為編碼約束長度,它表示編碼時相應(yīng)的信息比特在編碼器中停留的時間。卷積編碼是一種前后相關(guān)聯(lián)的編碼過程,編碼后的碼元和當前的k 個比特位相關(guān),同時也與前m - 1 個輸入比特相關(guān),使得相互關(guān)聯(lián)的碼元達到m × n 個。衡量卷積碼性能的兩個重要參數(shù)是碼率 (k n)和約束長度。
2 卷積碼的描述方法
卷積碼的編碼描述方法有很多,工程中最常用的是寄存器網(wǎng)絡(luò)結(jié)構(gòu)法、碼多項式法和狀態(tài)圖形表示法。
如本系統(tǒng)中使用的(2,1,7)卷積編碼,它的寄存器網(wǎng)絡(luò)結(jié)構(gòu)法表示如圖1所示。
離散卷積法表示如下:
其中卷積運算用*表示, g1,g2 為脈沖沖激響應(yīng)。則如圖1中可以表示為:
3 卷積碼的譯碼
由于卷積碼自身沒有嚴格的代數(shù)結(jié)構(gòu),其譯碼過程相對復(fù)雜。目前常用的方法有兩類:
(1)代數(shù)解碼。這種解碼方式是利用編碼本身的代數(shù)結(jié)構(gòu)進行解碼,但不考慮信道的統(tǒng)計特性;(2)概率解碼。這一解碼方式則充分利用了信道的統(tǒng)計特性。目前常用的有Viterbi譯碼、最大后驗概率譯碼(MAP)以及它的改進算法Max_log_MAP等。本文采用的是Viterbi譯碼簡稱(VB)。
對于(n,k,m) 的二進制卷積碼,編碼輸入的信息序列是獨立等概率的,比較各種條件下的概率,即似然函數(shù)P(R|U(m)),選擇其中概率最大的,所得就是譯碼值,它具有最小差錯概率。其中R 是實際接收到的序列,U(m) 是可能的發(fā)送序列。當滿足P(R|U(m′)) =max P(R|U(m)) 條件時,U(m′) 就是譯碼值。
假設(shè)加性高斯白噪聲作為系統(tǒng)噪聲,同時信道是無記憶性,則卷積碼的似然函數(shù)為:
式中:Ri 是接收序列R 的第i 個分支;Ui (m) 是特定碼字U(m) 的第i 個分支;rji 是Ri 的第j 個碼元;uji (m) 是Ui (m) 的第j 個碼元,每個分支由n 個碼元組成。在工程實踐中通常用對最大似然函數(shù)取對數(shù),以加法代替乘法。對數(shù)的最大似然函數(shù)定義為:
當log P(R|U(m)) 的值最大時,譯碼成功。Viterbi譯碼利用了編碼網(wǎng)絡(luò)圖的特殊結(jié)構(gòu),降低了計算的復(fù)雜度,但它本質(zhì)上仍然是最大似然譯碼。算法實際執(zhí)行時,邊接收邊比較,同時去除不可能成為最大似然選擇對象的路徑,也就是說如果兩條路徑到達同一狀態(tài),被選中的是具有最佳量度的路徑。這一路徑稱為幸存路徑,對所有狀態(tài)進行比較、選擇,拋棄不可能的路徑,從而降低了譯碼器的復(fù)雜性。譯碼從根本上說,也就是選擇具有最小距離的碼字或最大似然量度的碼字。
4 卷積碼編碼的工程實現(xiàn)
卷積碼的編碼在工程中比較簡單,由移位寄存器和異或組成,系統(tǒng)中使用(2,1,7)編碼,實現(xiàn)原理如圖2所示。在FPGA中的仿真如圖3所示。
5 卷積碼譯碼--Viterbi 譯碼的FPGA 實現(xiàn)
Viterbi算法的基本實現(xiàn)方法如下:在不同時刻,按照最大似然準則將網(wǎng)格圖中所有的路徑進行比較,保留一條具有最大似然值的路徑(幸存路徑),同時舍棄其他路徑。每個時刻進行相同的操作,對每接收到的一段數(shù)據(jù)進行計算、比較并保存幸存路徑,最后留下的路徑就是所要求得的譯碼值。
對于卷積碼(2,1,7),其編碼的狀態(tài)數(shù)為26,所以在譯碼時,譯碼器最多需要保留26條幸存路徑,和它所對應(yīng)的路徑度量值。由于是(2,1,7)編碼每個節(jié)點將引出兩條支路,但通過比較似然函數(shù)的累加值后,可以丟棄一半的路徑,使得留存下來的路徑總數(shù)保持不變。這樣在具體實現(xiàn)時可以開辟固定大小的存儲區(qū),有利于硬件資源的估計。
在工程實現(xiàn)中采用迭代的方法,在每個時刻,對進入每個狀態(tài)的所有路徑的量度值進行比較,同時把具有最大量度值的路徑存儲下來。具體步驟如下:
(1)初始化,從時刻t = n 起,計算每個狀態(tài)的路徑和路徑度量,并存儲。
(2)在t + 1 時刻,接收新的一組數(shù)據(jù),將當前的路徑度量與前一時刻的度量相加,求得并保存最大度量并保存幸存路徑,刪除其余路徑(3)當t < L + n( L 為反饋深度)時重復(fù)步驟(2),否則結(jié)束輸出結(jié)果。
由于軟判決可以對信道噪聲進行更好的估計,因此它比硬判決有著更好的譯碼性能。因此,本文Viterbi譯碼器采用軟判決算法,同時對信號采用線性(均勻)八電平量化。其FPGA的實現(xiàn)圖如圖4所示。
6 系統(tǒng)應(yīng)用
在一般的通信系統(tǒng)中卷積編碼和Viterbi譯碼可以是連續(xù)的,但在實際系統(tǒng)的應(yīng)用中由于系統(tǒng)采用PCM分幀的模式傳送,因此卷積碼編碼和Viterbi譯碼也相應(yīng)改成按幀傳送模式。由于卷積碼的編碼是數(shù)據(jù)前后相關(guān)的一種編碼模式,在按幀發(fā)送后設(shè)編碼和解碼的初始狀態(tài)均為0,如(2,1,7)編碼舉例,從編碼的原理圖2中可以清楚的看到,在相同的信道狀態(tài)和傳輸數(shù)據(jù)一定的條件下,每一幀都將影響最后6 b 數(shù)據(jù)解碼的正確性。
為此可以有兩種解決方式:
(1)為每幀數(shù)據(jù)添加固定的6 b 數(shù)據(jù),這種做法增加了系統(tǒng)的數(shù)據(jù)冗余;
(2)編碼端不做任何處理,影響系統(tǒng)的誤碼率。
考慮到系統(tǒng)性能,由于系統(tǒng)傳輸能力還有剩余因此采用第一種處理方法。同時加入6 b 數(shù)據(jù)全部為0,這樣不僅解決了數(shù)據(jù)誤碼率的問題同時保持了解碼初始狀態(tài)的一致性,使解碼能更好的同步,有效地提高解碼的正確性。
分幀式卷積編碼及Viterbi 解碼的FPGA 實現(xiàn)的聯(lián)合仿真如圖5所示。
分幀式傳輸對系統(tǒng)的影響如圖6所示。
7 結(jié)論
在實際通信系統(tǒng)中,通過測量比較,分幀式編解碼和連續(xù)編解碼相比,在信道傳輸中對系統(tǒng)影響不大,在某些情況下分幀式編解碼甚至?xí)?yōu)于連續(xù)編解碼。