m基于matlab的polar码误码率仿真,译码算法采用SC算法

发布时间 2023-05-16 23:37:04作者: 我爱C编程

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

2.算法涉及理论知识概要

 

        极化码(英语:Polar code)是一种前向错误更正编码方式,用于讯号传输。构造的核心是通过信道极化(channel polarization)处理,在编码侧采用方法使各个子信道呈现出不同的可靠性,当码长持续增加时,部分信道将趋向于容量近于1的完美信道(无误码),另一部分信道趋向于容量接近于0的纯噪声信道,选择在容量接近于1的信道上直接传输信息以逼近信道容量,是唯一能够被严格证明可以达到香农极限的方法。

        极化码(英语:Polar code)是一种前向错误更正编码方式,用于讯号传输。构造的核心是通过信道极化(channel polarization)处理,在编码侧采用方法使各个子信道呈现出不同的可靠性,当码长持续增加时,部分信道将趋向于容量近于1的完美信道(无误码),另一部分信道趋向于容量接近于0的纯噪声信道,选择在容量接近于1的信道上直接传输信息以逼近信道容量,是唯一能够被严格证明可以达到香农极限的方法。

        在解码侧,极化后的信道可用简单的逐次干扰抵消解码的方法,以较低的复杂度获得与最大似然解码相近的性能。2008年在国际信息论ISIT会议上,土耳其毕尔肯大学埃尔达尔·阿里坎(Erdal Arıkan)教授首次提出了这个信道极化的概念,基于该理论,他给出了人类已知的第一种能够被严格证明达到信道容量的信道编码方法,并命名为极化码华为2016宣布4月份率先完成中国IMT-20205G)推进组第一阶段的空口关键技术验证测试,在5G信道编码领域全部使用极化码,20161117日国际无线标准化机构3GPP87次会议在美国拉斯维加斯召开,中国华为主推PolarCode(极化码)方案,美国高通主推低密度奇偶检查码(LDPC)方案,法国主推Turbo2.0方案,最终控制信道编码由极化码胜出。

 

      Polar码的主要思想是将多个子信道合并成一个等效信道,然后将等效信道分裂成多个信道容量呈两极分化(信道容量接近0或者1)的子信道,最后将信息在信道容量接近1的无噪子信道发送信息,而在信道容量接近0的子信道上发送收发已知的比特信息,从而提高信息传输的可靠性。

       Polar码的极化过程主要由两步来完成,第一步:信道联合;第二步:信道分裂。下面对这两步进行简单介绍

 

 

 

        极化码的译码基本方法主要有:连续消除(Successive Cancellation, SC) 译 码 、 置 信 传 播 (Belief Propagation, BP) 译 码 、 线 性 规 划 (Linear Programming, LP) 译 码 、 基 于 SC 列 表 (Successive Cancellation List, SCL)译码、最大似然(Maximum Likelihood, ML)译码等。

 

 

 

 

3.MATLAB核心程序

 

n          = 7;%128
N          = 2^n;  
[Vals,Inds]= func_rates(n,0.5);
 
for i=1:length(SNR)
 
    %设置误码率参数
    Bit_err(i)    = 0; 
    Num_err       = 0; 
    %误码率累加器
    Numbers       = 0; 
    K             = round(rate*N);
    frozen_pos    = Inds(1:N-K);
    free_pos      = sort(Inds(N-K+1:N),'ascend');
    z             = ones(N,1);
    z(frozen_pos) = 0;
    sigma         = 1/sqrt(10^(SNR(i)/10));
    
    while Num_err <= LENS(i) 
          fprintf('SNR = %f\n', SNR(i));
          Num_err
          data_in     = randsrc(K,1,[0 1]);
          u           = zeros(N,1);
          u(free_pos) = data_in; 
          x           = func_encode(u);
          Trans_BPSK  = 2*x-1;
 
          Rec_sd_1               = Trans_BPSK + sigma*randn(N,1);
          Rec_sd                 = Rec_sd_1;
 
          %接收端
          y2                     = Rec_sd;
          L2                     = exp(-2*y2); 
          v2                     = func_SCdecoder(L2,z);
          data_out2              = v2(free_pos);
 
 
          nberr1      = length(find(data_out2~=data_in'));
 
          Num_err     = Num_err+nberr1;
          Numbers     = Numbers+1;
    end
    Bit_err(i) = Num_err/(length(data_in)*Numbers);
end
if rate==0.6
   save R2_6.mat SNR Bit_err   
end
if rate==0.5
   save R2_5.mat SNR Bit_err   
end
if rate==0.4
   save R2_4.mat SNR Bit_err   
end
figure;
semilogy(SNR,Bit_err,'b-o','linewidth',1);
xlabel('SNR per bit rS-D(dB)');
ylabel('Bit error rate(BER)');
grid on;