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

📄 common.c

📁 B3g_phase2_C语言_Matlab程序及说明
💻 C
📖 第 1 页 / 共 5 页
字号:
	
	return	xor;
}

void trel_gen(int	g0, 
			  int	g1, 
			  int	Mem, 
	          int*	output_matrix, 
	          int*	nextstate_matrix,
	          int*	laststate_matrix,
	          int*	tail_bit)
{
	int		state_num;

	int		i,input,tmp_s,r;
	
	state_num = (1<<Mem);

	for(i=0; i<state_num; i++)
	{
		for(input=0; input<2; input++)
		{
			tmp_s	= (input<<Mem) + i;
			r	= dot(g0, tmp_s, Mem+1);
			tmp_s	= (r<<Mem) + i;
			nextstate_matrix[i*2+input] = (tmp_s>>1);
			r	= dot(g1, tmp_s, Mem+1);
			output_matrix[i*2+input] = r;
		}
		tail_bit[i] = dot(g0, i, Mem);
	}
	for(i=0; i<state_num; i++)
	{
		for(input=0; input<2; input++)
		{
			laststate_matrix[nextstate_matrix[2*i+input]*2+input] = i;
		}
	}
}

void interleave(int* imsg, int* msg, int N, int* interleave_table)
{
	int		i;
	
	for(i=0; i<N; i++)
	{
		imsg[i] = msg[interleave_table[i]];
	}

}

double maximum(double a, double b)
{
	return ( a>b ? a : b );
}

double g(double a, double b)
{
//	return ( a>b ? a : b ) + log(1.0 + exp(-(fabs(a-b))));
	
	double result;
	double diff;
	
	result = (a>b) ? a : b;
	diff   = fabs(a-b);
	
	if(diff>=5.08)
	{
		return result;
	}
	else
	{
		return (result+OFFSET[(int)(diff*128/5.08)]);
	}
}

void deinterleave(int *imsg, int* msg, int N, int* interleave_table)
{
	int		i;
	
	for(i=0; i<N; i++)
	{
		imsg[interleave_table[i]] = msg[i];
	}

}

void interleave_double(double* imsg, double* msg, int N, int* interleave_table)
{
	int			i;

	for(i=0; i<N; i++)
	{
		imsg[i] = msg[interleave_table[i]];
	}

}

void deinterleave_double(double* imsg, double* msg, int N, int* interleave_table)
{
	int			i;

	for(i=0; i<N; i++)
	{
		imsg[interleave_table[i]] = msg[i];
	}

}



void rsc_encode(int* msg, int* parity, int size, int termination, int g0, int g1, int Mem)
{
	int		i;
	int		state = 0;

	int*	output_matrix;
	int*	nextstate_matrix;
	int*	laststate_matrix;
	int*	tail_bit;
	int		num_state;

	num_state = (1<<Mem);

	output_matrix		=	(int*) malloc(num_state*2*sizeof(int));
	nextstate_matrix	=	(int*) malloc(num_state*2*sizeof(int));
	laststate_matrix	=	(int*) malloc(num_state*2*sizeof(int));
	tail_bit			=	(int*) malloc(num_state*sizeof(int));

	trel_gen(g0, g1, Mem, output_matrix, nextstate_matrix, laststate_matrix, tail_bit);

	for(i=0; i<size-Mem; i++)
	{
		parity[i]	= output_matrix[2*state + msg[i]];
		state		= nextstate_matrix[2*state + msg[i]];
	}

	if (termination != 0)
	{
		for(i=size-Mem; i<size; i++)
		{
			msg[i]		= tail_bit[state];
			parity[i]	= output_matrix[2*state + msg[i]];
			state		= nextstate_matrix[2*state + msg[i]];
		}
	}
	else
	{
		for(i=size-Mem; i<size; i++)
		{
			parity[i]	= output_matrix[2*state + msg[i]];
			state		= nextstate_matrix[2*state + msg[i]];
		}
	}

	free(output_matrix);
	free(nextstate_matrix);
	free(laststate_matrix);
	free(tail_bit);
}

void turbo_encode(int* msg, int* stream, int puncture, int Len, int g0 ,int g1, int Mem, int* interleave_table)
{
	int		i;
	
	int*	parity1;
	int*	parity2;
	int*	imsg;

	parity1 = (int*) malloc(Len*sizeof(int));
	parity2 = (int*) malloc(Len*sizeof(int));
	imsg	= (int*) malloc(Len*sizeof(int));

	rsc_encode(msg, parity1, Len, 1, g0, g1, Mem);

	interleave(imsg, msg, Len, interleave_table);

	rsc_encode(imsg, parity2, Len, 0, g0, g1, Mem);

	for(i=0; i<Len; i++)
	{
		if (puncture)
		{
			stream[2*i]		= msg[i];
			stream[2*i+1]	= (i%2) ? parity2[i] : parity1[i];
		}
		else
		{
			stream[3*i]	  = msg[i];
			stream[3*i+1] = parity1[i];
			stream[3*i+2] = parity2[i];
		}
	}
	
	free(parity1);
	free(parity2);
	free(imsg);

}

void turbo_decode(
short *	decoded, 
double*	old_llr,
double*	new_llr,
double*	llr_all,
double*	stream, 
int		puncture, 
int		Len, 
int		iteration,
int   *	interleave_table,
int		g0,
int		g1,
int		Mem)
{
	double*		parity1;
	double*		parity2;
	double*		msg;
	double*		imsg;
	double*		L1;
	double*		L2;
	double*		llrp1;
	double*		llrp2;
	double*		temp_L;

	double*		a1;
	double*		a2;
	double*		b1;
	double*		b2;
	double*		r1;
	double*		r2;
	double*		ru1;
	double*		ru2;
	double*		rc1;
	double*		rc2;
	
	int			num_state;
	int*		output_matrix;
	int*		nextstate_matrix;
	int*		laststate_matrix;
	int*		tail_bit;

	int		S;
	int		L;
	int		inf;
	
	int		i;
	int		j;
	int		i_iter;
	int		input;
	double		nom;
	double		denom;
	double		t0;
	double		t1;
	
	num_state	=	(1<<Mem);
	
	output_matrix		=	(int*) malloc(num_state*2*sizeof(int));
	nextstate_matrix	=	(int*) malloc(num_state*2*sizeof(int));
	laststate_matrix	=	(int*) malloc(num_state*2*sizeof(int));
	tail_bit			=	(int*) malloc(num_state*sizeof(int));
	
	trel_gen(g0, g1, Mem, output_matrix, nextstate_matrix, laststate_matrix, tail_bit);

	msg		= (double*) malloc(Len*sizeof(double));
	imsg	= (double*) malloc(Len*sizeof(double));
	parity1	= (double*) malloc(Len*sizeof(double));
	parity2 = (double*) malloc(Len*sizeof(double));
	L1		= (double*) malloc(Len*sizeof(double));
	L2		= (double*) malloc(Len*sizeof(double));
	llrp1	= (double*) malloc(Len*sizeof(double));
	llrp2	= (double*) malloc(Len*sizeof(double));
	temp_L	= (double*) malloc(Len*sizeof(double));

	a1	= (double*) malloc((Len+1)*num_state*sizeof(double));
	a2	= (double*) malloc((Len+1)*num_state*sizeof(double));
	b1	= (double*) malloc((Len+1)*num_state*sizeof(double));
	b2	= (double*) malloc((Len+1)*num_state*sizeof(double));
	r1	= (double*) malloc(Len*num_state*2*sizeof(double));
	r2	= (double*) malloc(Len*num_state*2*sizeof(double));
	rc1	= (double*) malloc(Len*num_state*2*sizeof(double));
	rc2	= (double*) malloc(Len*num_state*2*sizeof(double));
	ru1	= (double*) malloc(Len*num_state*2*sizeof(double));
	ru2	= (double*) malloc(Len*num_state*2*sizeof(double));

	L	=	Len;
	S	=	num_state;//convient to present
	
	for(i=0; i<Len; i++)
	{
		if (puncture)
		{
			msg[i]		= stream[2*i];
			parity1[i]	= (i%2) ? 0 : stream[2*i+1];
			parity2[i]	= (i%2) ? stream[2*i+1] : 0;
		}
		else
		{
			msg[i]		= stream[3*i];
			parity1[i]	= stream[3*i+1];
			parity2[i]	= stream[3*i+2];
		}
	}

	interleave_double(imsg, msg, Len, interleave_table);

	//initialize

	//Lc	=	2.0*1.0/N0;
	inf	=	1000;

	//initialize D1:
	
	a1[0*S+0]	=	0.0;
	b1[L*S+0]	=	0.0;
	for(j=1; j<num_state; j++)
	{
		a1[0*S+j]	=	-inf;
		b1[L*S+j]	=	-inf;
	}

	for(i=0; i<L; i++)
	{
		L2[i]	=	old_llr[i];
	}

	//initialize D2:
	
	a2[0*S+0]	=	0.0;
	b2[L*S+0]	=	0.0;

	for(j=1; j<num_state; j++)
	{
		a2[0*S+j] = -inf;
		b2[L*S+j] = 0.0;
	}
	//end of initialize
	

	//the nth iteration
	for(i_iter=0; i_iter<iteration; i_iter++)
	{
		//D1 process:
		
		//computate the gamma1
		for(i=0; i<L; i++)
		{
			for(j=0; j<S; j++)
			{
				for(input=0; input<2; input++)
				{	
					double	uk	=	(input == 1)? 1.0:-1.0;
					double	xk	=	(output_matrix[2*j+input] == 1)? 1.0:-1.0;
					
					rc1[(i*S+j)*2+input]	=	0.5*parity1[i]*xk;
					ru1[(i*S+j)*2+input]	=	0.5*uk*msg[i];
					r1[(i*S+j)*2+input] 	=	0.5*uk*L2[i]+ru1[(i*S+j)*2+input]+rc1[(i*S+j)*2+input];
				}
			}
		

		}//end of computing gamma1

		//computate the alfa1
		for(i=1; i<L; i++)
		{	
			for(j=0; j<S; j++)
			{
				t0	=	a1[(i-1)*S+laststate_matrix[2*j+0]]
						+ r1[((i-1)*S+laststate_matrix[2*j+0])*2+0];
				t1	=	a1[(i-1)*S+laststate_matrix[2*j+1]]
						+ r1[((i-1)*S+laststate_matrix[2*j+1])*2+1];
				a1[i*S+j] = g(t0, t1);
			}

		}//end of computing alfa1

		//compute the beta1
		for(i=L-1; i>0; i--)
		{
			for(j=0; j<S; j++)
			{
				t0	=	b1[(i+1)*S+nextstate_matrix[2*j+0]]
						+ r1[(i*S+j)*2+0];
				t1	=	b1[(i+1)*S+nextstate_matrix[2*j+1]]
						+ r1[(i*S+j)*2+1];
				b1[i*S+j] = g(t0,t1);
			}
		}//end of computing beta1
		
		for(i=0; i<L; i++)
		{	
			nom	=	a1[i*S+0] + rc1[(i*S+0)*2+1] 
						+ b1[(i+1)*S+nextstate_matrix[2*0+1]];
			denom	=	a1[i*S+0] + rc1[(i*S+0)*2+0]
						+ b1[(i+1)*S+nextstate_matrix[2*0+0]];
			
			for(j=1; j<S; j++)
			{
				nom	= g(nom, a1[i*S+j] + rc1[(i*S+j)*2+1] 
						+ b1[(i+1)*S+nextstate_matrix[2*j+1]]);
				denom	= g(denom, a1[i*S+j] + rc1[(i*S+j)*2+0] 
						+ b1[(i+1)*S+nextstate_matrix[2*j+0]]);

			}

			L1[i] = nom - denom;

			if (L1[i] < -10*inf)
			{
				L1[i] = -10*inf;
			}
			if (L1[i] > 10*inf)
			{
				L1[i] = 10*inf;
			}
		}//end of D1 process

		interleave_double(temp_L, L1, Len, interleave_table);

		for(i=0; i<Len; i++)
		{
			L1[i] = temp_L[i];
		}
		
		//D2 processing:
		//computate the gamma2
		for(i=0; i<L; i++)
		{
			for(j=0; j<S; j++)
			{
				for(input=0; input<2; input++)
				{	
					double	uk	=	(input == 1)? 1.0:-1.0;
					double	xk	=	(output_matrix[2*j+input] == 1)? 1.0:-1.0;
					
					*(rc2+(i*S+j)*2+input)	=	0.5*(*(parity2+i))*xk;
					*(ru2+(i*S+j)*2+input)	=	0.5*uk*(*(imsg+i));
					*(r2+(i*S+j)*2+input)	=	0.5*uk*L1[i]+ru2[(i*S+j)*2+input]+rc2[(i*S+j)*2+input];
				}
			}
		}//end of computing gamma2

		//computate the alfa2
		for(i=1; i<L; i++)
		{	
			for(j=0; j<S; j++)
			{
				t0	=	a2[(i-1)*S+laststate_matrix[2*j+0]]
						+ r2[((i-1)*S+laststate_matrix[2*j+0])*2+0];
				t1	=	a2[(i-1)*S+laststate_matrix[2*j+1]]
						+ r2[((i-1)*S+laststate_matrix[2*j+1])*2+1];
				a2[i*S+j] = g(t0, t1);
			}

		}//end of computing alfa2

		//compute the beta2
		for(i=L-1; i>0; i--)
		{
			for(j=0; j<S; j++)
			{
				t0	=	b2[(i+1)*S+nextstate_matrix[2*j+0]]
						+ r2[(i*S+j)*2+0];
				t1	=	b2[(i+1)*S+nextstate_matrix[2*j+1]]
						+ r2[(i*S+j)*2+1];
				b2[i*S+j] = g(t0,t1);
			}
		}//end of computing beta2

		for(i=0; i<L; i++)
		{
			nom	=	a2[i*S+0] + rc2[(i*S+0)*2+1] 
						+ b2[(i+1)*S+nextstate_matrix[2*0+1]];
			denom	=	a2[i*S+0] + rc2[(i*S+0)*2+0]
						+ b2[(i+1)*S+nextstate_matrix[2*0+0]];

			for(j=1; j<S; j++)
			{
				nom	= g(nom, a2[i*S+j] + rc2[(i*S+j)*2+1] 
						+ b2[(i+1)*S+nextstate_matrix[2*j+1]]);
				denom	= g(denom, a2[i*S+j] + rc2[(i*S+j)*2+0] 
						+ b2[(i+1)*S+nextstate_matrix[2*j+0]]);
			}

			L2[i] = nom - denom;

			if (L2[i] < -10*inf)
			{
				L2[i] = -10*inf;
			}
			if (L2[i] > 10*inf)

⌨️ 快捷键说明

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