📄 encoding.cpp
字号:
#include "parameter_sets.h"
const int PuncPos[15] = {17, 19, 21, 23, 25, 27, 29, 31, 18, 24, 22, 28, 30, 20, 26};
int * EncodingF(struct BasicParaS * ctrl, int * input)
{
// Declaration
int * temp1 = new int[ctrl->zfactor]; //定义数组temp1[z]
int * temp2 = new int[ctrl->numOutBits]; //temp2[输出比特长度]
int * temp3 = new int[ctrl->numInBits]; //temp3[输入比特长度],存输入数据
int * temp4 = new int[ctrl->codeN]; //temp4[码长],存编码后的数据
int i,j,k,h,m;
// Initialize temp3 of the input of encoder,初始化输入数据
for (i=0; i<ctrl->numInBits-ctrl->codeK; i++)
{ // Addded prefix if necessary,前面补0
*(temp3+i) = 0;
}
for (i=0; i<ctrl->codeK; i++)
{ // Appended input bits,补完0后加上原来的信息位
*(temp3+ctrl->numInBits-ctrl->codeK+i) = *(input+i);
}
// Initialize temp2 of the output of encoder初始化输出数据
for (i=0; i<ctrl->numInBits; i++)
{ // Appended input bits
*(temp2+i) = *(temp3+i);
}
// Initialize temp1 of the uniform matrix
for (k=0; k<ctrl->zfactor; k++)
{
*(temp1+k) = 0;
}
// The first step,
for (j=0; j<ctrl->numCols-ctrl->numRows; j++)
{
for (i=0; i<ctrl->numRows; i++)
{
if (ctrl->expandedH[i][j] >= 0)
{
h = ctrl->expandedH[i][j];
for (k=0; k<ctrl->zfactor; k++)
{
m= k + ctrl->expandedH[8][ctrl->numCols-ctrl->numRows];
m %= ctrl->zfactor;
*(temp1+m) += *(temp3+j*ctrl->zfactor+h);
*(temp1+m) %= 2;
h++;
h %= ctrl->zfactor;
}
}
}
}
for (k=0; k<ctrl->zfactor; k++)
{
*(temp2+ctrl->numInBits+k) = *(temp1+k);
*(temp1+k) = 0;
}
// The second step
for (i=1; i<ctrl->numRows; i++)
{
for (j=0; j<ctrl->numCols-ctrl->numRows+i; j++)
{
if (ctrl->expandedH[i-1][j] >= 0)
{
h = ctrl->expandedH[i-1][j];
for (k=0; k<ctrl->zfactor; k++)
{
*(temp1+k) += *(temp2+j*ctrl->zfactor+h);
*(temp1+k) %= 2;
h++;
h %= ctrl->zfactor;
}
}
}
for (k=0; k<ctrl->zfactor; k++)
{
*(temp2+ctrl->numInBits+ctrl->zfactor*i+k) = *(temp1+k);
*(temp1+k) = 0;
}
}
// The third step
for (i=0; i<ctrl->codeK; i++)
{ // systematic bits
*(temp4+i) = *(input+i);
}
for (i=0; i<ctrl->numOutBits; i++)
{
ctrl->motherCode1[i] = *(temp2+i);
ctrl->motherCode[i]=ctrl->motherCode1[i];
}
if (ctrl->codeM == ctrl->numChk)
{ // no need to punc
for (i=0; i<ctrl->codeM; i++)
{
*(temp4+ctrl->codeK+i) = ctrl->motherCode[ctrl->numInBits+i];
}
}
else
{ // punc or trunc is necessary
if (ctrl->codeK <= ctrl->codeM)
{ // r <= 1/2, trunc
for (i=0; i<ctrl->codeM; i++)
{
*(temp4+ctrl->codeK+i) = ctrl->motherCode[ctrl->codeK+i];
}
}
else
{ // r > 1/2, punc
k = (ctrl->numChk-ctrl->codeM)/ctrl->zfactor;
h = (ctrl->numChk-ctrl->codeM)%ctrl->zfactor;
if (k > 14)
exit(EXIT_FAILURE);
for (i=0; i<k; i++)
{
for (j=0; j<ctrl->zfactor; j++)
{
ctrl->motherCode[PuncPos[i]*ctrl->zfactor+j] = -1; // label the bits
}
}
for (j=0; j<h; j++)
{
ctrl->motherCode[PuncPos[k]*ctrl->zfactor+j] = -1; // label the bits
}
j = 0;
for (i=0; i<ctrl->numChk; i++)
{
if (ctrl->motherCode[ctrl->numInBits+i] >= 0)
{ // unlabeled bits
*(temp4+ctrl->codeK+j) = ctrl->motherCode[ctrl->numInBits+i];
j++;
}
}
}
}
if (ctrl->mode == 1)
{
printf("The check bits are ..\n");
k = ctrl->codeM/24;
h = ctrl->codeM%24;
for (i=0; i<k; i++)
{
for (j=0; j<24; j++)
{
printf("%2d", *(temp4+ctrl->codeK+i*24+j));
}
printf("\n");
}
for (i=0; i<h; i++)
{
printf("%2d", *(temp4+ctrl->codeK+k*24+i));
}
if (h)
{
printf("\n");
}
int *temp;
temp = new int [ctrl->numRows*ctrl->zfactor];
for ( i=0; i<ctrl->numRows*ctrl->zfactor; i++)
*(temp+i) = 8;
for(i=0; i<ctrl->numRows; i++)
{
for(j=0; j<ctrl->numCols;j++)
{
if ( ctrl->expandedH[i][j]>=0)
{
h = ctrl->expandedH[i][j];
for(k=0; k<ctrl->zfactor; k++)
{
*(temp+i*ctrl->zfactor+k) += *(temp2 + j*ctrl->zfactor +h);
*(temp+i*ctrl->zfactor+k) %= 2;
h++;
h%= ctrl->zfactor;
}
}
}
}
printf("\n");
k = ctrl->numRows*ctrl->zfactor/24;
h = ctrl->numRows*ctrl->zfactor%24;
for (i=0; i<k; i++)
{
for (j=0; j<24; j++)
{
printf("%2d", *(temp+i*24+j));
}
printf("\n");
}
for (i=0; i<h; i++)
{
printf("%2d", *(temp+k*24+i));
}
if (h)
{
printf("\n");
}
}
delete [] temp1;
delete [] temp2;
delete [] temp3;
return temp4;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -