如何在FPGA中實現(xiàn)Viterbi譯碼
出處:李小文,林 丹 發(fā)布于:2011-08-24 22:42:21
LTE采用下行正交頻分多址(OFDM、上行單載波頻分多址(SC-FDMA)的方式。OFDM是LTE系統(tǒng)的主要特點,其基本思想是把高速數(shù)據(jù)流分散到多個正交的子載波上傳輸,從而使子載波上的符號速率大大降低,符號持續(xù)時間大大加長,因而對時延擴展有較強的抵抗力,減小了符號間干擾的影響。在OFDM系統(tǒng)中,為了獲得正確無誤的數(shù)據(jù)傳輸,需要采用差錯控制編碼技術。卷積編碼和Viterbi譯碼就是一種有效的前向糾錯方法,它具有一定的克服突發(fā)錯誤的能力。LTE中采用Viterbi和Turbo加速器實現(xiàn)前向糾錯。
1 Viterbi算法簡介
Viterbi譯碼算法是由Viterbi于1967年提出的降低計算復雜度的算法。它是計算網(wǎng)格圖上在時刻ti到達各個狀態(tài)的路徑和接收序列之間的相似度,或者說距離,去除不可能成為似然選擇對象的網(wǎng)格上的路徑。即如果有兩條路徑到達同一狀態(tài),則具有度量的路徑被選中,稱為幸存路徑。對所有狀態(tài)都進行這樣的選路操作,譯碼器不斷在網(wǎng)格上深入,通過去除可能性的路徑實現(xiàn)判決,從而降低譯碼器的復雜性[3]。
Viterbi譯碼算法就是基于接收數(shù)據(jù)符號估計延時狀態(tài)序列,重構通過整個網(wǎng)格的路徑,實際包含度量更新和回溯過程。
2 Viterbi算法實現(xiàn)流程
Viterbi譯碼算法的實現(xiàn)流程如圖1。由圖1可以看出,Viterbi算法的主要實現(xiàn)過程可分為4大部分:分支度量計算(BMC);加比選(ACS);存儲幸存路徑存儲器(SSM);輸出判決(OD)。

3 Viterbi譯碼實現(xiàn)過程
下面以一個(2,1,2)、回溯深度為10的軟判決Viter-bi譯碼算法為例(如圖2),通過這個例子可以比較清楚地了解Viterbi實現(xiàn)的過程。

在本例中,解碼之前接收到20個編碼后的符號。在某些應用中,Viterbi譯碼根據(jù)接收到的符號逐幀進行譯碼,與鄰幀之間相互獨立,即在每個幀內進行維特比譯碼,各幀之間相互獨立。
3.1分支度量
本文按以下方法決定分支度量:
考慮接收到的編碼后的比特G0(n)G1(n)。由于這里是進行軟判決的維特比譯碼,因此在譯碼器的輸入端將編碼輸出進行3bit的量化,量化范圍為-4~3。假設這里傳送的是11,則將11量化為(-4,-4)。若傳送的為00,則量化為(3,3),即將0量化為3,1量化為-4。如圖2,在0時刻和1時刻接收到的比特為(1,1),若(G0(n)G1(n))=(0,0),則對應的分支度量為-4(1)-4(1)=-8;若(G0(n),G1(n))=(1,0),對應的分支度量為-4(-1)-4(1)=0;(G0(n),G1(n))=(1,1),則為-4(-1)-4(-1)=8。
3.2路徑度量
這里計算路徑度量使用的是歐氏距離。PM(n,i)=Σ[Sj(n)-Gj(n)]2,j∈{與輸入相關的輸出比特}
n指示時間,i指示要計算的路徑。上式可擴展為:
PM(n,i)=Σ[S2(n)-2S(n)G(n)+G2(n)]2,j∈{與輸入相關的輸出比特}
因為Sj(n)和Gj(n)在給定的符號周期內為常數(shù),在找具有路徑度量的過程中可以忽略這兩個常數(shù),因此可由下式?jīng)Q定路徑度量:
PM′(n,i)=ΣSj(n)Gj(n)
注意,上式中系數(shù)-2已被剔除,所以尋找具有路徑度量PM(n,i)的過程就轉換為尋找具有路徑度量PM′(n,i)的過程。在加比選的過程中做如下約定:凡是從上面狀態(tài)轉移過來的幸存路徑,稱之為“0”路徑,如圖3中實線所示;凡是從下面狀態(tài)轉移過來的幸存路徑,稱之為“1”路徑,如圖3中虛線所示。將這些幸存路徑分別存儲在相應的寄存器單元。

3.3幸存路徑存儲器
由以上分析可知,ACS在計算出新狀態(tài)的路徑度量的同時,也得出了到達這個狀態(tài)的轉移信息(用1bit表示),該路徑轉移信息就需要保存在幸存路徑存儲器中,這樣多個轉移信息就可以“串成”一條完整的幸存路徑。在本設計中,幸存路徑的長度L=10,所以使用4個10位的寄存器存儲幸存路徑。幸存路徑存儲模塊如圖4,每一個小方框是寄存器的一個位。對于每一個狀態(tài),由ACS模塊得到的路徑轉移信息都移入各自的幸存路徑。這樣每一條幸存路徑存儲單元就是一個長度為10的移位寄存器。

3.4回溯
本設計的回溯算法如下:
?。?)在4個狀態(tài)的路徑度量值中選取一個值;
?。?)判斷值對應的狀態(tài),作為回溯的起始狀態(tài),如果有多個,就根據(jù)狀態(tài)的編號,按從小到大的順序選取;
?。?)根據(jù)幸存路徑寄存器里存儲的值進行判斷,若是“0”,則是由上面狀態(tài)轉移過來;若為“1”,則是下面狀態(tài)轉移過來(如圖3)。根據(jù)這些信息回溯到對應的前一狀態(tài)?;厮莨?jié)點逐級前移,從與之對應的幸存路徑寄存器中獲得路徑轉移信息;
?。?)重復步驟(3),直到;
?。?)輸出譯碼結果。
從圖4可以看出整個回溯的過程,這里假設路徑度量值的是s0。圖4中的譯碼輸出比特流為0010110101。
3.5實現(xiàn)過程
從圖2可以清楚看到,對輸入的數(shù)據(jù)通過編碼器進行卷積編碼,到的輸出譯碼結果,經(jīng)歷了以下幾個過程:
?。?)對輸入的數(shù)據(jù)進行卷積編碼,編碼速率為1/2,即每輸入1個比特編碼輸出2個比特。
(2)將每次編碼輸出的2個比特量化為相應的數(shù)值,通過每一組數(shù)值計算出該組4個狀態(tài)(s0,s1,s2,s3)的分支度量值,即BM值。
?。?)進行加比選(ACS)運算,同時保存路徑信息。首先在0時刻給4個狀態(tài)(s0,s1,s2,s3)賦初始路徑向量值(PM):假如起始點為狀態(tài)s0,則狀態(tài)s0的初始路徑向量值為PM0=100(該數(shù)值根據(jù)實際的情況來定,如回溯深度和分支度量值等,以便計算),狀態(tài)s1、狀態(tài)s2、狀態(tài)s3的初始路徑向量賦值為PM1=PM2=PM3=0。
?。?)ACS過程。因為到達每一個狀態(tài)有兩條路徑(如圖3),例如到達狀態(tài)s0(00)的兩條路徑分別是s0(00)和s1(01),從中選出到達s0路徑度量值的一條路徑作為幸存路徑。如圖2,若從0時刻到1時刻:BM0=-8,BM1=0,max{PM0+BM0,PM1+BM1}=PM0+BM0=92,所以1時刻到達狀態(tài)s0的保留路徑為0時刻從狀態(tài)s0來的路徑,從而更新1時刻s0的PM0=92;同時由于1時刻到達s0的是“0”路徑,所以保存的該時刻s0的路徑信息是0(若是“1”路徑,則保存的該時刻s0的路徑信息為1)。以此類推,可求出該時刻到達狀態(tài)s1、s2、s3的幸存路徑,存儲該路徑信息,更新其路徑度量值PM。
(5)輸出判決(OD),即回溯過程,就是根據(jù)回溯深度以及ACS過程中所保存的PM值和幸存路徑信息進行相應的算法回溯出譯碼結果。
4 時序仿真結果
使用Verilog語言在ISE[5]中進行綜合和實現(xiàn),布線后的時序仿真圖如圖5。圖5為正確的維特比譯碼時序仿真圖,輸入的比特序列為一串隨機數(shù),經(jīng)過卷積編碼后輸入到Viterbi譯碼器,輸出的譯碼序列與輸入序列一致。本譯碼器實現(xiàn)了正確的譯碼功能。

5 結果分析
考慮回溯深度對譯碼錯誤性能的影響,采用軟判決譯碼,回溯深度為9、18、45,測試幀數(shù)為3000,仿真結果如圖6。從仿真結果可以看出,回溯深度對BER有影響。回溯深度越深,性能越好。

版權與免責聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關法律責任。
本網(wǎng)轉載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。
如涉及作品內容、版權等問題,請在作品發(fā)表之日起一周內與本網(wǎng)聯(lián)系,否則視為放棄相關權利。
- 什么是氫氧燃料電池,氫氧燃料電池的知識介紹2025/8/29 16:58:56
- SQL核心知識點總結2025/8/11 16:51:36
- 等電位端子箱是什么_等電位端子箱的作用2025/8/1 11:36:41
- 基于PID控制和重復控制的復合控制策略2025/7/29 16:58:24
- 什么是樹莓派?一文快速了解樹莓派基礎知識2025/6/18 16:30:52









