極化碼的matlab仿真(2)——編碼


第二篇我們來介紹一下極化碼的編碼。

首先為了方便進行編碼,我們需要進行數組的定義

signal = randi([0,1],1,ST);       %信息位比特,隨機二進制數
frozen = zeros(1,FT);             %固定位比特,規定全為0
encode = zeros(1,N * block);      %編碼后的比特
noise = snr(i) ^ 1/2 * randn(1,N * block);  %加性高斯白噪聲

極化碼的編碼重點在於生成矩陣的產生,以及信息位、凍結位的選取。

  • 我們先來看生成矩陣的產生。

這是Arikan論文中的編碼示意圖,好像挺復雜,不過看不懂也沒關系。我們來看一下編碼過程中都做了哪些事。

首先是向量元素的翻轉,通過翻轉矩陣RN來實現,然后是信道的聯合和信道的分裂。

什么?你問我為什么要這樣做?我也不知道,極化碼本身就建立在信道極化的現象之上,信道極化就是信道以特定方式聯合和分裂所產生的現象。要想問為什么這么做,到土耳其找Arikan教授喝茶去吧。

論文中將這個翻轉過程簡化為矩陣運算,這就為我們進行程序仿真提供了方便:

其中:

BN 為排序矩陣,以N=8為例,解釋它的作用:

傳化過程為:%將向量下標減一后,轉化為二進制數%----%將得到的二進制數反序排列%----%將反序后的二進制數轉化為十進制數,加一%

例:

我們通過 BN 的遞推式可以求得 BN再將其與 F n 次克勞尼克積相乘,就能夠得到生成矩陣。

這樣說你明白了嗎?什么?沒有???

不錯,說明你是個正常人。實際編碼的時候,如果真的在matlab中將上述過程模擬一遍來求生成矩陣的話,是非常耗時耗力的。我們還有另外一條路可以走——找規律。

上式為 GN 的原始求解方法,其中 I 為單位矩陣,F 定義為[1 0; 1 1],RN 為翻轉矩陣,對於 ,有:

N=4:

N=8:

可以發現 A 的元素排列十分有規律。前 N/2 列元素總是奇偶成對出現“1”,后 N/2 元素僅出現在偶數位,且與同處在一行的前一個“1”保持固定距離。根據此規律編寫程序如下:

for i = 1 : N/2
    A(2 * i - 1, i) = 1;
    A(2 * i, i) = 1;
    A(2 * i, N / 2 + i) = 1;
end

遞歸部分:

G = A * kron(eye(2),Gpre);    %Gpre即上一層遞歸所得生成矩陣
Gpre = G;

如果將生成矩陣的產生編寫為一個函數,則代碼如下:

function GN = G(n)
    N = 2 ^ n;    
    Gpre = 1;
    for i=1:n       %每一層遞歸都相當於計算一個新的生成矩陣
        Ni = 2 ^ i;    %這個新的生成矩陣的維度為 Ni/2
        G = zeros(Ni);
        %Fn = zeros(Ni);
        A = zeros(Ni);
        for j = 1 : Ni / 2
            A(2 * j - 1 , j) = 1;
            A(2 * j , j) = 1;
            A(2 * j , Ni / 2 + j) = 1;
        end
        G = A*kron(eye(2),Gpre);
        Gpre = G;
    end
    GN = G;
end
  •  其次,來看信息位與凍結位的選取

信道極化過程中,有一部分信道的信道容量 I(W) 可以到達1,另一部分則趨近於0。信道容量反映了信道無失真傳輸的最大信息率,我們可以通過計算聯合、分裂后各信道的信道容量並對它們進行排序,然后根據碼率,選擇排序靠前的信道作為信息傳輸的信道,剩余的信道用來傳輸凍結位。

另一種方法是計算巴氏參數Z(W),對於一個給定信道,巴氏參數越大說明該信道越不可靠。因此我們只需計算出聯合、分裂后信道的巴氏參數,並對它們進行排序,然后根據碼率選擇巴氏參數較小的信道作為信息位,剩余信道作為凍結位。Arikan論文中給出了巴氏參數的遞歸求解辦法,這使得我們能夠很方便的通過matlab實現信息位的選取。

% 將巴氏參數計算過程封裝在函數B_para之中方便調用,Z為數組,作為實參傳遞進來。數組中只有第一個元素。
% Z第一個元素可以通過計算得到,計算公式為Z(1) = 2*(p*(1-p))^0.5;
function y = B_para(Z)
for i = 1 : log2(N)         %迭代次數,N為碼長
    Z_pre = Z;              %z_pre為上一層信道巴氏參數
    for j = 1 : 2^(i-1)     %本層運算使用的下標
        Z(2*j-1) = 2*Z_pre(j) - Z_pre(j)^2;
        Z(2*j) = Z_pre(j)^2;    %遞推公式
    end
end  
y = z;    % y作為實參從函數中傳遞出去,y就是最終的巴氏參數

 

 得到巴氏參數序列后,下面的操作就是將此序列進行排序,並根據碼率確定信息位和固定位。

[Z_in_order,index] = sort( y );            %將巴氏參數從小到大排列
signal_index = sort( index( 1:S ) );      %前S位作為信息位
frozen_index = sort( index( s+1:end ) );    %后面的作為凍結位

 得到了生成矩陣,確定了信息位凍結位,下面要做的就是進行編碼。

for j=1:block    %對每一個碼塊都要進行編碼處理
    encoded(1,((j-1)*N+1):(j*N)) = signal(((j-1)*S+1):(j*S))*G(signal_index,:) + frozen(((j-1)*F+1):(j*F))*G(frozen_index,:);
end                  %進行編碼
encode = mod(encode,2);		 %對2取模
encode = 2 * encode - 1;       %符號化
encode = encode + noise;	  %疊加噪聲

數組 encode 就是我們得到的編碼矩陣。

 編碼matlab實現就是這樣,為了照顧和知識點講解同步,各個部分代碼並未進行完整、嚴謹的書寫。本系列最后我會整合與各章節中分散的代碼,為大家帶來可運行的代碼,並將M文件附在文后。敬請期待。

下一節我們要探討的是polar code中非常重要的譯碼部分——連續消除譯碼(SC譯碼)。


免責聲明!

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



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