极化码理论及算法研究后续(代码讲解)

1、前言

在之前的极化码理论及算法的系列文章发出后,2年内,不断有网友朋友在评论区留言讨论一些问题,或者私信一起讨论一些他们不懂,或者我没有写清楚的地方,这其中不乏本科毕业生,研究生,甚至一些从事通信相关工作的朋友。自己的文章能够帮助到有需要的人,这是我的初衷,也是我之后继续更新文章的动力。然而在和大家的讨论中,我确实发现文章本身还有很多不足的地;同时,之前讲完理论后匆匆结尾,系列文章断更至今,仅仅是抛代码上去,并不能真正让大家理解代码的内涵,在网友朋友的二创中,会出现很多他们根本不知道如何解决的问题,这样的问题一个两个我还可以私信帮助解决,但是鉴于这样的私信占了私聊信息的大多数,这也恰恰说明,从算法理论走到代码,中间依旧有一段不短的路需要去走,因此我决定写这篇文章,帮助大家从代码的架构层面理解十几个函数中每个函数的作用以及它们之间的调用关系,帮助大家理解代码,以及如何使用这份代码。

2、代码讲解

2.1 代码运行流程

代码运行流程
上述流程图大致描绘了代码的整体运行逻辑,由共14个函数组成,其中,simulation.m是主函数,其余13个为子函数;因此在拿到代码后,可直接运行simulation函数,可以得到如下运行结果:

Sim iteration running = 1000 //总运行次数
N = 256,K = 132,L = 16 //极化码长度,编码比特长度,CASCL译码器的列表长度
the SNR = 1.0 //高斯信道信噪比
the BLER of SC = 0.589000 //SC译码算法的误块率
the BLERs of SCL = 0.327000 //SCL译码算法的误块率
the BLERs of CA-SCL = 0.168000 //CASCL译码算法的误块率

子函数的运行都需要上一级函数传入所需的参数,因此若要单独使用子函数,需自定义输入参数后,方可正确运行;这里需要提醒的是,在自行定义输入参数时,需注意输入参数的类型,否则将会报错.

2.2 函数结构

在这里插入图片描述
以上是各个子函数之间的调用关系,建议大家在看代码时从simulation.m开始,打断点,一步步了解各个函数之间的参数传递,运行过程中的关键变量的值的变化,理论在代码中的体现等。

simulation主函数
get_crc_objective生成crc编译器
GA高斯极化码构造
polar_encoder极化码编码
SC_decoderSC译码
SCL_decoderSCL译码
CASCL_decoderCASCL译码

2.4 部分函数讲解

simulation.m

该函数是整个仿真的入口,一切前置参数的定义和计算均在代码的前半部分完成,后半部分基本就是调用子函数,得到需要的数据后,继续调用下一级子函数,最终得到仿真的结果。各位读者在进行二创的时候,可根据自己的需求编写主函数,以及其中的各个参数的定义。在我的原代码中,我通过更改crc校验位长度crc_len,极化码的长度N,高斯信道信噪比snr来判断不同参数对于译码结果的影响;单次运行可以得到每次译码的误码率;为了计算误块率,我将同一源信息比特发送max_runs次,通过统计计算,即可得到所求数据,此部分对应代码后后半部分。各位朋友还可以对译码结果做更多有价值的数据分析。

crc_len = 4;  %CRC校验位长度
n = 8;
N = 2^n; %极化码长度
R=0.5;   %码率
max_runs = 1000; %最大运行次数
msgbit_len = N*R;   %发送信息比特的长度
K = msgbit_len+crc_len; %编码位长度
snr=1;   %高斯信道信噪比
L=16;  %CASCL译码器的列表长度
[gen, det] = get_crc_objective(crc_len);%输出对应的CRC生成器与CRC校验器

主函数的代码没有过多的难点,不涉及算法层面,主要考验大家对于matlab编程的熟练程度,例如调用了matlab自带的函数,以及很多矩阵计算过程,这部分不作详细解释,有问题可以评论区留言或者自行百度。

get_crc_objective.m

该子函数由simulation调用,传入的参数是crc_len,也就是我们想构建的crc校验码的长度,而返回值为gen和det,分别为crc生成器和crc校验器。代码中为大家提供了不同校验码长度可以选择,若没有想要的长度,可自行添加,其中涉及到的参数,需要根据crc校验原理进行计算得到。

GA.m

该子函数由simulation调用,传入的参数是信噪比方差sigma和极化码的长度N,传出的参数定义为信道channels,实际为存储有llr的期望值的一维矩阵,代表各个信道。其中涉及到的算法,即是对于GA构造算法理论的代码描述;之后,使用bitrevorder函数对各个子信道进行比特翻转计算;对得到的N个子信道,我们通过排序,得到llr期望值较大的前K个子信道的索引,将其作为将来实际发送信息比特的信道,其余信道则发送冻结比特;最后,将要发送的带crc校验码的信息比特,映射至定义的子信道中,冻结比特设置为1;

polar_encoder.m

该步得到生成矩阵,并将编码后的一维极化码矩阵与生成矩阵相乘并对结果做模2运算,得到最终要发送的源信号,其中调用了子函数get_GN.m。这部分参考理论很容易理解。

decoder译码

三个译码算法,可以分别进行仿真,代码的编写过程较为复杂,这里不详细展开论述,读者只需要关注主函数在调用这三个译码子函数时,传入了什么参数,传出了什么参数,即可;

3、结语

极化码的系列文章到此应该就完结了,对于极化码,博主的知识储备有限,有时候并不能完全解答各位朋友的问题,为此先说声抱歉;而文章本身,也仅仅是为大家作为学习路上的一种参考,并不具备很强的学术性和权威性;能够在各位的学习旅途中,帮到一点点忙,博主已经十分荣幸了。未来博主还会更新其他学习类,技术类的分享帖,期待大家的继续关注和支持。

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为城w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值