第二篇咱們來介紹一下極化碼的編碼。數組
首先爲了方便進行編碼,咱們須要進行數組的定義函數
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論文中的編碼示意圖,好像挺複雜,不過看不懂也不要緊。咱們來看一下編碼過程當中都作了哪些事。spa
首先是向量元素的翻轉,經過翻轉矩陣RN來實現,而後是信道的聯合和信道的分裂。3d
什麼?你問我爲何要這樣作?我也不知道,極化碼自己就創建在信道極化的現象之上,信道極化就是信道以特定方式聯合和分裂所產生的現象。要想問爲何這麼作,到土耳其找Arikan教授喝茶去吧。code
論文中將這個翻轉過程簡化爲矩陣運算,這就爲咱們進行程序仿真提供了方便:blog
其中:排序
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譯碼)。