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;
感谢耐心观看,如有错误,欢迎批评指正。