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

📄 parallel decoder.cpp

📁 该代码是802.3ap推荐代码fir吗(42,33)的编码器和解码器,该代码采用C语言实现,可以完成译码功能,该代码采用并行编译码方式实现,可以应用于100G以太网的FEC
💻 CPP
字号:
/**********************************************************************************************
*This programme is decoder of fire code of (42,33).                                           *
*Decoding method consult to the paper "Parallel Decoding Cyclic Brust Error Correcting Codes".*
*generate ploy is g(x)=(1+x^6)(1+x+x^3).                                                      *
***********************************************************************************************/
#include<iostream.h>
void main()
{
	/*******************************************************************
	The fuction of this part is calculating canpainion polynomial s(x).
	********************************************************************/
	//received data
	//int signal_in[42]={1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,0};
	//int signal_in[42]={1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,0};
	int signal_in[42]={1,0,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,0,1,0,0,0,1,1,0,1,1,1};
	int now_state[9]={0};//the now state of register
	int next_state[9]={0};//the next state of register
	int cycle,var_i;//cycle is period of inputing data
	cycle=0;
	while(cycle<1)
	{	
		next_state[0]=now_state[0]^signal_in[34]^signal_in[30]^signal_in[35]^signal_in[39]^signal_in[28]^signal_in[8]^signal_in[33]^signal_in[9]^signal_in[10]^signal_in[41]^signal_in[37]^signal_in[12]^signal_in[25]^signal_in[14]^signal_in[29]^signal_in[17]^signal_in[18]^signal_in[19]^signal_in[38]^signal_in[20]^signal_in[22];
        next_state[1]=signal_in[24]^now_state[1]^signal_in[30]^signal_in[35]^signal_in[27]^signal_in[39]^signal_in[7]^signal_in[32]^signal_in[40]^signal_in[10]^signal_in[41]^signal_in[11]^signal_in[12]^signal_in[25]^signal_in[13]^signal_in[14]^signal_in[16]^signal_in[20]^signal_in[21]^signal_in[36]^signal_in[22];
        next_state[2]=signal_in[24]^now_state[2]^signal_in[23]^signal_in[34]^signal_in[35]^signal_in[31]^signal_in[39]^signal_in[6]^signal_in[40]^signal_in[9]^signal_in[10]^signal_in[11]^signal_in[12]^signal_in[13]^signal_in[15]^signal_in[29]^signal_in[19]^signal_in[38]^signal_in[20]^signal_in[21]^signal_in[26];
        next_state[3]=now_state[3]^signal_in[23]^signal_in[35]^signal_in[5]^signal_in[41]^signal_in[11]^signal_in[29]^signal_in[17];
        next_state[4]=now_state[4]^signal_in[34]^signal_in[4]^signal_in[28]^signal_in[40]^signal_in[10]^signal_in[16]^signal_in[22];
        next_state[5]=now_state[5]^signal_in[3]^signal_in[27]^signal_in[39]^signal_in[33]^signal_in[9]^signal_in[15]^signal_in[21];
        next_state[6]=now_state[6]^signal_in[34]^signal_in[30]^signal_in[35]^signal_in[2]^signal_in[39]^signal_in[32]^signal_in[28]^signal_in[33]^signal_in[9]^signal_in[10]^signal_in[41]^signal_in[37]^signal_in[12]^signal_in[25]^signal_in[29]^signal_in[17]^signal_in[18]^signal_in[19]^signal_in[22]^signal_in[26];
		next_state[7]=signal_in[24]^now_state[7]^signal_in[30]^signal_in[1]^signal_in[35]^signal_in[27]^signal_in[31]^signal_in[39]^signal_in[32]^signal_in[40]^signal_in[10]^signal_in[41]^signal_in[11]^signal_in[37]^signal_in[12]^signal_in[14]^signal_in[16]^signal_in[19]^signal_in[20]^signal_in[21]^signal_in[36]^signal_in[22];
		next_state[8]=now_state[8]^signal_in[23]^signal_in[0]^signal_in[34]^signal_in[30]^signal_in[35]^signal_in[31]^signal_in[39]^signal_in[40]^signal_in[9]^signal_in[10]^signal_in[11]^signal_in[13]^signal_in[15]^signal_in[29]^signal_in[18]^signal_in[19]^signal_in[38]^signal_in[20]^signal_in[21]^signal_in[36]^signal_in[26];
		for(var_i=0;var_i<9;var_i++)
		{
			now_state[var_i]=next_state[var_i];
		}
		cout<<endl<<"The input data is:"<<endl;
		for(var_i=0;var_i<42;var_i++)
		{
			cout<<signal_in[var_i]<<" ";
		}
		cycle+=1;
	}
	cout<<endl<<"The syndromes bits is:"<<endl;
	for(var_i=0;var_i<9;var_i++)
	{
		cout<<now_state[var_i]<<" ";
	}
	/*********************************************************
	In this part, we will calculate the error mode in parellel
	**********************************************************/
	int syndromes[9];
	//int syndromes[9]={0,1,1,0,1,1,1,1,1};
	int e[6][9];
	int var_j;
	for(var_j=0;var_j<9;var_j++)
	{
		syndromes[var_j]=now_state[var_j];
	}
	//calculate the first frame error mode e0=T^42*s=T^0*s
	e[0][0]=syndromes[0];
	e[0][1]=syndromes[1];
	e[0][2]=syndromes[2];
	e[0][3]=syndromes[3];
	e[0][4]=syndromes[4];
	e[0][5]=syndromes[5];
	e[0][6]=syndromes[6];
	e[0][7]=syndromes[7];
	e[0][8]=syndromes[8];
	cout<<endl<<"e[0] is:";
	for(var_j=0;var_j<9;var_j++)
	{
		cout<<e[0][var_j]<<" ";
	}
	//calculate the first frame error mode e1=T^35*s
	e[1][0]=syndromes[1]^syndromes[3]^syndromes[5]^syndromes[6]^syndromes[7];
	e[1][1]=syndromes[1]^syndromes[2]^syndromes[3]^syndromes[4]^syndromes[5]^syndromes[8];
	e[1][2]=syndromes[0]^syndromes[2]^syndromes[3]^syndromes[4]^syndromes[5]^syndromes[6];
	e[1][3]=syndromes[4];
	e[1][4]=syndromes[5];
	e[1][5]=syndromes[0]^syndromes[6];
	e[1][6]=syndromes[3]^syndromes[5]^syndromes[6];
	e[1][7]=syndromes[1]^syndromes[3]^syndromes[4]^syndromes[5];
	e[1][8]=syndromes[0]^syndromes[2]^syndromes[4]^syndromes[5]^syndromes[6];
	cout<<endl<<"e[1] is:";
	for(var_j=0;var_j<9;var_j++)
	{
		cout<<e[1][var_j]<<" ";
	}
	//calculate the first frame error mode e2=T^28*s
	e[2][0]=syndromes[0]^syndromes[2]^syndromes[3]^syndromes[4]^syndromes[5]^syndromes[8];
	e[2][1]=syndromes[0]^syndromes[1]^syndromes[2]^syndromes[6]^syndromes[8];
	e[2][2]=syndromes[1]^syndromes[2]^syndromes[3]^syndromes[7];
	e[2][3]=syndromes[5];
	e[2][4]=syndromes[0]^syndromes[6];
	e[2][5]=syndromes[1]^syndromes[7];
	e[2][6]=syndromes[0]^syndromes[3]^syndromes[4]^syndromes[5];
	e[2][7]=syndromes[0]^syndromes[1]^syndromes[2]^syndromes[3]^syndromes[6]^syndromes[8];
	e[2][8]=syndromes[1]^syndromes[2]^syndromes[3]^syndromes[4]^syndromes[7];
	cout<<endl<<"e[2] is:";
	for(var_j=0;var_j<9;var_j++)
	{
		cout<<e[2][var_j]<<" ";
	}
	//calculate the first frame error mode e3=T^21*s
	e[3][0]=syndromes[0]^syndromes[1]^syndromes[4]^syndromes[7];
	e[3][1]=syndromes[2]^syndromes[4]^syndromes[5]^syndromes[7]^syndromes[8];
	e[3][2]=syndromes[0]^syndromes[3]^syndromes[5]^syndromes[6]^syndromes[8];
	e[3][3]=syndromes[0]^syndromes[6];
	e[3][4]=syndromes[1]^syndromes[7];
	e[3][5]=syndromes[2]^syndromes[8];
	e[3][6]=syndromes[0]^syndromes[1]^syndromes[3]^syndromes[4]^syndromes[7];
	e[3][7]=syndromes[2]^syndromes[5]^syndromes[7]^syndromes[8];
	e[3][8]=syndromes[0]^syndromes[3]^syndromes[6]^syndromes[8];
	cout<<endl<<"e[3] is:";
	for(var_j=0;var_j<9;var_j++)
	{
		cout<<e[3][var_j]<<" ";
	}
	//calculate the first frame error mode e4=T^14*s
	e[4][0]=syndromes[1]^syndromes[2]^syndromes[3]^syndromes[6]^syndromes[7]^syndromes[8];
	e[4][1]=syndromes[0]^syndromes[1]^syndromes[4]^syndromes[6];
	e[4][2]=syndromes[1]^syndromes[2]^syndromes[5]^syndromes[7];
	e[4][3]=syndromes[1]^syndromes[7];
	e[4][4]=syndromes[2]^syndromes[8];
	e[4][5]=syndromes[3];
	e[4][6]=syndromes[1]^syndromes[2]^syndromes[3]^syndromes[4]^syndromes[6]^syndromes[7]^syndromes[8];
	e[4][7]=syndromes[0]^syndromes[1]^syndromes[4]^syndromes[5]^syndromes[6];
	e[4][8]=syndromes[0]^syndromes[1]^syndromes[2]^syndromes[5]^syndromes[6]^syndromes[7];
	cout<<endl<<"e[4] is:";
	for(var_j=0;var_j<9;var_j++)
	{
		cout<<e[4][var_j]<<" ";
	}
	//calculate the first frame error mode e5=T^7*s
	e[5][0]=syndromes[2]^syndromes[4]^syndromes[5]^syndromes[6]^syndromes[8];
	e[5][1]=syndromes[2]^syndromes[3]^syndromes[4]^syndromes[7]^syndromes[8];
	e[5][2]=syndromes[3]^syndromes[4]^syndromes[5]^syndromes[8];
	e[5][3]=syndromes[2]^syndromes[8];
	e[5][4]=syndromes[3];
	e[5][5]=syndromes[4];
	e[5][6]=syndromes[2]^syndromes[4]^syndromes[6]^syndromes[8];
	e[5][7]=syndromes[0]^syndromes[2]^syndromes[3]^syndromes[4]^syndromes[6]^syndromes[7]^syndromes[8];
	e[5][8]=syndromes[1]^syndromes[3]^syndromes[4]^syndromes[5]^syndromes[7]^syndromes[8];
	cout<<endl<<"e[5] is:";
	for(var_j=0;var_j<9;var_j++)
	{
		cout<<e[5][var_j]<<" ";
	}
	/*****************************************************************************************
	In this part, we will check whether the error mode is valid.
	If error_valid[n]=1 means error mode is valid, nonethless, it means error mode is invalid.
	******************************************************************************************/ 
	int error_valid[6]={0};
	//check if the error mode of e0 is valid
	for(var_i=0;var_i<9;var_i++)
	{
		if(e[0][var_i]==1)
		{	
			if(var_i<6)
			{
				for(var_j=var_i+3;var_j<9;var_j++)
				{
					if(var_j!=8 && e[0][var_j]==1) {error_valid[0]=0; break;}
					else if(var_j==8 && e[0][var_j]==0) {error_valid[0]=1;}
					else if(var_j==8 && e[0][var_j]!=0) {error_valid[0]=0;}
				}
			}
			else if(var_i==6)
				error_valid[0]=1;
			else
				error_valid[0]=0;
			break;
		}
		else if(var_i==8)
			error_valid[0]=0;
	}
	cout<<endl<<"Error_valid[0] is:"<<error_valid[0];
	//check if the error mode of e1 is valid
	for(var_i=0;var_i<9;var_i++)
	{
		if(e[1][var_i]==1)
		{	
			if(var_i<6)
			{
				for(var_j=var_i+3;var_j<9;var_j++)
				{
					if(var_j!=8 && e[1][var_j]==1) {error_valid[1]=0; break;}
					else if(var_j==8 && e[1][var_j]==0) {error_valid[1]=1;}
					else if(var_j==8 && e[1][var_j]!=0) {error_valid[1]=0;}
				}
			}
			else if(var_i==6)
				error_valid[1]=1;
			else
				error_valid[1]=0;
			break;
		}
		else if(var_i==8)
			error_valid[1]=0;
	}
	cout<<endl<<"Error_valid[1] is:"<<error_valid[1];
	//check if the error mode of e2 is valid
	for(var_i=0;var_i<9;var_i++)
	{
		if(e[2][var_i]==1)
		{	
			if(var_i<6)
			{
				for(var_j=var_i+3;var_j<9;var_j++)
				{
					if(var_j!=8 && e[2][var_j]==1) {error_valid[2]=0; break;}
					else if(var_j==8 && e[2][var_j]==0) {error_valid[2]=1;}
					else if(var_j==8 && e[2][var_j]!=0) {error_valid[2]=0;}
				}
			}
			else if(var_i==6)
				error_valid[2]=1;
			else
				error_valid[2]=0;
			break;
		}
		else if(var_i==8)
			error_valid[2]=0;
	}
	cout<<endl<<"Error_valid[2] is:"<<error_valid[2];
	//check if the error mode of e3 is valid
	for(var_i=0;var_i<9;var_i++)
	{
		if(e[3][var_i]==1)
		{	
			if(var_i<6)
			{
				for(var_j=var_i+3;var_j<9;var_j++)
				{
					if(var_j!=8 && e[3][var_j]==1) {error_valid[3]=0; break;}
					else if(var_j==8 && e[3][var_j]==0) {error_valid[3]=1;}
					else if(var_j==8 && e[3][var_j]!=0) {error_valid[3]=0;}
				}
			}
			else if(var_i==6)
				error_valid[3]=1;
			else
				error_valid[3]=0;
			break;
		}
		else if(var_i==8)
			error_valid[3]=0;
	}
	cout<<endl<<"Error_valid[3] is:"<<error_valid[3];
	//check if the error mode of e4 is valid
	for(var_i=0;var_i<9;var_i++)
	{
		if(e[4][var_i]==1)
		{	
			if(var_i<6)
			{
				for(var_j=var_i+3;var_j<9;var_j++)
				{
					if(var_j!=8 && e[4][var_j]==1) {error_valid[4]=0; break;}
					else if(var_j==8 && e[4][var_j]==0) {error_valid[4]=1;}
					else if(var_j==8 && e[4][var_j]!=0) {error_valid[4]=0;}
				}
			}
			else if(var_i==6)
				error_valid[4]=1;
			else
				error_valid[4]=0;
			break;
		}
		else if(var_i==8)
			error_valid[4]=0;
	}
	cout<<endl<<"Error_valid[4] is:"<<error_valid[4];
	//check if the error mode of e5 is valid
	for(var_i=0;var_i<9;var_i++)
	{
		if(e[5][var_i]==1)
		{	
			if(var_i<6)
			{
				for(var_j=var_i+3;var_j<9;var_j++)
				{
					if(var_j!=8 && e[5][var_j]==1) {error_valid[5]=0; break;}
					else if(var_j==8 && e[5][var_j]==0) {error_valid[5]=1;}
					else if(var_j==8 && e[5][var_j]!=0) {error_valid[5]=0;}
				}
			}
			else if(var_i==6)
				error_valid[5]=1;
			else
				error_valid[5]=0;
			break;
		}
		else if(var_i==8)
			error_valid[5]=0;
	}
	cout<<endl<<"Error_valid[5] is:"<<error_valid[5];
	/*********************************************************************
	In this part, we will correct the error part in receiving codes though
	the value of the error_valid[n].
	**********************************************************************/
	int frame_j;
	int correct_codes[42];
	for(var_i=0;var_i<42;var_i++)
	{
		correct_codes[var_i]=signal_in[var_i];
	}
	for(frame_j=0;frame_j<6;frame_j++)
	{
		if(error_valid[frame_j]==1)
			for(var_j=0;var_j<9;var_j++)
			{
				//If the jth frame has error, then add the jth error mode to the jth frame of receive codes.
				correct_codes[7*frame_j+var_j]=correct_codes[7*frame_j+var_j]^e[frame_j][var_j];
			}
	}
	cout<<endl<<"The output data is:"<<endl;
	for(var_i=0;var_i<42;var_i++)
		cout<<correct_codes[var_i]<<" ";
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -