夏閣淞,葛萬成
(同濟大學中德學院,上海 200092)
自從香農在1948年發(fā)表了一篇代表著現(xiàn)代信息論開篇的文章后,通信技術就在不斷快速發(fā)展。近幾年,極化碼在編解碼領域中取得了突破性進展,從而激起了極化碼理論研究的快速發(fā)展。Arikan Erdal于2008年提出極化碼,并在對稱的二進制無記憶信道及任意的連續(xù)無記憶信道中證明了極化碼相較于Turbo碼和LDPC碼更能達到香農極限,且用極化碼實現(xiàn)的通信系統(tǒng)能達到更高的通信帶寬。所以,極化碼是目前公認的“最好”的碼。目前,極化碼的譯碼實現(xiàn)方式主要有軟件和硬件兩種方式。軟件的實現(xiàn)方式因CPU串行工作模式限制了譯碼速度的提升,而FPGA因其具有快速并行計算的能力能彌補這一缺陷。此外,極化碼的遞歸結構能夠實現(xiàn)資源共享并簡化計算過程,這一特點表明極化碼易于FPGA實現(xiàn)。
目前,關于極化碼的譯碼算法主要有置信度傳播(Brief Propagation,BP)算法、最大似然比(Maximum Likelyhood,ML)算法和連續(xù)刪除(Successive Cancellation,SC)算法。這3種算法中,BP和ML算法由于在運算過程中涉及較多的乘除法運算,因此不利于FPGA實現(xiàn);而SC算法在譯碼過程中主要通過加減和位運算實現(xiàn),所以適于FPGA實現(xiàn)[1]。
Arikan Erdal給出了極化碼的一種解碼算法,即最經典的連續(xù)刪除譯碼算法。而極化碼的建立過程即對極化信道的選擇過程,實際上這種選擇是以SC譯碼算法的性能為標準的。這是由于從極化信道轉移概率式中可知,極化后的信道不是相互獨立的:后面的信號信道的譯碼取決于前面序號的信道信息。這意味著必須保障前面的結果全部正確,極化碼才能達到信道容量。但是,這要求碼長必須足夠長。
由于信道的極化過程,實際上是按照最優(yōu)的SC譯碼算法執(zhí)行的,因此對于極化碼來說,只有這一類譯碼算法才能充分利用極化碼的性能。隨后誕生了簡化的SC算法,即SSC譯碼算法。這幾種方法將極化碼的性能在延遲和正確性兩個方面得到了提高。
SC譯碼算法的輸出取決于兩部分,分別是信道現(xiàn)在的接收信號和之前所有的判決。轉移概率如下:
通過這兩個信息可以計算目前正在判決的這一位的結果。判決時,如果解碼器發(fā)現(xiàn)這一位是凍結比特,那么將直接判決為之前約定好的0或者1。如果解碼器發(fā)現(xiàn)這一位是信息比特,需要通過計算u^i=0時和u^i=1的轉移概率后得到對數(shù)似然比,最終得到判定結果。所以,從延遲上講,該算法在一個時鐘周期最多得出一位結果,解碼速度較慢。
對數(shù)似然比在通信系統(tǒng)中的作用,一般是用做軟解碼。對數(shù)似然比的定義為:
判決函數(shù)用L可以表示為:
LLR的遞歸計算可以表示為:
到了最底端即N=1時,是遞歸函數(shù)的出口,從而最終完成譯碼任務。
FFT結構的SC解碼器結構,如圖1所示。該方案具有以下優(yōu)點:由于這個結構并沒有對硬件進行復用,而是使用了較多硬件,所以簡化了控制結構,使得實現(xiàn)相對容易;不妨假設該方案不使用時鐘信號,那么可以做到在一幀的情況下,相比于使用時鐘信號控制的結構速度更快。但是,該結構也存在一些缺陷:由于該結構的硬件數(shù)量多且多數(shù)硬件是重復的,所以對硬件的利用率較低,帶來了功率上的浪費(如果采用這個結構,那么可以每一個模塊都會一直消耗功率消耗,且有相當多的功率是完全浪費的);由于沒有時鐘信號的控制,該結構對于外界的噪聲,抗干擾能力會大幅下降。如果采用D觸發(fā)器這樣的寄存器,那么只有在時鐘信號有效的時候電路才真正工作,其他時候即便有噪聲,也不會對電路結果造成影響;由于缺少控制信號,所以很難對電路的工作進度進行把控,且極化碼的工作流程是按照步驟一步一步進行的,所以更加需要控制信號的加入,如果輸入信號速度過快,超過了電路的處理速度,就會導致輸出的信號產生錯誤。針對這些缺陷,需要大幅優(yōu)化該結構。
圖1 FFT結構的SC解碼器結構
流水線的樹結構SC解碼器,如圖2所示。相比于FFT結構,它進行了一定優(yōu)化:加入了時間控制模塊。加入這個模塊后,該編碼器的過程可以實現(xiàn)控制。
圖2 流水線的樹結構SC解碼器
每經過一個時鐘周期,該結構都會計算出一個值,這個值可能是F也可能是G。計算出來后,這個值會被保存到寄存器,以便后續(xù)計算時被使用。所以,該結構使用7個寄存器來存放。因為假設碼長為1 024,那么按照這樣的結構,需要1 024個寄存器保存之前計算的結果,顯然非常浪費。為了優(yōu)化空間,本文提出的結構中復用了存儲LLR的寄存器來存儲結果,可節(jié)省空間。
使用該結構另一個優(yōu)點是,由于該結構的設計并不是針對某一種信道或一種凍結比特序列,而是對信道的類型不做限制,使得該結構具有了靈活的特性。事實上,這樣的靈活帶來的結果是對硬件的使用率不高,是該結構的兩大缺點之一。本文提出的結構將針對某種特定的信道做出優(yōu)化,大幅提高了硬件使用率。
該結構的第二個缺點是延遲高。從圖2可以看出,每經過一個時鐘周期,該結構只計算一步,且有很多不需要計算的部分。在本文提出的結構中,硬件電路會自動略過不需要計算的部分,減少了延遲。
F模塊和G模塊的輸入輸出量,分別如圖3和圖4所示。
圖3 F模塊的輸入輸出量
圖4 G模塊的輸入輸出量
F模塊有2個輸入,分別是LLR1和LLR2,也就是對數(shù)似然比,輸出是一個值,把2個輸入的符號相乘后取絕對值更小的:
G模塊則相對比較復雜,有3個輸入量,除了2個LLR之外,還需要1個之前計算的u^。計算過程也更加復雜,涉及到乘法和加法。需注意,做乘法運算時,只是和-1乘,帶來了優(yōu)化的空間。
F模塊和G模塊一一對應,然后利用多路選擇器選擇當前工作是哪一個模塊。傳統(tǒng)設計的弊端在于F和G的數(shù)量永遠相等,但是這并不是必須的。在某些特殊電路中,很有可能不需要那么多G,可能需要很多F。所以,本文提出的結構會把F和G模塊完全獨立。它們不相互影響,只在需要對方提供數(shù)據(jù)的時候才有交互[2]。
本文改進的F模塊中,對于正負符號的判斷,只提取了最高位。這是因為輸入是量化后的8位信息,其中最高位是符號位,不需要在和0去比較,提高了運算速度[3]。同時,兩個提取的符號位的乘法通過異或XOR實現(xiàn),這在電路中的復雜度會遠遠小于一個乘法器。再將異或運算的結果即符號位去和更小的絕對值做最后的運算,得到F模塊的輸出。
在G模塊中,論文采用的方法是多路選擇器。將第一個輸入信號的正負值輸入到多路選擇器中,根據(jù)第三個信號決定正負號后,將其與第二個信號求和。
F模塊和G模塊的設計思路,分別如圖5和圖6所示。
圖5 matlab中F模塊的設計思路
圖6 matlab中G模塊的設計思路
函數(shù)f和g的計算涉及了乘法和除法,在FPGA中實現(xiàn)比較復雜。因此改進最小和算法,在對數(shù)域中用等價函數(shù)來代替,等價式為:
信道的輸出和運算過程中的值都是浮點數(shù),不利于在FPGA中實現(xiàn),所以最后輸出前需要進行硬裁決。
本文對該結構進行了實現(xiàn),下面對碼長為4的結果做出詳細說明,如圖7所示。
圖7來自于testbench腳本,規(guī)定0時刻把輸入給到電路,目的是首先測試電路是否需要一個上電準備過程,其次可以第一時間得到電路的輸出。由圖7可以得知,雖然在第一時間把輸入的信號給了電路,但是電路并不能在第一時間把這個信號用來處理。這是由于在硬件內部,需要對該電壓進行保持,其次需要經過緩沖器才可以把該信號交給電路內部處理,最后得到輸出。經過測量得到,電路在第32 ns的時候準備完畢,然后進行下一步工作。
從圖8可以看出,電路的輸出信號正是符合預期地一個個相繼輸出,且結果通過和軟件仿真的對比確保了正確性。
經過測量,直到最后一個輸出結果顯示完畢,也就是電路工作完畢的時間,是45.548 ns。這意味著從電路開始工作到結束,共花費了13.548 ns。
本文提出的譯碼器結構可以根據(jù)不同的凍結比特為自動生成對應電路,具有非常好的適應性和可拓展性。在硬件使用方面,相比于傳統(tǒng)的譯碼器,硬件各個部分的使用大幅減小,包括LUT和FF。這其中的原因是該譯碼器減少了無用的F和G模塊,同時復用了寄存器[4]。
此處對于碼長為128的情況做出具體說明,如表1和表2所示。
表1 N=128時傳統(tǒng)SC譯碼器的硬件消耗
表2 N=128時本文提出的SSC譯碼器的硬件消耗,R=0.25
對比表1和表2可以看出,在核心指標LUT和FF上,SSC結構具有明顯優(yōu)勢,分別減少了63.9%和65.7%的硬件消耗,提高了性能。
本文提出的譯碼器的第二個優(yōu)點是減少了譯碼器的延遲,可以大幅改善傳統(tǒng)SC譯碼器延遲高的缺點,大大提高極化碼的競爭力。
可以看出,隨著凍結比特的比例不斷增加,SSC譯碼器的性能不斷提高。在25%的比特是凍結比特的時候,平均減小延遲55%;在50%的比特是凍結比特的時候,平均減小延遲53%;在75%的比特是凍結比特的時候,平均減小延遲62%,總平均提高57%。從圖9可以看出,在實際的FPGA上運行結果符合預期。
圖7 輸入信號的實現(xiàn)后仿真結果
圖8 輸出端的信號變化情況
圖9 在FPGA上的運行結果符合預期
本文實現(xiàn)的結構在對應的FPGA上,最短可以在時鐘周期為7.968 ns的情況下工作。下面直接對吞吐量進行計算,結果如表3所示[5]。
表3 不同碼長情況下的吞吐量
本文提出的譯碼器結構可以根據(jù)不同的凍結比特自動生成對應電路,具有非常好的適應性和可拓展性。在硬件使用方面,相比于傳統(tǒng)的譯碼器,對減小了各個部分的硬件使用,包括LUT和FF。究其原因,該譯碼器減少了無用的F和G模塊,復用了寄存器。此外,這種結構能夠減少譯碼器的延遲,可以大幅改善傳統(tǒng)SC譯碼器延遲高的缺點,大大提高了極化碼的競爭力。隨著凍結比特的比例不斷增加,譯碼器的性能不斷提高,而本文采用的Matlab腳本可以針對不同凍結比特的特點,自動生成任意碼長的對應結構,具有更高的靈活性。