📄 turbo_code_log_map.c
字号:
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 + -