極化碼的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」。spa

不過別忘了,在咱們發送的信息之中,有一部分位是沒有信息量的即凍結位,這一部分咱們假如默認全爲「0」的話,那麼即便似然判決結果爲LR≤1,咱們也強制要求它爲「0」。這個判決步驟被形象的稱爲「硬判決」,天然,上面的判決就稱做「軟判決」。3d

  • 誤碼率

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

因爲解碼方案的matlab實現相對來講較爲複雜,所以爲了方便梳理思路以及幫助你們理解,仿真過程所有以碼長爲N=8爲例進行解釋,不過程序的編寫過程當中充分考慮了全部碼長下的狀況,只需更改程序開頭預約義的N值,便可實現任意碼長的編解碼仿真。本節咱們只探討第一和第二個解碼器的解碼過程,剩下的咱們放到之後的各章節中解釋。orm

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

其實這個遞推公式也很好理解,比較煩的就是裏面各類下標的引用。你們能夠看到,公式中有一些看起來比較奇怪的參數,這裏作一下說明。遞歸

好比,表明一個向量

好比,一樣表示一個向量,只不過下標(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則保持不變)紅線凸出的部分所通過的節點就是咱們爲求得u一、u2所必須求出似然值的節點。解碼從最右端開始,這個時候咱們必須知道y1~y8的似然值,才能計算左邊節點的值。Arikan給出的計算公式爲:

W(y|x) 爲信道轉移機率,因爲咱們是在高斯信道下進行仿真,因此 W(y|x)服從高斯分佈,其計算公式爲:

上式中的均值 x 取值 1 、-1(爲何? 這個地方須要再一次溫習編碼中的一個步驟:在編碼的最後,咱們對編碼矩陣對2取模,而後符號化,才與噪聲進行疊加。所以,這裏其實至關於將 0 替換爲 -1)。將 x=-一、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

 通過以上步驟,咱們獲得了u一、u2的解碼結果,簡單的瞭解了SC譯碼的過程,下面來總結一下:

一、SC的譯碼分爲兩部分,左上節點和左下節點,其中左下節點的求解須要預先求解指數項,這個步驟在這裏不夠明顯,可是以後會佔用很大的篇幅。

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

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

四、判決分爲似然判決和硬判決。

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

敬請期待!

相關文章
相關標籤/搜索