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

📄 turbo_code_log_map.c

📁 turbo 码的c语言程序
💻 C
📖 第 1 页 / 共 5 页
字号:
void randominterleaver_int(int *data_unintlvr, int *interleaverddata,
						   int length, int type_flow)
{
	int i;
	int *index_random = type_flow? index_randomintlvr : index_randomintlvr_sup;

	for (i=0; i<length; i++)
	{
		*(interleaverddata+i) = *(data_unintlvr+ (*(index_random+i)));
	}
}

/*---------------------------------------------------------------
FUNCTION: 
	void randominterleaver_float(float *data_unintlvr, float *interleaverddata, int length, int type_flow)
	
DESCRIPTION:
	Random interleaver of float.

PARAMETERS:
	INPUT:
		data_unintlvr - Contains pointer to data_unintlvr before interleavered.
		length - Length of interleaver.
		type_flow - 1 for traffic flow, 0 for suplement flow.
	OUTPUT:
		interleaverddata - Contains pointer to interleavered data_unintlvr.

RETURN VALUE:
	None
---------------------------------------------------------------*/
void randominterleaver_float(float *data_unintlvr, float *interleaverddata, int length, int type_flow)
{
	int i;
	int *index_random = type_flow? index_randomintlvr : index_randomintlvr_sup;

	for (i=0; i<length; i++)
	{
		*(interleaverddata+i) = *(data_unintlvr+ (*(index_random+i)));
	}
}

/*---------------------------------------------------------------
FUNCTION: 
	void random_deinterlvr_int(int *data_unintlvr, int *interleaverddata, int length, int type_flow)
	
DESCRIPTION:
	Random deinterleaver of int.

PARAMETERS:
	INPUT:
		data_unintlvr - Contains pointer to data_unintlvr before interleavered.
		length - Length of interleaver.
		type_flow - 1 for traffic flow, 0 for suplement flow.

	OUTPUT:
		interleaverddata - Contains pointer to interleavered data_unintlvr.

RETURN VALUE:
	None
---------------------------------------------------------------*/
void random_deinterlvr_int(int *data_unintlvr, int *interleaverddata, int length, int type_flow)
{
	int i;
	int *index_random = type_flow? index_randomintlvr : index_randomintlvr_sup;

	for (i=0; i<length; i++)
	{
		*(data_unintlvr+(*(index_random+i))) = *(interleaverddata+i);
	}
}

/*---------------------------------------------------------------
FUNCTION: 
	void random_deinterlvr_float(float *data_unintlvr, float *interleaverddata, int length, int type_flow)
	
DESCRIPTION:
	Random interleaver of float.

PARAMETERS:
	INPUT:
		data_unintlvr - Contains pointer to data_unintlvr before interleavered.
		length - Length of interleaver.
		type_flow - 1 for traffic flow, 0 for suplement flow.
	OUTPUT:
		interleaverddata - Contains pointer to interleavered data_unintlvr.

RETURN VALUE:
	None
---------------------------------------------------------------*/
void random_deinterlvr_float(float *data_unintlvr, float *interleaverddata, int length, int type_flow)
{
	int i;
	int *index_random = type_flow? index_randomintlvr : index_randomintlvr_sup;

	for (i=0; i<length; i++)
	{
		*(data_unintlvr+(*(index_random+i))) = *(interleaverddata+i);
	}
}

/*
* 函数介绍:float型数据的块交织及解交织
* 输入参数:m_blockintlvr:块的行数
*           n_blockintlvr:块的列数
*           inputdata:交织(解交织)前的数据序列
* 输出参数:poutput:交织(解交织)后的数据序列
* 返回值:  无
* 说明:    块交织与解交织使用同一个函数,行数与列数互相交换。块交织的块大小必须与帧长相等
*/
void blockinterleaver_float(int m_blockintlvr, int n_blockintlvr, float *inputdata, float *outputdata)
{
	int i, j;
	for(i=0; i<m_blockintlvr; i++)
	{
		for(j=0; j<n_blockintlvr; j++)
		{
			outputdata[i*n_blockintlvr+j] = inputdata[j*m_blockintlvr+i];
		}
	}
}

/*
* 函数介绍:int型数据的块交织及解交织
* 输入参数:m_blockintlvr:块的行数
*           n_blockintlvr:块的列数
*           inputdata:交织(解交织)前的数据序列
* 输出参数:poutput:交织(解交织)后的数据序列
* 返回值:  无
* 说明:    块交织与解交织使用同一个函数,行数与列数互相交换。块交织的块大小必须与帧长相等
*/
void blockinterleaver_int(int m_blockintlvr, int n_blockintlvr, int *inputdata, int *outputdata)
{
	int i, j;
	for(i=0; i<m_blockintlvr; i++)
	{
		for(j=0; j<n_blockintlvr; j++)
		{
			outputdata[i*n_blockintlvr+j] = inputdata[j*m_blockintlvr+i];
		}
	}
}

/*
* 函数介绍:int型CDMA2000交织器
* 输入参数:data_unintlvr:交织前的数据
*           nturbo:交织块的大小
* 输出参数:interleaveddata:交织后的数据序列
* 返回值:  无
* 说明:    nturbo必须在256和32768之间
*/
void intlvrcdma2000_int(int *data_unintlvr, int *interleaveddata, int nturbo)
{   
	int i;
	int n = (int)ceil(log(nturbo)/log(2))-5;
	int *sub_2000 = (int*)malloc(sizeof(int)*nturbo);
	subscript(nturbo, sub_2000);

	for(i=0; i<nturbo; i++)
	{  
		interleaveddata[i] = data_unintlvr[sub_2000[i]];
	}
	free(sub_2000);

}

/*
* 函数介绍:float型CDMA2000交织器
* 输入参数:data_unintlvr:交织前的数据
*           nturbo:交织块的大小
* 输出参数:interleaveddata:交织后的数据序列
* 返回值:  无
* 说明:    nturbo必须在256和32768之间
*/
void intlvrcdma2000_float(float *data_unintlvr, float *interleaveddata, int nturbo)
{   
	int i;
	int n = (int)ceil(log(nturbo)/log(2))-5;
	int *sub_2000 = (int*)malloc(sizeof(int)*nturbo);
	subscript(nturbo, sub_2000);

	for(i=0; i<nturbo; i++)
	{  
		interleaveddata[i] = data_unintlvr[sub_2000[i]];
	}
	free(sub_2000);

}

/*
* 函数介绍:float型CDMA2000解交织器
* 输入参数:interleaveddata:解交织前的数据
*           nturbo:交织块的大小
* 输出参数:data_unintlvr:解交织后的数据序列
* 返回值:  无
* 说明:    nturbo必须在256和32768之间
*/
void deintlvrcdma2000_float(float *data_unintlvr, float *interleaveddata, int nturbo)
{   
	int i;
	int n = (int)ceil(log(nturbo)/log(2))-5;
	int *sub_2000 = (int*)malloc(sizeof(int)*nturbo);
	subscript(nturbo, sub_2000);

	for(i=0; i<nturbo; i++)
	{  
		data_unintlvr[sub_2000[i]] = interleaveddata[i];
	}
	free(sub_2000);

}

/*
* 函数介绍:int型CDMA2000解交织器
* 输入参数:interleaveddata:解交织前的数据
*           nturbo:交织块的大小
* 输出参数:data_unintlvr:解交织后的数据序列
* 返回值:  无
* 说明:    nturbo必须在256和32768之间
*/
void deintlvrcdma2000_int(int *data_unintlvr, int *interleaveddata, int nturbo)
{   
	int i;
	int n = (int)ceil(log(nturbo)/log(2))-5;
	int *sub_2000 = (int*)malloc(sizeof(int)*nturbo);
	subscript(nturbo, sub_2000);

	for(i=0; i<nturbo; i++)
	{  
		data_unintlvr[sub_2000[i]] = interleaveddata[i];
	}
	free(sub_2000);

}

/*
* 函数介绍:生成CDMA2000交织器的下标对应关系
* 输入参数:nturbo:交织块的大小
* 输出参数:sub_2000:交织后序列各元素在原序列中的对应位置
* 返回值:  无
* 说明:    nturbo必须在256和32768之间
*/
void subscript(int nturbo, int *sub_2000)
{
	int n;
	int indx;
	int counternum = 0;
	int tentative = 0;
	int temp1, temp2, temp3;
	int num = 0;
	n = (int)ceil(log(nturbo)/log(2))-5;
	counternum = (1<<(n+5))-1;
	for(indx=0; indx<(1<<(n+5)); indx++)
	{
		temp1 = msbs(indx, n+5, n)+1;
		temp1 = lsbs(temp1, n);
		temp2 = lookuptable_cdma2000[n-4][lsbs(indx, 5)];
		temp1 = lsbs(temp1*temp2, n);
		temp3 = bitreverse(lsbs(indx,5),5);
		tentative = (temp3<<n) + temp1;
		if(tentative < nturbo)
		{
			*(sub_2000+num) = tentative;
			num++;
		}
		if(num == nturbo)
		{
			break;
		}
		
	}
		
}

/*
* 函数介绍:取value的高num_bits位
* 输入参数:value:输入数据
*           numofbits: value的位数
*           num_bits: 要取的位数
* 输出参数:无
* 返回值:  value的高num_bits位所组成的十进制数
*/
int msbs(int value, int numofbits, int num_bits)
{
	int result = value>>(numofbits-num_bits);
	return result;
}

/*
* 函数介绍:取value的低num_bits位
* 输入参数:value:输入数据
*           num_bits: 要取的位数
* 输出参数:无
* 返回值:  value的低num_bits位所组成的十进制数
*/
int lsbs(int value, int num_bits)
{
	int result;
	int temp = (1<<num_bits)-1;
	result = value & temp;
	return result;
}


/*
* 函数介绍:比特翻转
* 输入参数:value:输入数据
*           num_bits: value的比特数
* 输出参数:无
* 返回值:  value比特翻转后组成的十进制数
*/
int bitreverse(int value, int num_bits)
{
	int i;
	int *bits = (int*)malloc(sizeof(int)*num_bits);
	int result;
	for(i=0; i<num_bits; i++)
	{
		bits[i] = (value>>i)&1;
	}
	/*将输入值变为num_bits个0,1数据*/
	result = 0;
	for(i=0; i<num_bits; i++)
	{
		result += bits[i]<<(num_bits-1-i);
	}
	/*翻转后组成新的十进制数*/
	free(bits);
	return result;
}


/*
* 函数介绍:int型数据交织函数
* 输入参数:data_unintlvr:交织前数据
*           nturbo: 数据长度
*           typeofinerleaver:交织器类型
* 输出参数:interleaveddata:交织后数据
* 返回值:  无
* 说明:    交织器类型选择:0为CDMA2000交织器,1为块交织,2为随机交织(暂缺),3为卷积交织(暂缺)
*/
void interleave_int(int *data_unintlvr, int *interleaveddata, int typeofinterleave, int nturbo, int type_flow)
{
	switch(typeofinterleave)
	{
	    case 0:
		{
			intlvrcdma2000_int(data_unintlvr, interleaveddata, nturbo);
			break;
		}
		case 1:
		{
			blockinterleaver_int(M_BLOCK_INT, N_BLOCK_INT, data_unintlvr, interleaveddata);
			break;
		}
		case 2:
		{
			randominterleaver_int(data_unintlvr, interleaveddata, nturbo, type_flow);
			break;
		}
		case 3:
		{
			break;
		}
		default:
		{
			printf("error! This type of interleaver doesn't exits!\n");
		}
	}
}

/*
* 函数介绍:float型数据交织函数
* 输入参数:data_unintlvr:交织前数据
*           nturbo: 数据长度
*           typeofinerleaver:交织器类型
* 输出参数:interleaveddata:交织后数据
* 返回值:  无
* 说明:    交织器类型选择:0为CDMA2000交织器,1为块交织,2为随机交织(暂缺),3为卷积交织(暂缺)
*/
void interleave_float(float *data_unintlvr, float *interleaveddata, int typeofinterleave, int nturbo, int type_flow)
{
	switch(typeofinterleave)
	{
	    case 0:
		{
			intlvrcdma2000_float(data_unintlvr, interleaveddata, nturbo);
			break;
		}
		case 1:
		{
			blockinterleaver_float(M_BLOCK_INT, N_BLOCK_INT, data_unintlvr, interleaveddata);
			break;
		}
		case 2:
		{
			randominterleaver_float(data_unintlvr, interleaveddata, nturbo, type_flow);
			break;
		}
		case 3:
		{
			break;
		}
		default:
		{
			printf("error! This type of interleaver doesn't exits!\n");
		}
	}
}

/*
* 函数介绍:int型数据解交织函数
* 输入参数:interleaveddata:解交织前数据
*           nturbo: 数据长度
*           typeofinerleaver:交织器类型
* 输出参数:data_unintlvr:解交织后数据
* 返回值:  无
* 说明:    交织器类型选择:0为CDMA2000交织器,1为块交织,2为随机交织(暂缺),3为卷积交织(暂缺)
*/
void de_interleave_int(int *data_unintlvr, int *interleaveddata, int typeofinterleave, int nturbo, int type_flow)
{
	switch(typeofinterleave)
	{
	    case 0:
		{
			deintlvrcdma2000_int(data_unintlvr, interleaveddata, nturbo);
			break;
		}
		case 1:
		{
			blockinterleaver_int(N_BLOCK_INT, M_BLOCK_INT, interleaveddata, data_unintlvr);
			break;
		}
		case 2:
		{
			random_deinterlvr_int(data_unintlvr, interleaveddata, nturbo, type_flow);
			break;
		}
		case 3:
		{
			break;
		}
		default:
		{
			printf("error! This type of interleaver doesn't exits!\n");
		}
	}
}

/*
* 函数介绍:float型数据解交织函数
* 输入参数:interleaveddata:解交织前数据
*           nturbo: 数据长度
*           typeofinerleaver:交织器类型
* 输出参数:data_unintlvr:解交织后数据
* 返回值:  无
* 说明:    交织器类型选择:0为CDMA2000交织器,1为块交织,2为随机交织(暂缺),3为卷积交织(暂缺)
*/
void de_interleave_float(float *data_unintlvr, float *interleaveddata, int typeofinterleave, int nturbo, int type_flow)
{
	switch(typeofinterleave)
	{
	    case 0:
		{
			deintlvrcdma2000_float(data_unintlvr, interleaveddata, nturbo);
			break;
		}
		case 1:
		{
			blockinterleaver_float(N_BLOCK_INT, M_BLOCK_INT, interleaveddata, data_unintlvr);
			break;
		}
		case 2:
		{	
			random_deinterlvr_float(data_unintlvr, interleaveddata, nturbo, type_flow);
			break;
		}
		case 3:
		{
			break;
		}
		default:
			printf("error! This type of interleaver doesn't exits!\n");
	}
}

/*---------------------------------------------------------------
FUNCTION: 
	void encoderm_turbo(int *source, int *send_turbo, int len_info, int type_flow)
	
DESCRIPTION:
	This function encode the source data and modulate them using BPSK.

⌨️ 快捷键说明

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