代码讲解

  • 1、前言
  • 2、代码讲解
    • 2.1 代码运行流程
    • 2.2 函数结构
    • 2.4 部分函数讲解
      • simulation.m
      • get_crc_objective.m
      • GA.m
      • polar_encoder.m
      • decoder译码
  • 3、结语

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_decoder SC译码
SCL_decoder SCL译码
CASCL_decoder CASCL译码

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、结语

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

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

  1. 关于二维码分块上色(彩色二维码)的算法研究

    原文:关于二维码分块上色(彩色二维码)的算法研究 众所周知,二维码通常是黑白的,而且是由若干个长方形或正方形小块平铺而成.但从人们的审美角度来看,常见的黑白二维码不免让人审美疲劳.本文试着从分块上色的 ...

  2. 激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解

    应用背景介绍 自主导航是机器人与自动驾驶的核心功能,而SLAM技术是实现自主导航的前提与关键.现有的机器人与自动驾驶车辆往往会安装激光雷达,相机,IMU,GPS等多种模态的传感器,而且已有许多优秀的激 ...

  3. 一篇文章搞懂柏林噪声算法,附代码讲解

    本文目的是以一种通俗简单的方式介绍Ken Perlin的改进版柏林噪声算法,讲解代码采用c#编写,开源免费使用.如果你只是想看完整代码,点击这里. 柏林噪声是一个非常强大算法,经常用于程序生成随机内容 ...

  4. 一种对不同类型齐格勒-尼科尔斯 P-I-D 控制器调谐算法研究(Matlab代码实现)

  5. ssh框架的信阳市南湾湖旅游网站的设计与开发源码+论文第三稿+ppt+代码讲解视频+安装视频+中期检查表(包安装部署,已降重

    项目名称 ssh框架的信阳市南湾湖旅游网站的设计与开发源码 下载地址 ssh框架的信阳市南湾湖旅游网站的设计与开发源码 系统说明 根据需求来分析功能模块,进一步明确所需要完成的功能明细点模块,然后连成 ...

  6. 彻底剖析激光-视觉-IMU-GPS融合SLAM算法:理论推导、代码讲解和实战

    应用背景介绍 自主导航是机器人与自动驾驶的核心功能,而SLAM技术是实现自主导航的前提与关键.现有的机器人与自动驾驶车辆往往会安装激光雷达,相机,IMU,GPS等多种模态的传感器,而且已有许多优秀的激 ...

  7. python自然语言处理实战核心技术与算法——HMM模型代码详解

    本人初学NLP,当我看着<python自然语言处理实战核心技术与算法>书上这接近200行的代码看着有点头皮发麻,于是我读了接近一天基本把每行代码的含义给读的个七七八八,考虑到可能会有人和我 ...

  8. 计算机课程设计jsp+servlet社区居民健康档案管理系统【安装调试+代码讲解+文档报告】

    大家好!我是一名Java开发攻城狮,喜欢研究代码,有不懂的地方可以咨询.源码.定制化开发.代码讲解.文档撰写.ppt制作都可以. ❤️技术选型:spring.springmvc.mybatis.mav ...

  9. 计算机配色算法代码,计算机配色理论及算法的研究

    摘要: K-M光学模型与色料加和混合模型是计算机配色理论的基础,经调研发现两者在计算机配色的应用中存在一些问题,本文以涤纶平纹织物为基材,对计算配色理论及其算法进行了系统的研究.首先,本文系统分析了K ...

  10. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

最新文章

  1. 神级开源框架发布!Github排名前三,连Spring Cloud 都被干掉了!
  2. Spark2.1.0之初识Spark
  3. 第23天 django的modal的正向反向查找 多对多查找 分组和聚合 F和Q ORM补充select_related和prefetch_related (无内容)...
  4. Python3 调用ffmpeg
  5. linux增加 路由使两个不同的网段可以访问
  6. oracle恢复drop建的表首次,案例:Oracle dul数据挖掘 没有备份情况下非常规恢复drop删除的数据表...
  7. python2.面向对象学生管理系统
  8. android gridview控件使用详解_Android开发实现自定义日历、日期选择控件
  9. 如何给python升级_python升级后,如何给virtualenv里的python进行升级
  10. mysql naivcat执行存储过程_mysql使用navicat编写调用存储过程
  11. 关于SQL的重复记录问题
  12. Clickhouse分片集群性能测试
  13. testbench简介
  14. gradle-4.10.2-all等gradle下载
  15. python制作3d相册代码_python中Matplotlib实现绘制3D图的示例代码
  16. Python-torch.optim优化算法理解之optim.Adam()
  17. 彻底弄懂GMT、UTC、时区和夏令时
  18. 警告: A docBase D:\apache-tomcat-8.5.12\webapps\webapps\projectname inside the host appBase has been
  19. 3ds Max 材质贴图
  20. 好程序员Java培训分享20个Java程序员基础题

热门文章

  1. win10家庭版升级到企业版
  2. 高一数学计算机教材,高中数学必修1教材分析
  3. web前端面试题总结
  4. centos7 部署dzzoffice最新版详细教程
  5. DirectX终极游戏开发指南引擎源码分析
  6. 爱加密加固病毒分析-破解篇
  7. 测试opencl软件,我该如何测试OpenCL的可兼容性?
  8. [JZOJ5618]【NOI2018模拟3.31】华胥梦天
  9. 3D游戏引擎技术架构设计
  10. win10系统安装软件安装和问题处理