精华内容
下载资源
问答
  • matlab仿真极化码编译过程,选择sc译码
  • 使用该源代码可搭配我发布的极化码系列的博客使用,内容包含极化码构造算法巴氏参数算法和GA高斯构造算法,极化码译码算法SC算法,SCL算法,CA-SCL算法。该matlab仿真代码模拟了从信源信号的构造,到编码,到发送,...
  • SC2_极化码matlab_极化码_极化码译码_极化码matlab编译代码sc译码.zip
  • SC2_极化码matlab_极化码_极化码译码_极化码matlab编译代码sc译码_源码.zip
  • 极化码的编解码Matlab代码仿真。只有在平稳信道下的sc译码仿真结果。希望能够给你提供帮助。
  • MIMOOFDM 极化码 MATLAB

    2019-03-18 15:20:05
    通信资料,MATLAB OFDM MIMO 代码。
  • 实验室资源,matlab仿真极化码编码译码过程,内容详细,包含使用说明及代码介绍。
  • 信道极化图解,信道在经过极化后,有的性能接近1,有的接近0,保证正确
  • “通道极化:一种为对称二进制输入无记忆通道构建容量实现代码的方法。” IEEE 信息论汇刊 55.7 (2009):3051-3073。 [2] Sarkis、Gabi 等。 “快速极性解码器:算法和实现。” IEEE Journal on Selected Areas in ...
  • 论文Adaptive Linear Programming Decoding of Polar的极化码化简算法复现
  • 关于极化码matlab程序包。包括3个流行信道,BEC、BSC、AWGN。
  • matlab比较简单的代码PolarCodesBeliefPropagationDecoder 极性 BP 解码器的 MATLAB ...让我们一起研究极化码。 然而,我的数学一般般。 不要问我极性代码错误指数或缩放行为。 我不知道那个......
  • 极化码译码矩阵的生成(原始矩阵!!!!!!!!)
  • 有关极化码的编码与译码原理,以及matlab仿真,一篇毕设论文,有需要的可以拿去参考
  • 极化码sc译码matlab代码 Polar-code-under-BEC-channel #MATLAB simulation for Polar code under BEC #参数设置: #N:码长 #K:信息码码长 #Rate:码率 #A:信息码位置集合 #Ac:冻结比特位置集合 #u_a:冻结比特 ...
  • 极化码matlab仿真(3)——SC译码(2)

    千次阅读 2017-08-26 16:25:23
    Arikan教授是极化码的缔造者,这篇论文发表在IEEE上,也是第一篇对极化码及相关理论进行系统而详尽阐明的权威论文。  【2】极化码编码与译码算法研究.作者 王继伟。对于很多人来说,英文文献阅读起来比较吃力,...

    ================================================

    首先自作多情的说一句——“抱歉!”

    古语“有志者、事竟成”,是说有志向的人最终都能够成事。想到这句话我很惭愧,我居然连这样一件小事都无法坚持不懈的完成,这个系列的博客我一拖再拖,一个多月里竟然再没有更新。虽然博客鲜有看客垂阅,但是这半途而废的事实却是明显的。痛定思痛,我决定老老实实更完。算是亡羊补牢,做到有始有终吧。

    ================================================

    ---内容开始--

    上一节,我们介绍了SC译码过程中的两个解码特例——u1和u2,通过这两例解码方案的介绍,我们对于利用Arikan递推公式进行串行消除解码的过程有了一个初步的认识,接下来我们的任务在于由特殊到一般,归纳出适用于所有解码器节点的解码方案,并给出相应的matlab代码。

    我们先来重新观察蝶形解码图:

    根究u1、u2的解码经验,我们可以将解码过程作如下归纳:

    ① 判断要解出的节点为上节点还是下节点,若为上节点则进行步骤②,否则进行步骤③;

    ② 根据解码图中前后节点的坐标关系,找到该节点所开启的两个节点,分别判断这两个节点是否被解出,如果未解出回到步骤①,否则直接利用上节点计算公式求得该节点似然值。

    ③ 判断相应上节点是否解出,如果未解出,执行步骤②,否则执行步骤④计算指数项;

    (根据我们多次提到的原则——左上节点和左下节点总是同时被解出,一般情况下在求解下节点的时候,相应的上节点已经解出。)

    ④ 我们先来复习一下什么是指数项

      如上图为Arikan译码递推公式。对于蝶形的左下节点的求解,在得到左上节点似然值的基础上使用第二个公式。其中,指数项为

      【关于指数项计算的专业内容,读者可参考论文《极化码编码与译码算法研究》...王继伟...第3.3.1.3节】

      这个指数项在随着迭代N-->N/2-->N/4-->...将发生变化。由于博主水平有限,无法很好的表述推导过程,这里偷个懒,直接将结论写在下面。读者如果对于结论的导出有更深入的需要,请移步上述论文相关章节。

      如上图所示为n=3,N=8时的解码图,不同的是,我们给每一个节点提供了第三个标签。(除去第一列和最后一列)将节点所在行数减一后转化为长度为n的二进制数,自第二行开始将二进制数用斜杠 ‘ / ’ 加以分割,斜杠放置位置的规律显然可见。经过这样的处理以后,我们可以观察一个非常明显的现象,观察每个斜杠后的比特,比特为0代表该节点为上节点,比特为1代表该节点为下节点。

      下面来关注指数项的求解。观察斜杠前后的比特:

    • 为了求解指数项,自左向右,我们定义操作“1”为抽取向量中的偶数位,组成长度减半的新向量;定义操作“0”为分别抽取向量中的偶数位与奇数位组成两个新向量,然后将它们按位异或,得到长度减半的新向量。(这部分会通过一个例子详细说明,看不懂不要捉急=v=)
    • 为了确定解码图中的某个节点由哪个解码器所启动,自右向左,我们定义操作“1”为向左上寻找节点;定义操作“0”为向右寻找节点。(这里我们回顾一下上一节提到的前后节点之间的关系:

       设当前节点坐标为(i,j),若当前节点未左上蝶形,则这个节点开启的两个节点的坐标为(i,j+1)和(i+N/2j,j+1)。若为左下节点,则这两个节点开启的两个节点坐标为(i,j+1)和(i-N/2j,j+1))

         因此,利用反推的道理,对于所求解的节点 (i,j) ,从斜杠处开始,自右向左,遇到比特“0”则向左寻找一位 (i,j-1),遇到比特“1”则向左上寻找 (i-N/2j,j-1)。

      下面,我们以节点26为例详细说一下。该节点的三个标签分别为“26”、,“10/1”。第一个标签指代该节点的求解顺序,第二个标签描述该节点的似然值通过计算得到,其中即为指数项。通过第三个标签,我们可以知道为什么指数项是。观察“10/1”,斜杠前有两位“10”。首先,我们来判断,节点26由哪一个节点所开启,自右向左,第一位遇到“0”,往左移动一位;第二位遇到“1”,往左上寻找。最后发现找到的是节点21,观察发现此时已经解出的解码器为。得到这一信息后,我们来求解指数项,自左向右,第一位遇到“1”,抽取偶数位组成向量(u2,u4);第二位遇到“0”,抽取奇数位——u2,偶数位——u4,按位异或——

     

      对于解码器中所有的节点,在以上办法的指导下,通过坐标变换和少量的位运算,即可在必要情况下求解相应节点的指数项。

      求得指数项之后返回文章最开始的流程之中,我们可以依次求解出解码图中所有节点的似然值,最后对解码器进行似然判决(包含硬判决与软判决)。

      判决后所得到的比特流即为原比特流在极化码系统下仿真得到的结果,通过逐位比对,统计传输前后的比特差异,我们可以得到一系列的误码指标来表征系统性能。

      我们来回顾一下本节中的重点:

      1、本节,我们旨在解决如何求解解码图中的节点似然值。

      2、我们根据似然值计算递推公式,将节点分为上节点和下节点,上节点可以直接求解,下节点需要计算指数项。

      3、通过判断前后节点坐标关系以及定义“1”、“0”两种位运算,我们实现了求解所需任意节点的指数项。

      4、通过似然判决以及统计比特误码率,我们得到了系统的仿真性能。

      由于matlab代码存在版权问题,而我又没有那么多精力再重新写一份(主要因为我太懒,抱歉了各位orz),本节没有贴代码。所涉及到的算法和理论我已经尽力阐明了,如果各位非常需要源代码,可以私信我,有必要的话,我会在征得原作者同意后,奉上原码。

      关于极化码,一些入门的论文如下:

      【1】Channel polarization: A method for constructing capacity-achieving codes for symmetric binary-input memoryless channels.作者 Erdal Arıkan。Arikan教授是极化码的缔造者,这篇论文发表在IEEE上,也是第一篇对极化码及相关理论进行系统而详尽阐明的权威论文。

      【2】极化码编码与译码算法研究.作者 王继伟。对于很多人来说,英文文献阅读起来比较吃力,好在一些质量较高的中文文献中对极化码有非常详尽的介绍,其内容之丰富,足以作为研究Arikan论文的有力辅助。

      【3】极化码的译码算法研究及其应用.作者 张亮。这是一篇博士学位论文,内容充实详尽、专业严谨,文末对于极化码存在的一些问题进行了分析和展望,很有启发性。

      这些文章在知网、万方等数据库中均可获取,在极化码的研究论文中,这三篇只是沧海一粟,还有很多国内外学者的文章值得借鉴,不再啰嗦列举。

      这是本系列的最后一篇文章。开始时雄心壮志,结束却时草草收笔,未免有些遗憾。在撰写博文的过程中,我发现了很多之前没有注意到的问题,收获不可谓不硕大。论语云,“温故而知新”,诚不我欺!

    展开全文
  • 改进的极化码译码算法研究 摘 要 极化码Polar codes 是Arkan 教授在2008 年提出的一种新型信道编码技术该 技术有较低的编译码复杂度并且是第一种在理论上被严格证明能够达到香农极限的编 码方案极化码为信道编码提供...
  • 极化码理论及算法研究5-SC算法及matlab仿真

    千次阅读 多人点赞 2021-03-15 21:01:54
    极化码译码算法——SC译码算法系列目录1、引言2、串行抵消(SC)译码算法2.1、算法介绍2.2、长度为2的极化码的SC译码过程2.2.1、数学计算过程2.2.2、译码举例 系列目录 (如要找其他内容,欢迎访问我的主页寻找) #...

    1、内容目录

    1. 开篇1-内容介绍&参考文献
    2. 概述2-什么是极化码?
    3. 原理3-Arikan原版论文学习总结
    4. 编码算法4-巴氏参数、GA算法以及matlab仿真
    5. 译码算法5-SC算法及matlab仿真
    6. 译码算法6-SCL、CA-SCL及matlab仿真

    2、引言

    上一章叙述了极化码的编码过程和针对不同信道的经典构造算法,本章对极化码的几种不同的译码算法进行详细介绍。首先介绍的是SC译码算法,该译码算法是E.Arikan针对极化码的递归编码结构所提出的,可以很好的反映编码过程,是下面几种译码的基础,需要详细介绍和研究。之后介绍目前使用范围最广的SCL译码算法,该算法原理是基于SC译码算法的,增加了译码器列表这一个参数,可以解决SC译码器的一些不足。最后介绍CA-SCL译码算法,这种算法是针对SCL译码算法,在纠错性能上的一个改进,即利用CRC辅助译码,提高对译码结果的纠错性能。接下来,就对这三种算法进行详细介绍。

    3、串行抵消(SC)译码算法

    3.1、算法介绍

    该译码算法是极化码的经典译码算法之一。对于长度为N = 2 n 2^n 2n的极化码,SC译码器接收到的信号为 y 1 N y_1^N y1N,该信号是发送端发出的经BPSK调制的信息比特,并且通过高斯信道加噪之后的信号。译码时首先利用接收信号 y 1 N y_1^N y1N译码 u 1 u_1 u1,然后再利用接收信号和 u 1 u_1 u1的译码结果(这里假设 u 1 u_1 u1译码正确)继续译码 u 2 u_2 u2,之后利用接收信号和 u 1 u_1 u1, u 2 u_2 u2,…, u i u_i ui − _- 1 _1 1 的译码结果去译码 u i u_i ui,直到译码 u N u_N uN为止。在本节中,我们先介绍长度为2的极化码的SC译码,然后推广至长度为 2 n 2^n 2n的极化码。

    3.2、长度为2的极化码的SC译码过程

    3.2.1、数学计算过程

    让我们来考虑一个联合分布Pr(u1,u2,y1,y2),这些随机变量的关系为:u1,u2是生成概率均为1/2的(0,1)变量,x1,x2表示经过极化码编码后的比特,则有如下等式:

    在这里插入图片描述
    它们经过二进制输入无记忆离散信道W的传输,分别形成接收信号y1,y2。现在想用观测值 y1,y2 估计原信息比特的值u1,u2。

    用条件概率Pr (y1y2|u1)作为判决u1的依据:如果Pr (y1y2|u1=0)≥Pr (y1y2|u1=1),则u1判决为0;反之,将u1判决为1。结合条件概率的含义,这一点十分好理解。那么如何计算该条件概率呢?
    计算过程如下:
    在这里插入图片描述
    上式中之所以得到(a)式,是因为对于任意u1,u2,Pr(u1)=0.5, Pr(u1u2)=0.25,且发送u1,u2与发送x1,x2的概率一一对应。得到等号(b)处是因为W是无记忆信道,即从信道发出x1,对应收到的信号则对应y1,同理x2与y2对应。因此可以根据以上结果,来计算该条件概率的对数似然比为:
    f运算
    上式在各个文献中常被称为 f 运算,其中L1和L2的表达式如下所示,他们分别表示接收信号y1和y2的LLR,若我们能计算得到L1和L2的值,则可以计算得到上式的对数似然比的值。如何计算呢?
    在这里插入图片描述
    二元输入AWGN信道是连续输出信道,如果使用BPSK调制,即s=1-2x,其中x∈{0,1},s∈{-1,1},s是发送的调制信号,y=s + n是接收信号,其中n是均值为0,方差为 δ 2 δ^2 δ2的高斯加性白噪声,则Pr( y i y_i yi)是均值为{-1,+1},方差为 δ 2 δ^2 δ2的函数,故 y i y_i yi的对数似然比的形式为,将该计算公式命名为 2.2.1式 :
    在这里插入图片描述
    由以上公式可得,当我们已知接收的信号以及信道的噪声方差时,便可计算每一个接收信号的对数似然比,这一点是极化码译码的起点,理解这一点很重要。
    由于f运算的计算非常复杂,同时包括指数和对数的运算,不利于硬件实现,故常常使用它的近似式,其中sign表示取符号位,将该式命名为 2.2.2式 :
    在这里插入图片描述
    到此,基本的计算公式都已经介绍完毕。下面举例来说明如何利用以上公式来进行译码。

    3.2.2、译码举例

    首先完成u1的译码:
    当我们接收到y1和y2,就结合信道噪声方差,利用2.2.1式计算y1,y2对应的对数似然比L1,L2。再把L1和L2代入2.2.2式中进行计算得到接收信号条件概率的对数似然比 。如果u1是冻结比特,直接把它判决为预设的值;否则,如果计算结果≥0,说明Pr(y1y2|u1=0)≥Pr(y1y2|u1=1),那么将u1判决为0;反之,u1判决为1。
    下面再开始判决u2的值。我们利用接收信号y1、y2与u1的值来判决u2,考虑条件概率为Pr(y1y2u1|u2),它的计算过程与计算Pr (y1y2|u1)类似,读者可自行推演,可得:
    在这里插入图片描述
    上式中代入前面判决所得到的u1的值,可求得对数似然比为,该式最后的结果在文献中被称为 g运算,该结果的推导需结合前面的推导结果才能得到正确的结果,若读者推导有困难,可私信我为你解答:
    在这里插入图片描述
    得到了该结果后,我们就可以对u2进行译码:
    在第一步中获得L1,L2,u1后,代入式g运算的式子中,得到u2对应的条件概率的对数似然比的值。若u2是冻结比特,直接把它判决为预设值;若计算结果≥0,说明 Pr(y1y2u1|u2=0)≥Pr(y1y2u1|u2=1),将u2判决为0,反之,u2判决为1。

    通过两步操作,我们已经完成了长度为2的极化码的译码工作。

    3.3、长度为 2 n 2^n 2n的极化码的SC译码过程

    通过上一章极化码的编码过程可知,长度为 2 n 2^n 2n的极化码是用n 2 n 2^n 2n − ^- 1 ^1 1个2*2的基本极化码模块按照一定规则拼凑成的,于是可得,长度为 2 n 2^n 2n的极化码的SC译码也是用n 2 n 2^n 2n − ^- 1 ^1 1个2*2基本极化码模块按照一定规则拼凑起来的。下面,以一个长度N=8的极化码为例,来进行极化码译码演示。
    (高能预警:下面的内容需要在充分理解2.2节内容的基础上再来阅读)
    例:先设置传输基本参数:AWGN信道,信噪比Eb/N0=4dB;
    码长N=8,信息比特长度K=4,码率R=K/N=0.5;
    信息位集合A={4,6,7,8},冻结比特全部取0;
    四个信息比特为(1,1,1,1),则u18=(00010111),编码后 =(01101001)。
    x18进行BPSK调制s=1-2x后得s18=(1,-1,-1,1,-1,1,1,-1)。
    调制序列通过高斯信道后得到接收序列y18=(-0.4,-0.5,-0.8,0.2,-1.3,1.2,3.3,0.7)。
    计算对数似然比 =(-2.0,-2.5,-4.0,1.0,-6.5,6.0,16.6,3.5)。
    接下来开始译码工作(所有标红的元素都是对应步骤所计算得到的结果):
    1、第一步如图所示,第4级所有元素为接收信号的LLR值,对第3级所有22模块执行f运算,得到第3级对应的LLR值。
    在这里插入图片描述
    2、第二步如图所示,对第2级前两个2
    2模块运行f函数;
    在这里插入图片描述
    3、第三步如图所示,第1级第一个22模块运行f函数,判决u1。由于u1是冻结比特,故直接判决为0。
    在这里插入图片描述
    4、第四步如图4所示,第1级第一个2
    2模块运行g函数,判决u2。由于u2是冻结比特,直接判决为0。
    在这里插入图片描述
    5、第五步如图所示,第2级前两个22模块运行g函数。
    在这里插入图片描述
    6、第六步如图所示,第1级第2个2
    2模块运行f函数,判决u3。由于u3是冻结比特,直接判决为0。
    在这里插入图片描述
    7、第七步如图所示,第1级第2个22模块运行g函数,判决u4。由于u4是信息比特,其L值为-3.5,小于零,故判决u4=1。
    在这里插入图片描述
    8、第八步如图所示,第3级所有2
    2模块运行g函数
    在这里插入图片描述
    9、第九步如图所示,第2级下两个22模块运行f函数。
    在这里插入图片描述
    10、第十步如图所示,第1级第3个2
    2模块运行f函数,判决u5。由于u5是冻结比特,故直接将其判决为0。
    在这里插入图片描述
    11、第十一步如图所示,第1级第3个模块运行g函数,判决u6。由于u6是信息比特,其对应的LLR值小于0,故判决u6=1。
    在这里插入图片描述
    12、第十二步如图所示,第2级下两个22模块运行g函数。
    在这里插入图片描述
    13、第十三步如图所示,第1级第4个2
    2模块运行f函数,判决u7。由于u7是信息比特,其对应的LLR值小于0,故u7判决为1。
    在这里插入图片描述
    14、第十四步如图所示,第1级第4个2*2模块运行g函数,判决u8。由于u8是信息比特,其对应的LLR值小于0,故u8判决为1。
    在这里插入图片描述
    通过以上十四步的SC译码步骤,我们最终获得了译码结果为(00010111),该结果与发送的信息比特是相同的,译码正确。经过该例的SC译码推算,可以获得更加一般的SC译码步骤,无非就是将上述译码表扩展为N*(log 2 _2 2⁡N+1)的一个矩阵,按照上述流程一步步推算,最终译码得出所有的结果。

    4、SC译码算法matlab仿真代码

    在这里我仅提供SC译码算法的代码,供大家理解,若要运行该函数,需要搭配极化码编码算法来使用,完整的项目代码我将会在之后上传至CSDN上。

    function polar_info_esti = SC_decoder(llr,K, frozen_bits, lambda_offset, llr_layer_vec, bit_layer_vec)
    N = length(llr);%llr refers to channel LLR.
    n = log2(N);
    P = zeros(N - 1, 1);%channel llr is not include in P.
    C = zeros(N - 1, 2);%C stores internal bit values
    polar_info_esti = zeros(K, 1);
    cnt_K = 1;
    for phi = 0 : N - 1
        switch phi
            case 0%for decoding u_1
                index_1 = lambda_offset(n);
                for beta = 0 : index_1 - 1%use llr vector
                    P(beta + index_1) =  sign(llr(beta + 1)) * sign(llr(beta + 1 + index_1)) * min(abs(llr(beta + 1)), abs(llr(beta + 1 + index_1)));
                end
                for i_layer = n - 2 : -1 : 0%use P vector
                    index_1 = lambda_offset(i_layer + 1);
                    index_2 = lambda_offset(i_layer + 2);
                    for beta = index_1 : index_2 - 1
                        P(beta) =  sign(P(beta + index_1)) * sign(P(beta + index_2)) * min(abs(P(beta + index_1)), abs(P(beta + index_2)));
                    end
                end
            case N/2%for deocding u_{N/2 + 1}
                index_1 = lambda_offset(n);
                for beta = 0 : index_1 - 1%use llr vector. g function.
                    P(beta + index_1) = (1 - 2 * C(beta + index_1, 1)) * llr(beta + 1) + llr(beta + 1 + index_1);
                end
                for i_layer = n - 2 : -1 : 0%use P vector. f function
                    index_1 = lambda_offset(i_layer + 1);
                    index_2 = lambda_offset(i_layer + 2);
                    for beta = index_1 : index_2 - 1
                        P(beta) =  sign(P(beta + index_1)) * sign(P(beta + index_2)) * min(abs(P(beta + index_1)), abs(P(beta + index_2)));
                    end
                end
            otherwise
                llr_layer = llr_layer_vec(phi + 1);
                index_1 = lambda_offset(llr_layer + 1);
                index_2 = lambda_offset(llr_layer + 2);
                for beta = index_1 : index_2 - 1%g function is first implemented.
                    P(beta) = (1 - 2 * C(beta, 1)) * P(beta + index_1) + P(beta + index_2);
                end
                for i_layer = llr_layer - 1 : -1 : 0%then f function is implemented.
                    index_1 = lambda_offset(i_layer + 1);
                    index_2 = lambda_offset(i_layer + 2);
                    for beta = index_1 : index_2 - 1
                        P(beta) =  sign(P(beta + index_1)) * sign(P(beta + index_2)) * min(abs(P(beta + index_1)), abs(P(beta + index_2)));
                    end
                end
        end
        phi_mod_2 = mod(phi, 2);
        if frozen_bits(phi + 1) == 1%frozen bit
            C(1, 1 + phi_mod_2) = 0;
        else%information bit
            C(1, 1 + phi_mod_2) = P(1) < 0;%store internal bit values
            polar_info_esti(cnt_K) = P(1) < 0;
            cnt_K = cnt_K + 1;
        end
        if phi_mod_2  == 1 && phi ~= N - 1
            bit_layer = bit_layer_vec(phi + 1);
            for i_layer = 0 : bit_layer - 1%give values to the 2nd column of C
                index_1 = lambda_offset(i_layer + 1);
                index_2 = lambda_offset(i_layer + 2);
                for beta = index_1 : index_2 - 1
                    C(beta + index_1, 2) = mod(C(beta, 1) + C(beta, 2), 2);
                    C(beta + index_2, 2) = C(beta, 2);
                end
            end
            index_1 = lambda_offset(bit_layer + 1);
            index_2 = lambda_offset(bit_layer + 2);
            for beta = index_1 : index_2 - 1%give values to the 1st column of C
                C(beta + index_1, 1) = mod(C(beta, 1) + C(beta, 2), 2);
                C(beta + index_2, 1) = C(beta, 2);
            end
        end
    end
    end
    

    当运行完整的项目代码时,将会有如下图所示效果:
    在这里插入图片描述

    5、总结

    在本节中,我们主要介绍了极化码三种常见译码算法中的最基础,也是最经典的一种译码算法—串行译码(SC)。这一节有两大难点:
    第一点是推导与理解SC译码的数学推导公式,这是该算法的基础,若大家理解并可以自己推导出文中提到的所有公式,相信对你理解后面的内容将十分有帮助。
    第二点如何将推导出的公式,应用到实际的译码过程中,长度为2的极化码译码与长度为8的极化码译码,对于其译码过程的理解难度是指数级增长的,但是如果大家跟着我的推导思路走一遍,理解我对每个环节的描述,相信到最后也不会特别的难。
    最后,给大家提供了SC译码算法的matlab仿真代码,读者可以根据前面的内容,去理解代码所表示的意思。但是,要运行该代码,还需要结合我的整个系列的文章,才能真正将该极化码编码和译码的过程演示出来。
    相信通过本节的学习,大家可以对极化码的SC译码算法过程有一个很直观的理解和认识,在下一节中,我会为各位读者介绍其余的两种极化码译码算法SCL与CA-SCL。
    欢迎大家与我进行交流,新人博主写帖子不易,如果你觉得对你有帮助,多多点赞分享关注打赏,给我更多创作动力。祝大家都能有所学,有所获,加油!

    闲言:由于去年开始工作后,比较忙碌,一直没有时间和精力去更新这个系列的帖子,停滞了大概半年左右没有更新。近期,有很多读者私信我催更,说我写的内容有帮助到他们理解极化码及其算法是怎么一回事,我十分开心,因为这就是我当初写这个系列的帖子的初衷。非常感谢大家的支持,因此我打算在工作之余忙里偷闲,继续更新这个系列的帖子,争取把这个系列完结,给大家一个交代,希望大家继续给我支持。有任何内容上的问题可以私信或者评论,我看到一定回复。

    展开全文
  • 极化码matlab仿真(2)——编码

    千次阅读 2017-07-05 12:17:00
    第二篇我们来介绍一下极化码的编码。 首先为了方便进行编码,我们需要进行数组的定义 signal = randi([0,1],1,ST); %信息位比特,随机二进制数 frozen = zeros(1,FT); %固定位比特,规定全为0 encode = zeros...

    第二篇我们来介绍一下极化码的编码。

    首先为了方便进行编码,我们需要进行数组的定义

    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译码)。

    转载于:https://www.cnblogs.com/Mr-Tiger/p/7120590.html

    展开全文
  • %初始第一个LLR的均值 for i = 1:log2(N) j = 2^(i - 1); for k = 1:j tmp = u(k); u(k) = phi_inverse(1 - (1 - phi(tmp))^2); u(k + j) = 2 * tmp; end end u = bitrevorder(u);%进行比特翻转 scatter((1:N),u...

    信道容量辨别信道可靠性:(I)

    **index=10;
    n=2.^(1:index);
    w=zeros(n(10));  %构造一个1024*1024的的空矩阵
    w(1,1)=0.5;
    for i=n
        for j=1:i/2;
            w(i,2*j-1)=w(i/2,j)^2;
             w(i,2*j)=2*w(i/2,j)-w(i/2,j)^2;
        end
    end
    scatter(1:1024,w(1024,1:1024),'b.');%绘制散点图,前一个1:1024 x的范围,w函数描绘的y,图形后面是颜色和形状
    axis([0 1024 0 1]);%axis([xmin xmax ymin ymax])
    xlabel('channel index');
    ylabel('symmetric capacity');**
    

    参考公式:
    在这里插入图片描述

    在这里插入图片描述

    巴氏参数判断信道的可靠性(Z)

    index=10;
    n=2.^(1:index);
    w=zeros(n(10));  %构造一个1024*1024的的空矩阵
    w(1,1)=0.5;
    for i=n
        for j=1:i/2;
            w(i,2*j-1)=2*w(i/2,j)-w(i/2,j)^2;
             w(i,2*j)=w(i/2,j)^2;
        end
    end
    scatter(1:1024,w(1024,1:1024),'b.');%绘制散点图
    axis([0 1024 0 1]);%axis([xmin xmax ymin ymax])
    xlabel('channel index');
    ylabel('symmetric capacity');
    

    参考公式:
    在这里插入图片描述
    仿真结果:

    在这里插入图片描述

    高斯近似:(GA)

    %GA构造算法主函数
    N=512;
    sigma=0.5;  %方差
    u = zeros(1, N);   
    u(1) = 2/sigma^2; %初始化第一个LLR的均值
    for i = 1:log2(N)
        j = 2^(i - 1);
        for k = 1:j
            tmp = u(k);
            u(k) = phi_inverse(1 - (1 - phi(tmp))^2);
            u(k + j) = 2 * tmp;
        end
    end
    u = bitrevorder(u);%进行比特翻转
    scatter((1:N),u(1:N),'.b');
    axis([0 1.1*N 0 4*N]);
    xlabel('Channel index');
    ylabel('E(LLRi)');
    
    %phi函数
    function y = phi(x)
    if (x >= 0)&&(x <= 10)
        y = exp(-0.4527*x^0.859 + 0.0218);
    else
        y = sqrt(pi/x) * exp(-x/4) * (1 - 10/7/x);
    end
    
    %phi的反函数
    function x = phi_inverse(y)
    %部分用闭合表达式,部分用数值解法,速度进一步提升!
    if (y <= 1.0221) && (y >= 0.0388)
        x = ((0.0218 - log(y))/0.4527)^(1/0.86);
    else
        x0 = 0.0388;
        x1 = x0 - (phi(x0) - y)/derivative_phi(x0);
        delta = abs(x1 - x0);
        epsilon = 1e-3;
        
        while(delta >= epsilon)
            x0 = x1;
            x1 = x1 - (phi(x1) - y)/derivative_phi(x1);
            %当x1过大,放宽epsilon
            if x1 > 1e2
                epsilon = 10;
            end       
            delta = abs(x1 - x0);
        end
        x = x1;
    end
    end
    
    %derivative_phi()函数
    function dx = derivative_phi(x)
    if (x >= 0)&&(x <= 10)
        dx = -0.4527*0.86*x^(-0.14)*phi(x);
    else
        dx = exp(-x/4)*sqrt(pi/x)*(-1/2/x*(1 - 10/7/x) - 1/4*(1 - 10/7/x) + 10/7/x/x);
    end
    end
    %这里使计算的llr均值的简易算法,降低计算复杂度。
    

    参考公式:
    phi函数:
    在这里插入图片描述
    主函数参考公式:在这里插入图片描述

    结果:
    在这里插入图片描述

    展开全文
  • 极化码,极化码原理,matlab源码.rar
  • 极化码,极化码原理,matlab源码.zip
  • 仿真极化码在不同码长下的极化效果图,包括散点图和柱状图
  • Reducedfactorgraph1_极化码_极化码化简_matlab_polar_源码
  • 实验室的极化码编码译码仿真程序,在BSC、BEC、AWGN信道条件下都有。使用密度进化法和巴氏参数估计信道,仿真性能非常好。 在Matlab下应用非常方便,支持多组仿真。配有应用说明,非常好用。希望能给大家带来帮助。
  • 目录 (如要找其他内容,欢迎访问我的主页寻找) ...#极化码概述 #极化码定义 #极化码编码 #极化码译码 #5G标准中极化码的编译码概述 #5G标准中极化码的编码 #5G标准中极化码的译码 #总结 极化码编码 ...
  • 极化码极化信道仿真,信道极化是信道合并与信道分裂两种信道操作的结果。在上述两种操作下,原本相同的N个W信道产生了极化现象,其中一部分信道的信道容量趋近于1,另一部分信道的信道容量趋近于0。
  • 极化码信道极化仿真

    2019-01-18 15:30:40
    根据Arikan的论文自己编写的信道极化的仿真matlab程序。。
  • 极化码matlab仿真(4)——SC译码(2)

    千次阅读 2017-08-25 21:38:00
    Arikan教授是极化码的缔造者,这篇论文发表在IEEE上,也是第一篇对极化码及相关理论进行系统而详尽阐明的权威论文。  【2】极化码编码与译码算法研究.作者 王继伟。对于很多人来说,英文文献阅读起来比较吃力,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,563
精华内容 1,025
关键字:

极化码matlab

matlab 订阅