⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encoding.cpp

📁 这是校验位打孔重传的源程序
💻 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 + -