方家鑫,劉純武,黃芝平
(國防科技大學智能科學學院,湖南 長沙 410000)
極化碼作為一種新型的編碼方式,被Arika[1]提出并證明在二進制對稱無記憶信道中,極化碼相較于turbo 碼和LDPC 碼更能達到香農極限,理論上是“最優編碼”。近年更是被新興的5G 納入其中作為控制信道編碼方式,從而吸引了很多學者的關注研究,獲得了快速發展。
當前,極化碼的譯碼方式主要有軟件和硬件兩種途徑,但是在軟件上由于CPU 是采用串行方式工作的,從而對快速譯碼帶來了極大的制約,而FPGA 由于其具有高速并行計算的特點剛好適用于此。此外,極化碼譯碼本身是采用遞歸方式進行的,因此在FPGA 里能夠實現資源共享,易于實現。
目前,極化碼的譯碼算法主要可以分為兩大類。第一類是SC 譯碼算法以及基于SC 譯碼算法的改進算法[2-7],主要代表是SCL(Successive Cancellation List,列表連續抵消算法)譯碼算法,SCL 算法中保留了串行譯碼的特性,在譯碼每個信息比特時允許同時保留多個候選路徑,通過降低正確路徑丟失的概率來改善譯碼性能。第二類是信息傳播算法,將編碼領域中的經典算法,如MPA(Message Propagation Algorithm,消息傳播算法)應用于polar 碼譯碼。但是在這些常見算法中,許多算法如BP 和ML 譯碼算法由于運算過程中涉及大量的乘除運算,不利于硬件實現。相較之下,SC 譯碼器和基于SC 的SCL 譯碼器當中的“蝶形運算”單元存在非常簡單的實現方式,簡化后的運算只涉及取符號運算,取最小值運算和加法運算,不含任何乘除法運算,非常適合芯片實現。最后,由于SC 譯碼算法固有的誤差傳播現象,前序信息比特的錯誤會嚴重影響后序信息比特的譯碼,這將嚴重影響譯碼的性能表現,因此采用基于SC 算法的新型譯碼方式——SCL,該算法旨在通過引入路徑度量值,獲得L個譯碼序列來進行選擇,避免SC 那樣局限于單一序列的估計,從而提高譯碼性能。但是由于SCL 譯碼器本質上可以認為由L個SC 譯碼器組成,使得其在存儲空間、功耗、譯碼復雜度、時延方面都大大增加。
基于極化碼在FPGA 中易于實現的優點和SCL 算法的優越性,本文的主要工作為運用SCL 譯碼算法,在FPGA 中實現極化碼譯碼器并在運行效率和占用資源等方面有所提升。
極化碼的基本思想是通過信道極化,使用“好”的信道傳輸信息比特,而在“差”的信道上放置編譯碼雙方都已知的固定比特即凍結比特,通常設置為0。對于一個(N,K)極化碼,N代表碼長,K代表信息比特數,其編碼方式為:


圖1 N=4、L=2時的SCL譯碼路徑示意圖

其中,α,β代表上一層的對數似然比值,u代表與當前譯碼位相關的已譯碼比特,sgn為符號函數。
采用樹形流水線結構后[8-9],PE(Processing Element,處理單元)電路成為譯碼器的重要組成部分[10],對PE 的改進優化將對整個硬件電路產生極大的影響。常規的PE單元主要包含f節點模塊和g節點模塊。在f節點模塊中包含一個異或單元、一個絕對值比較單元與一個選擇器單元。而g模塊則較之更加復雜,首先將輸入的對數似然比值轉換成補碼形式,再將轉換成的補碼輸入加法器和減法器,生成帶符號位的數值,g模塊的輸出值由已譯碼的部分和作為控制選擇輸出,最后通過一個2 輸入選擇器決定是輸出f模塊的結果還是g模塊的結果。由此可見,f節點和g節點計算相對獨立,整體計算效率較低。為改善此問題,將f節點和g節點關聯起來進行計算。對g節點中加法器和減法器運算進行分析,發現sgn(α+β)⊕sgn(β-α)與sgn(β2-α2) 符號一致,而sgn(β2-α2) 正 好對應判斷α,β的絕對值相對大小。故可以將g節點中加法器和減法器的結果取符號位進行異或操作,作為f節點絕對值輸出的控制端。則此時f節點中2 輸入數據選擇器的輸出m為:


圖2 改進后的PE單元結構
此外,由于在對譯碼器進行譯碼時,每層的f與g節點的相關計算數值都需要保存下來參與到下一層的計算,因此,這些數據的大小將會影響存儲空間資源,故在整個譯碼器的計算過程中,對存儲的似然比值進行量化,縮小數值大小,進而降低硬件資源消耗。這樣雖然PE 中涉及的加減運算可能會影響存儲所需寬度,但經過量化縮小即可不引入更多消耗,且由于與譯碼判決相關的是判決層的數值符號,并不受絕對大小影響,因此并不會影響判決結果。
在本文的SCL 譯碼器實現過程中,采用的FPGA 芯片是Xilinx 公司Virtex-7 系列的xc7vx485tffg1157-2。在硬件驗證過程中,考慮到FPGA 開發板存儲資源有限,在PC 端完成了極化碼的編碼與信道加擾,然后將接收端得到的信道LLR 量化后傳送給FPGA,FPGA 接收到譯碼信息后開始進行譯碼工作。
首先,為了綜合考慮譯碼誤碼性能與譯碼復雜度,需要選取合適的路徑數即列表寬度L,在MATLAB 中進行了仿真,結果如圖3 所示:

圖3 SCL算法L取值不同的誤比特率
從圖3 可以明顯看到,列表寬度L為1 時性能較差,隨著列表寬度的增加,誤碼性能越來越好,但是從圖中可以看到L為4 與L為8 的結果相差很小,考慮到實現的復雜度,選擇列表寬度為4。接著驗證譯碼器的正確性進行,碼字經過polar 編碼器進行編碼,經過調制,信道傳輸后,在接收端收到對應的LLR 值,按照譯碼器設計對這些LLR 值進行處理,通過VIVADO 自帶仿真軟件modelsim 對譯碼器進行硬件仿真,然后使用在線邏輯分析儀去抓取在FPGA 上的譯碼結果。
如圖4 所示,上面的圖為碼長1 024,碼率0.5 的極化碼采用SCL 譯碼在modelsim 中的部分仿真結果,data表示譯碼輸出結果。下面的圖為在開發板上用邏輯分析儀抓取的FPGA 運行結果波形圖,對應實際譯碼結果,跟源碼比較,得出本次譯碼結果正確。

圖4 N=1 024時的運行結果
使用Vivado 2017 進行綜合,在綜合報告里可以查看所消耗的資源,如表1 所示:

表1 編碼長度為1 024的綜合資源結果
對于譯碼器的硬件設計來說,譯碼器的糾錯能力和吞吐率是評價其性能的兩大重要指標。其中吞吐率的定義為:

其中,N代表碼長,fmax表示譯碼的最高時鐘頻率,tc表示譯碼所需的時鐘周期數,吞吐率計算結果為39.5 Mbit/s。對不同碼長的polar 碼在FPGA 上進行測試,優化后的SCL譯碼器和常規的SCL 譯碼器相比,占用的硬件資源減少了30%以上,譯碼的最高頻率提高了20%左右。對于譯碼器的糾錯能力,將回傳的譯碼結果與原碼進行比對,得到經過量化操作后硬件譯碼的誤碼率,如圖5 所示:

圖5 量化操作后的硬件譯碼誤碼率
可以看到,譯碼器在保證譯碼高效的情況下,譯碼的誤碼水平與仿真結果接近,譯碼性能良好。
如今極化碼的相關理論研究日益增多,但是在硬件平臺中實現的較少,還有很大的提升空間。基于此本文采用極化碼的SCL 譯碼算法,對其FPGA 硬件實現進行一定改進優化,最后在開發板上進行實現。測試結果表明改進之后的譯碼器在資源消耗、吞吐率方面有了一定提升,具有很強的工程實用性。