📄 wib_dl_cc.c
字号:
break;
case 576 :
for(i=0; i < blocksize; i++) {
dat_out[i] = dat_in[addint_CC_16QAM_576[i]];
}
break;
default :
printf("ERROR: No such block size(16QAM-Intlver)!");
break;
}
break;
case 6 : //64QAM
switch(blocksize) {
case 288 :
for(i=0; i < blocksize; i++) {
dat_out[i] = dat_in[addint_CC_64QAM_288[i]];
}
break;
case 576 :
for(i=0; i < blocksize; i++) {
dat_out[i] = dat_in[addint_CC_64QAM_576[i]];
}
break;
default :
printf("ERROR: No such block size(64QAM-Intlver)!");
break;
}
break;
default :
printf("<<<< Error: Not a valid modulation type(Intlver)! >>>>");
break;
}
BitToByte
(
dat_out, //Bit
p_dat_out, //Byte
blocksize //Bit length
);
if(dat_in != NULL) {
free(dat_in);
}
if(dat_out != NULL) {
free(dat_out);
}
return (0);
}
/*
* *************************************************************************************
* *
* CC Decoder *
* *
* -------------------------------------------------------------------------------------
*/
/*
* *************************************************************************************
* function: edis module
* parameters: void
* return: void
* description: edis module
* Author : caolin
* -------------------------------------------------------------------------------------
*/
UINT8 viterbi_edis(
UINT8 eras_x,
UINT8 eras_y,
UINT8 rr_x_reg,
UINT8 rr_y_reg,
UINT8 g,
UINT8 *bm)
{
switch(g) {
case 0 :
switch((((eras_x << 1) & 0x02) | (eras_y & 0x01)) & 0x03) {
case 0 :
*bm = 0x00;
break;
case 1 :
*bm = rr_y_reg;
break;
case 2 :
*bm = rr_x_reg;
break;
case 3 :
*bm = (UINT8)(rr_x_reg +rr_y_reg);
break;
}
break;
case 1 :
switch((((eras_x << 1) & 0x02) | (eras_y & 0x01)) & 0x03) {
case 0 :
*bm = 0x00;
break;
case 1 :
*bm = (UINT8)(0x07- rr_y_reg);
break;
case 2 :
*bm = rr_x_reg;
break;
case 3 :
*bm = (UINT8)(rr_x_reg + 0x07- rr_y_reg);
break;
}
break;
case 2 :
switch((((eras_x << 1) & 0x02) | (eras_y & 0x01)) & 0x03) {
case 0 :
*bm = 0x00;
break;
case 1 :
*bm = rr_y_reg;
break;
case 2 :
*bm = (UINT8)(0x07- rr_x_reg);
break;
case 3 :
*bm = (UINT8)(0x07- rr_x_reg + rr_y_reg);
break;
}
break;
case 3 :
switch((((eras_x << 1) & 0x02) | (eras_y & 0x01)) & 0x03) {
case 0 :
*bm = 0x00;
break;
case 1 :
*bm = (UINT8)(0x07- rr_y_reg);
break;
case 2 :
*bm = (UINT8)(0x07- rr_x_reg);
break;
case 3 :
*bm = (UINT8)(0x07- rr_x_reg + 0x07- rr_y_reg);
break;
}
break;
default :
printf("<<<< Error: Not a valid g value(viterbi_edis)! >>>>\n");
break;
}
return(0);
}
/*
* *************************************************************************************
* function: acs module
* parameters: void
* return: void
* description: acs module
* Author : caolin
* -------------------------------------------------------------------------------------
*/
//_inline UINT8 viterbi_acs(
UINT8 viterbi_acs(
UINT8 distance1,
UINT8 distance0,
UINT8 path_metc1,
UINT8 path_metc0,
UINT8 subtrahend,
UINT8 * surv,
UINT8 * metc)
{
if((distance1 + path_metc1) >= (distance0 + path_metc0)) {
* surv = 0x00;
* metc = (UINT8)(distance0 + path_metc0 - subtrahend);
} else {
* surv = 0x01;
* metc = (UINT8)(distance1 + path_metc1 - subtrahend);
}
return(0);
}
/*
* *************************************************************************************
* function: dl_viterbi_decode module
* parameters:
* UINT8 *p_dat_in, // decode data input 3 bits (after deinterleave)
* UINT16 dat_len, // decode data length (after deinterleave)
* UINT8 cc_pun, // puncturing parameter 2 :1/2,4 :2/3,6 :3/4,10 :5/6
* UINT8 cc_dpun, // depuncturing parameter 2 :1/2,3 :2/3,4 :3/4, 6 :5/6
* UINT8 *p_dat_out // decode data output 8 bits (bit)
* return: void
* description: dl_viterbi_decode module
* Author : caolin
* -------------------------------------------------------------------------------------
*/
int dl_viterbi_decode
(
UINT8 *p_dat_in, // decode data input 3 bits (after deinterleave)
UINT8 *p_dat_out, // decode data output (byte)
UINT16 dat_len, // decode data length (after deinterleave)
UINT8 rate_id
)
{
UINT8 g_tab[128] = {
0,3,1,2,0,3,1,2,3,0,2,1,3,0,2,1,3,0,2,1,3,0,2,1,0,3,1,2,0,3,1,2,
2,1,3,0,2,1,3,0,1,2,0,3,1,2,0,3,1,2,0,3,1,2,0,3,2,1,3,0,2,1,3,0,
3,0,2,1,3,0,2,1,0,3,1,2,0,3,1,2,0,3,1,2,0,3,1,2,3,0,2,1,3,0,2,1,
1,2,0,3,1,2,0,3,2,1,3,0,2,1,3,0,2,1,3,0,2,1,3,0,1,2,0,3,1,2,0,3};
UINT16 tailbit_len = 0;
UINT16 depun_len = 0;
UINT16 decod_len = 0;
UINT16 i,k;
int j;
UINT8 kk;
UINT8 start_state = 0x00;
UINT8 small_metc = 0x00;
UINT8 small_tmp = 0x00;
UINT8 cc_pun = 0x00;
UINT8 cc_dpun = 0x00;
UINT8 of_flag = 0x00;
UINT16 of_time = 0;
UINT8 of_cnt = 0x00;
UINT8 eudis[STATE_NUM * 2] = {0};
UINT8 path_metc[STATE_NUM] = {0};
UINT8 path_metc_tmp[STATE_NUM] ={0};
UINT8 sur_tmp[STATE_NUM] = {0};
UINT8 sur_2ary[64*TRANC_LEN] = {0};
UINT8 *data_in = NULL;
UINT8 *eras_sym = NULL;
UINT8 *depun_dat = NULL;
UINT8 *vtbit_tmp = NULL;
UINT8 *dat_out = NULL;
//parameter Generate
switch(rate_id) {
case 0 :
cc_pun = 0x02;
cc_dpun = 0x02;
break;
case 1 :
cc_pun = 0x06;
cc_dpun = 0x04;
break;
case 2 :
cc_pun = 0x02;
cc_dpun = 0x02;
break;
case 3 :
cc_pun = 0x06;
cc_dpun = 0x04;
break;
case 4 :
cc_pun = 0x02;
cc_dpun = 0x02;
break;
case 5 :
cc_pun = 0x04;
cc_dpun = 0x03;
break;
case 6 :
cc_pun = 0x06;
cc_dpun = 0x04;
break;
default :
printf("<<<< Error: Not a valid rate_id for CC decode(dl_viterbi_decode)! >>>>\n");
break;
}
// total length
tailbit_len = (UINT16)(PADDI_LEN*2*cc_dpun/cc_pun + dat_len);
//memory malloc
data_in = malloc(tailbit_len*sizeof(UINT8));
if(data_in == NULL) {
printf("data_in in dl_viterbi_decode malloc fail!!\n");
return(-1);
}
decod_len = (UINT16)(tailbit_len*cc_pun/cc_dpun/2);
eras_sym = malloc(tailbit_len*cc_pun/cc_dpun*sizeof(UINT8));
if(eras_sym == NULL) {
printf("eras_sym in dl_viterbi_decode malloc fail!!\n");
return(-1);
}
depun_dat = malloc(tailbit_len*cc_pun/cc_dpun*sizeof(UINT8));
if(depun_dat == NULL) {
printf("depun_dat in dl_viterbi_decode malloc fail!!\n");
return(-1);
}
vtbit_tmp = malloc((decod_len+1)*sizeof(UINT8));
if(vtbit_tmp == NULL) {
printf("vtbit_tmp in dl_viterbi_decode malloc fail!!\n");
return(-1);
}
dat_out = malloc(decod_len*sizeof(UINT8));
if(dat_out == NULL) {
printf("dat_out in dl_viterbi_decode malloc fail!!\n");
return(-1);
}
// Tail biting decode
// original data
for(i=0; i < dat_len; i++) {
data_in[i] = p_dat_in[i];
}
// padding data
for(i=dat_len; i < tailbit_len; i++) {
data_in[i] = p_dat_in[i-dat_len];
}
// De-puncturing
depun_len = (UINT16)(tailbit_len/cc_dpun);
for(i=0; i < depun_len; i++) {
switch(cc_dpun) {
case 2 :
depun_dat[i * 2] = data_in[i * cc_dpun];
depun_dat[i * 2 + 1] = data_in[i * cc_dpun + 1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -