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

Part 1.Polar SC简介

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

Part 2.编码原理

First:编码图解析

       万事开头难,咱先上图。

 

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

同理,可得下图结果:

Second:固定比特与信息比特

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

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

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

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<time.h>以及#include<stdlib.h>),计算机会以时间为变量产生随机数,而要得到0或1的随机数,我们就可以使用“%2”取余数的方式,比如随机产生的数为99,其余数为1,随机产生的数为100,其余数为0。这样我们就可以模拟各种不同的信息传入。注意:数组元素以第0位为首位。

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

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
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<N;Vi++)
{if(CBR[Vi])A[Vi][0]=rand()%2; 
//CBR数组中非0的元素是信息比特位,在对应行产生0或1的随机数 
else A[Vi][0]=0;
//固定比特位仍然为0 
}

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

int h=N,y1,o;
for(y1=0;y1<n-1;y1++)
{
	for(o=0;o<N;o=o+(2*N)/h)
	{for(e=o;e<o+N/h;e++)
	{A[e][y1+1]=A[e][y1]^A[e+N/h][y1]?1:0;
	//^即为异或运算符号 
	 A[e+N/h][y1+1]=A[e+N/h][y1];
	}
	}
	h/=2;
}

        3.输出:

printf("原码序列:\n");
for(y1=0;y1<N;y1++)printf("%d ",A[y1][0]);
printf("\n");
printf("编码结果:\n");
for(y1=0;y1<N;y1++)printf("%d ",A[y1][n-1]);
return 0;
}

4.界面显示

 

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

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
Polar编码是一种新型的前向纠错编码,其在5G通信、卫星通信等领域具有广泛应用。下面我将分别介绍Polar编码与译码的verilog实现。 1. Polar编码 Polar编码的核心是通过矩阵变换将信息位转化为可靠性不同的编码位,从而实现前向纠错。在verilog实现中,我们可以采用递归算法实现Polar码的生成矩阵。 首先,定义Polar变换矩阵 $G_N$,其中 $N=2^n$, $n$为正整数。Polar变换矩阵的定义如下: $$ G_N=\begin{bmatrix} G_{\frac{N}{2}} & 0 \\ G_{\frac{N}{2}}\bigodot F_N & G_{\frac{N}{2}} \\ \end{bmatrix} $$ 其中, $G_{\frac{N}{2}}$表示 $N$ 为偶数时的矩阵, $F_N$为置换矩阵, $\bigodot$表示矩阵按位乘法。 递归实现Polar编码的生成矩阵的verilog代码如下: ``` module polar_encode #( parameter N = 8 ) ( input [N-1:0] data_in, output [N-1:0] code_out ); reg [N-1:0] u0, u1, u2, u3; genvar i; generate if(N == 2) begin assign code_out = data_in; end else begin polar_encode #(.N(N/2)) pe0(.data_in(data_in[0:N/2-1]), .code_out(u0)); polar_encode #(.N(N/2)) pe1(.data_in(data_in[N/2:N-1]), .code_out(u1)); for(i=0;i<N/2;i=i+1) begin u2[i] = u0[i]; u2[i+N/2] = u0[i] ^ u1[i]; u3[i] = u1[i] ^ u2[i+N/2]; u3[i+N/2] = u1[i]; end assign code_out = u2; end endgenerate endmodule ``` 2. Polar译码 Polar译码的核心是通过逐步决策的方式,将接收到的编码序列转化为信息序列。在verilog实现中,我们可以采用递归算法实现Polar码的译码。 首先,定义递归函数 $SC$,该函数的输入为接收到的编码序列 $Y$,输出为信息序列 $D$以及可靠性指标 $L$。递归函数 $SC$ 的定义如下: $$ D,L=SC(Y)=\begin{cases} \begin{bmatrix} Y_1 & Y_2 & \cdots & Y_N \end{bmatrix}, & \text{if }N=1 \\ SC(Y_{1:N/2})\bigoplus SC(Y_{N/2+1:N}), & \text{if }N>1 \end{cases} $$ 其中, $\bigoplus$表示矩阵按位异或。 递归实现Polar译码的verilog代码如下: ``` module polar_decode #( parameter N = 8 ) ( input [N-1:0] code_in, output [N-1:0] data_out ); reg [N-1:0] d0, d1; function [N-1:0] SC; input [N-1:0] Y; output [N-1:0] D; output L; reg [N-1:0] D0, D1, L0, L1; if(N == 1) begin assign D = Y; assign L = Y; end else begin D0 = SC(Y[0:N/2-1]); D1 = SC(Y[N/2:N-1]); L0 = D0 ^ D1; L1 = D1; for(i=0;i<N/2;i=i+1) begin if(L0[i] > L1[i]) begin D0[i] = ~D0[i]; L0[i] = L1[i]; end end assign D = {D0, D1}; assign L = {L0, L1}; end endfunction generate assign {data_out} = SC(code_in); endgenerate endmodule ``` 以上就是使用verilog实现Polar编码与译码的方法,通过这种方法,我们能够方便地在FPGA等硬件平台上实现Polar编码与译码,从而为5G通信、卫星通信等领域提供更好的前向纠错编码方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值