📄 turbo_code_log_map.c
字号:
/*---------------------------------------------------------------
函数:
int bin2int(int *binseq, int length)
介绍:
二进制序列转为十进制数.
参数:
输入参数:
binseq - 二进制序列首址.
length - 二进制序列长度.
输出参数:
无
返回值:
得到的十进制数.
---------------------------------------------------------------*/
int bin2int(int *binseq, int length)
{
int i, j, temp;
int sum = 0;
for (i=0; i<length; i++)
{
temp = 1;
/* 计算该位权值 */
for (j=1; j<=i; j++)
{
temp = temp * 2;
}
sum = sum + temp * (*(binseq+length-1-i));
}
return sum;
}
/*---------------------------------------------------------------
函数:
double random_turbo()
介绍:
生成0-1均匀分布随机数.
参数:
无
返回值:
生成的0-1均匀分布随机数.
---------------------------------------------------------------*/
double random_turbo()
{
long z,k;
static long s1 = 12345L;
static long s2 = 1234546346L;
k= s1 / 53668L;
s1 = 40014L * (s1 - k*53668L) - k*12211L;
if (s1<0)
s1 = s1 + 2147483563L;
k = s2 / 52774;
s2 = 40692L * (s2 - k*52774L) - k*3791L;
if (s2<0)
s2 = s2 + 2147483399L;
z=s1 - s2;
if (z<1)
z = z + 2147483562L;
return (double) z / (double) 2147483563.0;
}
/*---------------------------------------------------------------
函数:
void gen_rand_index(int length, int type_flow)
介绍:
生成随机交织器的下标.
参数:
输入参数:
length - 交织器长度.
type_flow - 信息类型: 1-业务信息, 0-补充信息.
输出参数:
无
返回值:
无
---------------------------------------------------------------*/
void gen_rand_index(int length, int type_flow)
{
int *index_random; /* 需先生成的0-1均匀分布随机数序列 */
double *tempindex; /* 用以选择随机交织首址 */
double tempmax; /* 最大值 */
int selectedscr; /* 选中的下标 */
int i, j; /* 循环变量 */
if ((tempindex=(double *)malloc((length)*sizeof(double)))==NULL)
{
printf("\n fail to allocate memory of tempindex \n");
exit(1);
}
/* 由数据类型选随机交织器 */
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位所组成的十进制数
---------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -