Polar SC的C语言实现之编码篇

Part 1.Polar SC简介

       极化码(Polar Code)是一种前向错误更正的编码方式,作为目前唯一能被严格证明可以达到香农极限的方案,它被中国华为的5G方案主推,并在2016年的国际无线电标准化机构3GPP第87次会议与美国LDPC、法国Turbo 2.0方案的竞争中胜出。极化码有多种译码方式,本文讲的正是极化码家族中译码方式最简单的一个——SC。译码之前,咱先讲编码,极化码译码方式挺多,但编码方式就一种,算法以及程序实现远比译码简单。现在开始讲解吧。

Part 2.编码原理

First:编码图解析

       万事开头难,咱先上图。

 

Polar SC的C语言实现之编码篇_第1张图片

试问此图怎么看?答案只有两个字——“异或”,异或运算,即图中的“工”字形上的 “⊕”符号,被“工”字形符号连接的左端两个单元,就是“异或”的主体,经过异或运算后的结果就是“工”字形符号右端上方的单元,而“工”字形符号右端下方的单元值等于左下方的值。在此,异或运算的对象只有0与1这两个数字,原则是:1与0(0与1)异或结果为1,1与1、0与0异或结果均为0。我们也可以理解为:1和0这两个数字,相同则为0,不同则为1。(如下面两图所示)

Polar SC的C语言实现之编码篇_第2张图片Polar SC的C语言实现之编码篇_第3张图片

同理,可得下图结果:

Polar SC的C语言实现之编码篇_第4张图片

Second:固定比特与信息比特

我们传输的信息会以0和1这两种二进制比特形式,按照不同的顺序进行排列,这也在一定程度上形成了信息的多样性。那么,比特的排列有什么规则呢?

打个比方,我们的总码长为1024,那么其中信息比特与固定比特各占512位。信息比特就是我们要传输的信息,可以是0,亦可为1;而固定比特本身不传递信息,固定比特值均为0。码长也是有讲究的,一般而言,码长是2的平方数,比如2、4、16等等。固定比特与信息比特的排序是按照克罗内克积生成的,此数学问题咱不解释,我们以1024码长为例,排列顺序直接上图:

Polar SC的C语言实现之编码篇_第5张图片

至此,我们的编码原理讲解完毕。

Part 3.代码实战

程序要求:写16码长的编码程序,程序只编码一次。输出界面显示内容:原码序列和编码后序列。

资料:16码长的固定比特与信息比特排序表(固定比特用0表示,信息比特用1表示)

                   0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1

思路:

1.信息传入:在固定比特位的原b固然为0,而每个信息位的原比特可能是0或1,我们就用种子随机数进行模拟(种子随机数要加上头文件:#include以及#include),计算机会以时间为变量产生随机数,而要得到0或1的随机数,我们就可以使用“%2”取余数的方式,比如随机产生的数为99,其余数为1,随机产生的数为100,其余数为0。这样我们就可以模拟各种不同的信息传入。注意:数组元素以第0位为首位。

头文件、宏定义与全局变量部分:

#include
#include
#include
const int N=16; 
const int n=5;
int A[N][n];
int CBR[N]={0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1};//数组CBR装有16位固定比特集

main函数信息传入部分:

srand((unsigned)time(NULL));
//设定种子随机数,使随机数随时间改变 
int Vi,e,sum=0,s=0;
for(Vi=0;Vi

2.编码:我们以二维数组的进行编写(一维数组的算法将在SC控制行与L算法中讲解),按照编码原则,使用三重循环控制行和列的计算。

int h=N,y1,o;
for(y1=0;y1

        3.输出:

printf("原码序列:\n");
for(y1=0;y1

4.界面显示

Polar SC的C语言实现之编码篇_第6张图片

 

最后,感谢大家的耐心观看,如有错误,欢迎指正。编码之后的下一个步骤便是调制、加噪声,我接下来会继续介绍,欢迎关注。

你可能感兴趣的:(极化码,5G通信,极化码,C/C++语言)