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

📄 turbo_code_log_map.c

📁 一些关于Turbo编码译码实现所需的函数和原程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
	index_random = type_flow? index_randomintlvr : index_randomintlvr_sup;

	/* 生成的0-1均匀分布随机数序列 */
	for (i=0; i<length; i++)
	{
		*(tempindex+i) = random_turbo();
	}

	for (i=0; i<length; i++)	
	{
		/* 找到tempindex中的最大值对应的下标 */
		tempmax = 0.0;

		for (j=0; j<length; j++)
		{
			if (*(tempindex+j) >= tempmax)
			{
				tempmax = *(tempindex+j);
				selectedscr = j;
			}
		}

		/* 交织器该位置为该下标 */
		*(index_random+i) = selectedscr;

		/* tempindex该位赋0 */
		*(tempindex+selectedscr) = 0.0;
	}

	free(tempindex);
}

/*---------------------------------------------------------------
函数:
	void randominterleaver_int(int *data_unintlvr, int *interleaverddata,
								int length, int type_flow)
介绍:
	int型随机交织器.
参数:
	输入参数:
		data_unintlvr -未交织数据序列首址.
		length - 数据序列长度.
		type_flow - 信息类型: 1-业务信息, 0补充信息.
	输出参数:
		interleaverddata - 交织后数据序列首址.
返回值:
	无.
---------------------------------------------------------------*/
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)));
	}
}

/*---------------------------------------------------------------
函数:
	void randominterleaver_double(double *data_unintlvr, double *interleaverddata, int length, int type_flow)

介绍:
	double型随机交织器.
参数:
	输入参数:
		data_unintlvr -未交织数据序列首址.
		length - 数据序列长度.
		type_flow - 信息类型: 1-业务信息, 0补充信息.
	输出参数:
		interleaverddata - 交织后数据序列首址.
返回值:
	无.
---------------------------------------------------------------*/
void randominterleaver_double(double *data_unintlvr, double *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)));
	}
}

/*---------------------------------------------------------------
函数:
    void random_deinterlvr_int(int *data_unintlvr, int *interleaverddata, int length, int type_flow)

介绍:
	int型随机解交织器.
参数:
	输入参数:
		interleaverddata - 交织后数据序列首址.
		length - 数据序列长度.
		type_flow - 信息类型: 1-业务信息, 0补充信息.
	输出参数:
		data_unintlvr -未交织数据序列首址.
返回值:
	无.
---------------------------------------------------------------*/
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);
	}
}

/*---------------------------------------------------------------
函数:
	void random_deinterlvr_double(double *data_unintlvr, double *interleaverddata, int length, int type_flow)

介绍:
	double型随机解交织器.
参数:
	输入参数:
		interleaverddata - 交织后数据序列首址.
		length - 数据序列长度.
		type_flow - 信息类型: 1-业务信息, 0补充信息.
	输出参数:
		data_unintlvr -未交织数据序列首址.
返回值:
	无.
---------------------------------------------------------------*/
void random_deinterlvr_double(double *data_unintlvr, double *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);
	}
}
/*---------------------------------------------------------------
函数:
	void blockinterleaver_double(int m_blockintlvr, int n_blockintlvr, double *inputdata, double *outputdata)

介绍:
	double型数据的块交织及解交织
参数:
	输入参数:
		m_blockintlvr - 块的行数
        n_blockintlvr - 块的列数
		inputdata - 交织(解交织)前的数据序列
	输出参数:
		poutput - 交织(解交织)后的数据序列
返回值:
	无.
---------------------------------------------------------------*/
void blockinterleaver_double(int m_blockintlvr, int n_blockintlvr, double *inputdata, double *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];
		}
	}
}

/*---------------------------------------------------------------
函数:
	void blockinterleaver_int(int m_blockintlvr, int n_blockintlvr, int *inputdata, int *outputdata)

介绍:
	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];
		}
	}
}

/*---------------------------------------------------------------
函数:
	void intlvrcdma2000_int(int *data_unintlvr, int *interleaveddata, int nturbo)

介绍:
	int型CDMA2000交织器
参数:
	输入参数:
		data_unintlvr - 交织前的数据
        nturbo - 交织块的大小
	输出参数:
		interleaveddata - 交织后的数据序列
返回值:
	无.
---------------------------------------------------------------*/
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);

}

/*---------------------------------------------------------------
函数:
	void intlvrcdma2000_double(double *data_unintlvr, double *interleaveddata, int nturbo)

介绍:
	double型CDMA2000交织器
参数:
	输入参数:
		data_unintlvr - 交织前的数据
        nturbo - 交织块的大小
	输出参数:
		interleaveddata - 交织后的数据序列
返回值:
	无.
---------------------------------------------------------------*/
void intlvrcdma2000_double(double *data_unintlvr, double *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);

}
/*---------------------------------------------------------------
函数:
	void deintlvrcdma2000_double(double *data_unintlvr, double *interleaveddata, int nturbo)

介绍:
	double型CDMA2000解交织器
参数:
	输入参数:
		interleaveddata - 解交织前的数据
        nturbo - 交织块的大小
	输出参数:
		data_unintlvr - 解交织后的数据序列
返回值:
	无.
---------------------------------------------------------------*/
void deintlvrcdma2000_double(double *data_unintlvr, double *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);

}
/*---------------------------------------------------------------
函数:
	void deintlvrcdma2000_int(int *data_unintlvr, int *interleaveddata, int nturbo)

介绍:
	int型CDMA2000解交织器
参数:
	输入参数:
		interleaveddata - 解交织前的数据
        nturbo - 交织块的大小
	输出参数:
		data_unintlvr - 解交织后的数据序列
返回值:
	无.
---------------------------------------------------------------*/
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);

}
/*---------------------------------------------------------------
函数:
	void subscript(int nturbo, int *sub_2000)

介绍:
	生成CDMA2000交织器的下标对应关系
参数:
	输入参数:
		nturbo - 交织块的大小
    输出参数:
		sub_2000 - 交织后序列各元素在原序列中的对应位置
返回值:
	无.
---------------------------------------------------------------*/
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;
		}
		
	}
		
}
/*---------------------------------------------------------------
函数:
	int msbs(int value, int numofbits, int num_bits)

介绍:
	取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;
}
/*---------------------------------------------------------------
函数:
	int lsbs(int value, int num_bits)

介绍:
	取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;
}
/*---------------------------------------------------------------
函数:
	int bitreverse(int value, int num_bits)

介绍:
	比特翻转
参数:
	输入参数:
		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;
}

/*---------------------------------------------------------------
函数:
	void interleave_int(int *data_unintlvr, int *interleaveddata, int typeofinterleave, int nturbo, int type_flow)

介绍:
	int型数据交织函数.交织器类型选择:0为CDMA2000交织器,1为块交织,2为随机交织,3为卷积交织(暂缺)

参数:
	输入参数:
		data_unintlvr - 交织前数据
        nturbo: 数据长度
        typeofinerleaver - 交织器类型
		type_flow - 信息类型 -  1-业务信息, 0补充信息.
    输出参数:
		interleaveddata - 交织后数据.
返回值:
---------------------------------------------------------------*/
void interleave_int(int *data_unintlvr, int *interleaveddata, int typeofinterleave, int nturbo, int type_flow)
{

		randominterleaver_int(data_unintlvr, interleaveddata, nturbo, type_flow);
		
	
}
/*---------------------------------------------------------------
函数:
	void interleave_double(double *data_unintlvr, double *interleaveddata, int typeofinterleave, int nturbo, int type_flow)

介绍:
	double型数据交织函数.交织器类型选择:0为CDMA2000交织器,1为块交织,2为随机交织,3为卷积交织(暂缺)

参数:
	输入参数:
		data_unintlvr - 交织前数据
        nturbo: 数据长度
        typeofinerleaver - 交织器类型
		type_flow - 信息类型 -  1-业务信息, 0补充信息.
    输出参数:
		interleaveddata - 交织后数据..
返回值:
---------------------------------------------------------------*/
void interleave_double(double *data_unintlvr, double *interleaveddata, int typeofinterleave, int nturbo, int type_flow)
{
	switch(typeofinterleave)
	{
	    case 0:
		{
			intlvrcdma2000_double(data_unintlvr, interleaveddata, nturbo);
			break;
		}
		case 1:

⌨️ 快捷键说明

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