Polar码的C语言实现之比特反序重排篇

Part 1.为何要比特反序重排

对于使用软件模拟极化码的编译过程与结果,并不需要考虑比特反序重排的问题,但在数字电路实现中,为了便于LLR的取值,需要在编码之后,对比特序列进行反序重排。假如原本比特排序为(1,2,3,4,5,6,7,8),那么经过反序重排,得到的编码比特序列为(1,5,3,7,2,6,4,8)。

Part 2.比特反序重排原理

如上图所示,码长为8的比特序列编码一共进行了3次不同的异或运算(第一列->第二列,第二列->第三列,第三列->第四列),若定义码长为N,列之间的异或运算次数为n,则它们关系如下:n=log2N。根据以下公式得到反序结果:

以N=8,n=3的原序列第4位数为例,第4位数经过反序会变成第7位,转化方法如下:将4减去1,得到3,将3变成n位二进制数,即011,将该二进制数顺序反转,得到110,然后,设(1,1,0)这三位数分别为(x1,x2,x3),n=3,i=[x1*2^(n-1)+x2*2^(n-2)+x3*x^(n-3)]+1=[1*2^2+1*2^1+0*2^0]+1=7。

Part 3.代码实战

程序要求:以码长为8为例,按照1,2,3……顺序的序列进行反序重排。

输入:无。

输出:自然顺序序列与反序重排序列。

第一步:确定码长N及其以2为底的对数。

#include<stdio.h>
#include<math.h>
const int N=8;//码长(长度)
const int n=3;//码长的对数(宽度)
int c[N],d[n];//计算用的数组
inline void reverse(int t);//函数声明

注意:本程序允许按照n=log2N的规则,更改N与n的值,比如:若改为N=16,n=4,会输出16位的反序重排结果。

第二步:reverse函数功能介绍:将对应的数字取二进制数,反向排列。

注意:不必减去1,因为数字k即为数组的第k-1位

inline void reverse(int t)
	{
		int j;
	for(j=1;j<=n;j++)
		{
			d[j-1]=t%2;
			t=t/2;
		}
	}

第三步:0到N,依次给数组赋值并输出。(进入main函数)

int main(){
    int i,j,k,p;
    printf("original order:");
    for(i=0;i<N-1;i++){
    c[i]=i;
    printf("%d,",c[i]+1);
    }
    c[N-1]=N-1;
	printf("%d\n",N);

   

第四步:按照反序公式进行累加。

for(i=0;i<N;i++){
c[i]=1;//从1开始加,相当于累加结果加1	
reverse(i);
for(k=1;k<=n;k++){
c[i]=c[i]+d[k-1]*(int)pow(2,n-k);
}
}

第五步:输出反序重排结果。

	printf("reverse order :");
	for(int x=0;x<N-1;x++)printf("%d,",c[x]);
	printf("%d\n",c[N-1]);
	return 0;
}

Part 4.程序检验

同样,将码长的宏定义更改也适用。比如:

const int N=16;
const int n=4;

感谢耐心观看,如有错误,欢迎批评指正。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值