極化碼的matlab仿真(3)——SC譯碼(1)


一個好碼必須具備兩個要素:可靠、高效。

高效的碼要求碼的編譯方案都具有較低的復雜度。極化碼出現后,Arikan本人提出使用SC譯碼方案來進行譯碼操作。SC全稱successive cancellation decoder,即連續消除譯碼。SC譯碼采用蝶形算法,通過遞歸的方式進行串行解碼,其優點在於算法復雜度較低,缺點是無法進行並行解碼(並行解碼可以提高解碼速度)。對於polar code的解碼,還有幾種常用方案:BP解碼、SCL解碼、SCAN解碼等,本系列我們重點來介紹SC譯碼。

SC譯碼算法中有這樣兩個比較重要的名詞。

  • 似然值

似然值(“Likelihood Ratio”縮寫LR),其定義在Arikan論文中為:

公式乍一看很復雜,其實很好解釋,LR的值就是在接收端得到()時,發送端原本發送“0”的概率與發送“1”的概率之比。顯然,如果LR>1,意味着原本發送“0”的概率要大一點,於是我們判決這個接收端應該收到的信號為“0”,反之為“1”。

不過別忘了,在我們發送的信息之中,有一部分位是沒有信息量的即凍結位,這一部分我們假如默認全為“0”的話,那么即使似然判決結果為LR≤1,我們也強制要求它為“0”。這個判決步驟被形象的稱為“硬判決”,自然,上面的判決就稱作“軟判決”。

  • 誤碼率

經過判決之后,我們在接收端得到了一組完整的二進制數,再將這組數與原本發送的數逐個對比,如果有不一樣的位,說明我們的解碼出現了誤碼,此時我們統計出錯位數,計算BER(bit error ratio,比特誤碼率)、FER(frame error ratio,誤幀率),BLER(block error ratio,誤塊率),PER(package error ratio,包錯誤率或丟包率),這些參數是衡量一種解碼方案乃至仿真系統性能的重要指標。通過以SNR(dB)為橫坐標,上述參數為縱坐標繪制折線圖,我們可以很直觀的對比不同解碼方案的性能。

由於解碼方案的matlab實現相對來說較為復雜,因此為了方便梳理思路以及幫助大家理解,仿真過程全部以碼長為N=8為例進行解釋,不過程序的編寫過程中充分考慮了所有碼長下的情況,只需更改程序開頭預定義的N值,即可實現任意碼長的編解碼仿真。本節我們只探討第一和第二個解碼器的解碼過程,剩下的我們放到以后的各章節中解釋。

SC解碼方案中兩個核心的要素,一是遞推公式,二是蝶形算法先奉上看起來高深莫測的遞推公式和蝶形圖。

其實這個遞推公式也很好理解,比較煩的就是里面各種下標的引用。大家可以看到,公式中有一些看起來比較奇怪的參數,這里做一下說明。

比如,代表一個向量

比如,同樣表示一個向量,只不過下標(1,o)表示這個向量只包含 1~2i-1 中的奇數項(奇數,odd),同理如果是(1,e)的話,表示包含偶數項(偶數,even)。

分析這個遞推公式,它包含兩個公式。仔細觀察 L的上下標,發現第一個遞推公式用來計算 L 的奇數項,第二個公式用來計算 L 的偶數項。其實這種分類更深層次的意義在於區分蝶形算法的上下節點。為了方便表示,我們將遞推公式和蝶形圖簡化表示:

如上蝶形圖,我們在解碼的時候,是從右向左進行解碼的,在得到右邊兩個節點之后,我們才能利用Arikan遞推公式求解左邊兩個節點。其中上節點用第一個公式求解,下節點用第二個公式求解。觀察第二個公式,L1有一個指數項(1-2u),每一次計算下節點的時候都需要額外計算指數項。另外,蝶形算法有一個規律,即每一次求解蝶形上的節點時,上下兩個節點總是同時被解出。舉個栗子,以上圖為例,如果我們在求解過程中,發現 L1的似然值已經被求出來了,那么不用看我們就能肯定的說,L2一定也被解出來了。

 我們來看第一第二個節點的代碼實現。首先是預定義數組。

mem_lr = zeros(N, n+1);	% 定義似然值矩陣用於儲存所有節點的似然值,其中N=2^n;

如上圖,節點1為判決器1,節點16為判決器2。(為什么?還記得我們上一節提到的反序重排矩陣BN嗎?沒錯,最初的時候判決器的行序是u1~u8,反序重排以后,u2就放在了u5的位置上,u1則保持不變)紅線凸出的部分所經過的節點就是我們為求得u1、u2所必須求出似然值的節點。解碼從最右端開始,這個時候我們必須知道y1~y8的似然值,才能計算左邊節點的值。Arikan給出的計算公式為:

W(y|x) 為信道轉移概率,由於我們是在高斯信道下進行仿真,所以 W(y|x)服從高斯分布,其計算公式為:

上式中的均值 x 取值 1 、-1(為什么? 這個地方需要再一次溫習編碼中的一個步驟:在編碼的最后,我們對編碼矩陣對2取模,然后符號化,才與噪聲進行疊加。因此,這里其實相當於將 0 替換為 -1)。將 x=-1、x=1,帶入上式,將得到的 W 帶入似然值公式做分式運算,得到:

其中,y即為疊加噪聲后的接收端信息。由於snr=m22(信噪比定義)且 m2=1。將上式中的σ換算成SNR帶入,可以得到:

接下來的工作,先是循環求出最后一列所有節點的似然值,然后從最后一列開始倒推計算似然值,發現一個現象:計算u1用到的所有節點都位於上節點,因此只需迭代調用第一個公式就能計算出u1:

for ii=0:1:n
    if ii==0
        for j=1:2^n
            mem_lr(j,n+1)=exp(-2*encode((r_idx-1)*N+j)*snr(i)) % r_idx取值為(1:block),i用來遍歷信噪比矩陣,這兩個變量在這段程序中相當於外部變量
        end	%計算最后一列似然值
  else
    for j=1:2^(n-ii)
      mem_lr(2^ii*(j-1)+1,n+1-ii) = (mem_lr(2^ii*(j-1)+1,n-ii+2) * mem_lr(2^ii*(j-1)+1+2^(ii-1),n-ii+2) + 1) /...
        (mem_lr(2^ii*(j-1)+1,n-ii+2) + mem_lr(2^ii*(j-1)+2^(ii-1)+1,n-ii+2));					
    end   % 從最后一列循環迭代使用第一個公式倒推計算節點似然值
  end
end

 通過上面的程序可以得到u1對應節點的似然值,可以對其進行判決:

k = find(frozen_index == 1)  % 查看u1是否為凍結位
if isempty(k)      % 如果k為空矩陣,即u1不是凍結位
  if mem_lr(1,1) < 1 
    decode((r_idx-1)*N+1) = 1; % r_idx表示此時程序鎖操作的信息塊,r_idx取值:1~block,下面不再強調
  end         % 軟判決
else           % 否則,u1是信息位 
  decode((r_idx-1)*N+1) = frozen((r_idx-1)*F+k); % 硬判決
end

 u1計算完畢。

u2位於似然值矩陣第5行,且位於蝶形下節點。求解u2時,使用第二個遞推公式,需要考慮指數項。觀察上面紅線標注的蝶形圖,可以發現,用於計算u2的兩個節點在求解u1的過程中已經全部求出,因此只需調用一次遞推公式即可求出u2。這也就是為什么上面說,位於蝶形左上、左下節點的兩個節點總是同時被解出。

 關於前后級節點的下標關系:設當前節點坐標為(i,j),若當前節點未左上蝶形,則這個節點開啟的兩個節點的坐標為(i,j+1)和(i+N/2j,j+1)。若為左下節點,則這兩個節點開啟的兩個節點坐標為(i,j+1)和(i-N/2j,j+1)。由此可以知道計算u2需要哪兩個節點。根據遞推公式,計算u2的指數項為(1-2u1),代碼如下:

mem_lr(5,1) = (mem_lr(5-2^(n-1),2))^(1-2*decode((r_idx-1)*N+1))*(mem_lr(reverse_idx,2));  % 遞推公式二,計算u2的似然值

 同理,對其進行似然判決:

k = find(frozen_index == 2)  % 查看u2是否為凍結位
if isempty(k)      % 如果k為空矩陣,即u2不是凍結位
  if mem_lr(5,1) < 1 
    decode((r_idx-1)*N+2) = 1; 
  end         % 軟判決
else           % 否則,u2是信息位 
  decode((r_idx-1)*N+1) = frozen((r_idx-1)*F+k); % 硬判決
end

 經過以上步驟,我們得到了u1、u2的解碼結果,簡單的了解了SC譯碼的過程,下面來總結一下:

1、SC的譯碼分為兩部分,左上節點和左下節點,其中左下節點的求解需要預先求解指數項,這個步驟在這里不夠明顯,但是之后會占用很大的篇幅。

2、SC譯碼時左上節點和左下節點總是同時被解出。

3、SC譯碼總是先求解左上節點,再求解左下節點。左上節點的求解是一個遞推和迭代的過程。

4、判決分為似然判決和硬判決。

經過這一節的介紹,大家對SC譯碼的過程有了簡單的認識,下一節中,我們會嘗試將u1、u2的求解模式抽象為一個固定的程式並推廣到整個蝶形圖中,使得SC譯碼算法更為符合for循環結構,以便編寫形式簡潔優美的代碼。

敬請期待!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM