Turbo碼自1993年問世以來,以其出色的性能,在工業(yè)和科研領(lǐng)域都引起了廣泛的關(guān)注。Turbo碼性能逼近(信噪比差為0.7dB或更。┯蒀laude E. Shannon確定的信道容限。Berrou、Glavieux和Thitimajshima最先提出了Turbo碼,其結(jié)構(gòu)由兩個并行級聯(lián)卷積編碼器組成。Turbo碼編碼方案產(chǎn)生同一信息序列的兩個不同交織形式的分量碼。解碼時,由兩個MAP解碼器以迭代方式對判決結(jié)果進(jìn)行解碼。MAP 解碼算法利用接收數(shù)據(jù)和校驗(yàn)符號(以真實(shí)和交織形式的數(shù)據(jù)計(jì)算而來的校驗(yàn)位),以及其他的解碼軟輸出(外部的)信息,得到更加可靠的判決結(jié)果。 本文將討論在ADI Blackfin通用定點(diǎn)DSP處理器上如何高效實(shí)現(xiàn)Turbo MAP 解碼器的技術(shù)。 TURBO解碼器 在Turbo解碼過程中,MAP算法被用于確定最接近傳輸數(shù)據(jù)的信息位。MAP算法先對每個傳送的數(shù)據(jù)位計(jì)算一個后驗(yàn)概率值(APPs),然后根據(jù)最大的后驗(yàn)概率值為該數(shù)據(jù)位分配一個判決值,再進(jìn)行解碼。MAP 算法使用后驗(yàn)概率值A(chǔ)PP計(jì)算每一個傳送位Cn的最大似然比LLR,使誤碼率(BER)最小,其計(jì)算公式如下: (1) 其中,Y1N=[y1,y2,…,yN]。 譯出的信息位通過以下硬判決得到: 在UMTS Turbo解碼器中,應(yīng)用一個八狀態(tài)的RSC編碼網(wǎng)格,在n時刻,當(dāng)輸入序列為Y1N時,比特“1”和比特“0”的APP可分別由式(2)和式(3)求得。 (3) 其中,分別是的對數(shù), 是在n時刻和狀態(tài)m下的前向狀態(tài)度量, 是n時刻和狀態(tài)m下的分支度量,是n+1時刻和狀態(tài)k下的反向狀態(tài)度量。每級中,只需要兩個(當(dāng)采用BPSK調(diào)制來傳輸數(shù)據(jù)比特流時)分支度量,而這些分支度量值可以由解碼輸入和另一個解碼器的中間軟輸出計(jì)算得到。 式(4)中,前向狀態(tài)度量根據(jù)編碼器狀態(tài)(對應(yīng)于每級或時刻n)的網(wǎng)格表示從n=0時刻進(jìn)行遞歸計(jì)算(由于在對數(shù)域內(nèi),采用累加)得到,這里假定的初值為,當(dāng)1≤k≤2M-1時,。其中,M是編碼生成多項(xiàng)式(1+D2+D3)的冪。類似的,式(5)中的反向狀態(tài)度量從網(wǎng)格級n=N+1開始進(jìn)行遞歸計(jì)算得到,同樣假定的初始狀態(tài)為和,其中1≤k≤2M-1。狀態(tài)度量和的遞歸算法如下。 (4) (5) 其中,b(i,m)和f(i,m)分別是與第n級的狀態(tài)m相關(guān)的第n-1級和第n+1級狀態(tài)值。在α,β和LLR的計(jì)算中,我們必須解一個形如ez=ex+ey的方程。其和的近似值可由ex=emax(x,y)(1+e-|x-y|)或z=max(x,y)+ln(1+e-|x-y|)= max*(x, y)計(jì)算得到。該算子被稱為Log-MAP算子。修正項(xiàng)ln(1+e-|x-y|) 是一個非線性函數(shù),它對MAP解碼器在低信噪比下的性能增益帶來最高0.5dB的提高。如果我們忽略了這個修正項(xiàng),算子z=max(x,y)則被稱為Max-Log-MAP算子。本文只考慮Turbo MAP解碼器實(shí)現(xiàn)中的Max-Log-MAP算子。 TURBO解碼器的實(shí)現(xiàn) Turbo解碼器由兩個MAP解碼器組成,這兩個解碼器由一個交織器和解交織器分隔開。由于篇幅有限,我們將不討論Turbo解碼器的完全實(shí)現(xiàn)而只討論性能敏感度最高的“度量計(jì)算”部分。 1度量計(jì)算 式(1)中LLR的值由APP求得,而APP則由式(2)和式(3)計(jì)算得到。在計(jì)算APP時,我們要用到第n級所有狀態(tài)下的α (前向狀態(tài)度量),β(后向狀態(tài)度量)和γ(分支度量)。在第n級,γ值根據(jù)已接收到的信息和第n級的外部信息計(jì)算得到,而α用第n-1級的α和第n級的γ計(jì)算得到,β則由第n+1級的β和第n級的γ計(jì)算得到。換句話說,為了計(jì)算第n級的LLR值,我們要同時利用由前n級計(jì)算出的α值和由后N-n級計(jì)算出的β值,如圖1所示。 圖1 第n級LLR的計(jì)算圖解 2 基于窗口的算法實(shí)現(xiàn) 如圖1所示,Turbo解碼器工作于符號長度為N的序列或結(jié)構(gòu)上。因此,Turbo解碼器的實(shí)現(xiàn)就需要一個超大容量的存儲器(用來存儲所有N級的α、β、γ、LLR、外部信息、接收序列、緩存等等),但是可以通過加窗的方法降低對存儲容量的要求;诩哟翱诘姆椒ň褪菍⒄麄數(shù)據(jù)結(jié)構(gòu)分成一些小的數(shù)據(jù)塊或數(shù)據(jù)窗(有6K級窗口的重疊,K=M+1,是編碼器的約束長度),每次只在一個窗口上執(zhí)行解碼操作。在 MAP 解碼中,三個主要的算子是α估計(jì),β估計(jì)和LLR估計(jì)。在計(jì)算當(dāng)前窗的β和LLR的同時,計(jì)算下一個窗中的α,這樣就可以平衡ALU和DAG(加載/存儲)單元對帶寬的需求,如圖2所示。 圖 2 基于窗口的Turbo解碼器的高效實(shí)現(xiàn) BLACKFIN處理器上MAP解碼器度量計(jì)算實(shí)現(xiàn) 在這一部分,將討論Turbo MAP解碼器中復(fù)雜的度量計(jì)算如何在ADI Blackfin處理器上實(shí)現(xiàn),并充分利用Blackfin處理器提供的專用特性高效實(shí)現(xiàn)Turbo解碼器。 1 狀態(tài)度量計(jì)算實(shí)現(xiàn) 圖3 第n+1級和第n級計(jì)算的蝶形算法 狀態(tài)度量α和β可由式(4)和式(5)求得,該狀態(tài)度量的計(jì)算可用圖3所示的方法得以實(shí)現(xiàn)。α由正向(從左到右)計(jì)算得到,而β則由反向(從右到左)計(jì)算得到。圖中,實(shí)線和虛線分別對應(yīng)于輸入“1”和“0”的編碼。雖然通過分支度量(γ),可以由兩個輸入狀態(tài)度量計(jì)算出兩個輸出狀態(tài)度量(α和β),但這兩個度量的輸出狀態(tài)卻根據(jù)它們各自的輸入狀態(tài)而有所不同。在執(zhí)行過程中,這一輸入和輸出狀態(tài)度量的位置改變,在將數(shù)據(jù)從ALU寄存器存入存儲器和將數(shù)據(jù)從存儲器載入ALU寄存器時,可以通過加載/存儲(DAG)模塊解決。 圖4 UMTS Turbo解碼器狀態(tài)度量估計(jì)的高效實(shí)現(xiàn) UMTS Turbo解碼過程中,α和β計(jì)算在Blackfin處理器上的高效實(shí)現(xiàn)如圖4。由于Blackfin處理器能以向量模式運(yùn)行,在單個指令周期執(zhí)行四個16位加/減操作或兩個16位求最大值操作,每一級α的計(jì)算需要8個循環(huán)周期來完成,而每一級β的計(jì)算則需要另外8個周期來完成。 2 LLR的實(shí)現(xiàn) 對于UMTS Turbo解碼器,MAP算法的LLR可由式(1),式(2)和式(3)計(jì)算得到。式(2)和式(3)分別說明了通過α、γ和β來計(jì)算位“1”和位“0”的APP值的關(guān)系。這些MAP LLR的關(guān)系如圖5(a)和圖5(b)所示。 圖5(a) 位“1”的 MAP關(guān)系,(b)位“0”的MAP關(guān)系 對于兩個相同的輸入和輸出,位“1”和位“0”的MAP關(guān)系并不相似(極少情況下狀態(tài)被交換),而這類不對稱流程使我們無法利用Blackfin中計(jì)算單元和加載/存儲單元的最大帶寬。例如,圖5(a)和圖5(b)中標(biāo)示的部分,我們考慮與式(2)和式(3)的前兩項(xiàng)相對應(yīng)的頂端蝶形運(yùn)算。 圖6 在Blackfin ALU上的LLR計(jì)算 由于Blackfin只需要三個周期就能完成四個16位加法和兩個16位求最大值操作,要平衡加載/存儲(DAG)單元的帶寬和計(jì)算單元,只能用三個周期來加載數(shù)據(jù)。假設(shè)三個寄存器在三個周期中分別加載了α0|α0, α1|α1和 β4|β0,如圖6所示。那么通過16位加法操作,我們可以在兩個周期中計(jì)算出α0+β4|α0+β0和α1+β4|α1+β0。但是,MAX 操作要求仿照式(3)從反方向由α1+β0|α1+β4求得輸出的第二項(xiàng)。Blackfin的16位加法指令所支持的交叉選項(xiàng)(CO)選項(xiàng)可用來換回加法的中間輸出,如圖6所示。如果沒有交叉選項(xiàng)(CO),我們將耗費(fèi)四個周期來計(jì)算四次加法,而不是兩個。采用(CO)選項(xiàng)換回之后,執(zhí)行最大向量操作(一個周期)即可得到兩個Log-Max 輸出。這一部分程序代碼如圖7所示。有了(CO)選項(xiàng),就可以在18個Blackfin指令周期內(nèi)計(jì)算某一級上的LLR值。 圖7 利用BF5xx處理器交叉選項(xiàng)(CO)的LLR高效實(shí)現(xiàn) 總結(jié) 本文介紹了在ADI BF5xx處理器上Turbo MAP解碼器的高效實(shí)現(xiàn),詳細(xì)說明了基于窗口的存儲空間降低方法,并利用16位加/減和16位求最大值向量指令以及交叉選項(xiàng)(CO),高效地在Blackfin嵌入式處理器上實(shí)現(xiàn)了Turbo MAP解碼。該方法耗費(fèi)大約36個BF5xx周期,即可計(jì)算得到一個LLR輸出。同時,利用約50kB的BF5xx存儲空間,完成了UMTS Turbo MAP解碼算法的數(shù)據(jù)和程序存儲。 |