📄 rx_bitdeinterv.cpp
字号:
/************************************/
/*函数说明:
/*功能:比特解交织
/*输出参数:
/*rx_bitdeinterved_bit:经过比特解交织后的硬判决比特流;
/*rx_ldpc_llr:经过比特接交织后的初始化似然比;
/*输入参数:
/*rx_hard_demod_bit:经解映射后的硬判决比特流;
/*rx_ch_llr:经解映射计算出的初始化似然比;
/*rx_hard_demod_bit_len:经解映射后的硬判决比特流(似然比)的长度;
/*channel_rate:信道速率: 1:2M 2: 8M;
/*备注:8M时解交织深度为384×360,2M时解交织深度为192×144。数据按行存入矩阵,按列取出
/************************************/
#include <stdio.h>
#include <stdlib.h>
#include "rx_bitdeinterv.h"
void rx_bitdeinterv(char * rx_hard_demod_bit, double * rx_ch_llr, long int rx_hard_demod_bit_len, unsigned char channel_rate, char * rx_bitdeinterved_bit, double * rx_ldpc_llr)
{
int i,j,k,interlve_num;
char **interlve_matrix;
double **intlve_lratio_mat;
int interlve_M,interlve_N;
switch(channel_rate)
{
case(2): //8M时交织深度为384×360,解交织相反
interlve_M=360;
interlve_N=384;
if(rx_hard_demod_bit_len%(interlve_M*interlve_N)!=0)
{
printf("LDPC DATA LEN ERROR IN BIT_DEINTERLVE!");
return;
}
interlve_num=rx_hard_demod_bit_len/(interlve_M*interlve_N);
interlve_matrix=(char**)calloc(interlve_M,sizeof(char*));
for(i=0;i<interlve_M;i++)
{
interlve_matrix[i]= (char*)calloc(interlve_N,sizeof(char));
}
intlve_lratio_mat=(double**)calloc(interlve_M,sizeof(double*));
for(i=0;i<interlve_M;i++)
{
intlve_lratio_mat[i]= (double*)calloc(interlve_N,sizeof(double));
}
for(i=0;i<interlve_num;i++)
{
for (j=0;j<interlve_M;j++)
for(k=0;k<interlve_N;k++)
{
interlve_matrix[j][k]=rx_hard_demod_bit[interlve_M*interlve_N*i+interlve_N*j+k];
intlve_lratio_mat[j][k]=rx_ch_llr[interlve_M*interlve_N*i+interlve_N*j+k];
}
for (j=0;j<interlve_N;j++)
for(k=0;k<interlve_M;k++)
{
rx_bitdeinterved_bit[interlve_M*interlve_N*i+interlve_M*j+k]=interlve_matrix[k][j];
rx_ldpc_llr[interlve_M*interlve_N*i+interlve_M*j+k]=intlve_lratio_mat[k][j];
}
}
/** free the memory********/
for(i=0 ; i<interlve_M ; i++)
free(interlve_matrix[i] );
free(interlve_matrix);
for(i=0 ; i<interlve_M ; i++)
free(intlve_lratio_mat[i] );
free(intlve_lratio_mat);
break;
case(1): //2M时交织深度为192×144
interlve_M=144;
interlve_N=192;
if(rx_hard_demod_bit_len%(interlve_M*interlve_N)!=0)
{
printf("LDPC DATA LEN ERROR IN BIT_DEINTERLVE!");
return;
}
interlve_num=rx_hard_demod_bit_len/(interlve_M*interlve_N);
interlve_matrix=(char**)calloc(interlve_M,sizeof(char*));
for(i=0;i<interlve_M;i++)
{
interlve_matrix[i]= (char*)calloc(interlve_N,sizeof(char));
}
intlve_lratio_mat=(double**)calloc(interlve_M,sizeof(double*));
for(i=0;i<interlve_M;i++)
{
intlve_lratio_mat[i]= (double*)calloc(interlve_N,sizeof(double));
}
for(i=0;i<interlve_num;i++)
{
for (j=0;j<interlve_M;j++)
for(k=0;k<interlve_N;k++)
{
interlve_matrix[j][k]=rx_hard_demod_bit[interlve_M*interlve_N*i+interlve_N*j+k];
intlve_lratio_mat[j][k]=rx_ch_llr[interlve_M*interlve_N*i+interlve_N*j+k];
}
for (j=0;j<interlve_N;j++)
for(k=0;k<interlve_M;k++)
{
rx_bitdeinterved_bit[interlve_M*interlve_N*i+interlve_M*j+k]=interlve_matrix[k][j];
rx_ldpc_llr[interlve_M*interlve_N*i+interlve_M*j+k]=intlve_lratio_mat[k][j];
}
}
/** free the memory********/
for(i=0 ; i<interlve_M ; i++)
free(interlve_matrix[i] );
free(interlve_matrix);
for(i=0 ; i<interlve_M ; i++)
free(intlve_lratio_mat[i] );
free(intlve_lratio_mat);
break;
default:
printf("CHANNEL_RATE error in bit interlve.\n");
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -