📄 wib_dl_cc.c
字号:
eras_sym[i * 2] = 0x01;
eras_sym[i * 2 + 1] = 0x01;
break;
case 3 :
depun_dat[i * 4] = data_in[i * cc_dpun];
depun_dat[i * 4 + 1] = data_in[i * cc_dpun + 1];
depun_dat[i * 4 + 2] = 0x00;
depun_dat[i * 4 + 3] = data_in[i * cc_dpun + 2];
eras_sym[i * 4] = 0x01;
eras_sym[i * 4 + 1] = 0x01;
eras_sym[i * 4 + 2] = 0x00;
eras_sym[i * 4 + 3] = 0x01;
break;
case 4 :
depun_dat[i * 6] = data_in[i * cc_dpun];
depun_dat[i * 6 + 1] = data_in[i * cc_dpun + 1];
depun_dat[i * 6 + 2] = 0x00;
depun_dat[i * 6 + 3] = data_in[i * cc_dpun + 2];
depun_dat[i * 6 + 4] = data_in[i * cc_dpun + 3];
depun_dat[i * 6 + 5] = 0x00;
eras_sym[i * 6] = 0x01;
eras_sym[i * 6 + 1] = 0x01;
eras_sym[i * 6 + 2] = 0x00;
eras_sym[i * 6 + 3] = 0x01;
eras_sym[i * 6 + 4] = 0x01;
eras_sym[i * 6 + 5] = 0x00;
break;
default :
printf("<<<< Error: Not a valid cc_dpun value(dl_viterbi_decode)! >>>>\n");
break;
}
}
// viterbi decode
for(i=0; i < decod_len; i++) {
// e distance calculate
for(j=0; j < STATE_NUM*2; j++) {
viterbi_edis(eras_sym[2*i],eras_sym[2*i+1],depun_dat[2*i],depun_dat[2*i+1],g_tab[j],&eudis[j]);
}
for(k=0; k < STATE_NUM; k++) {
path_metc_tmp[k] = path_metc[k];
}
//----------------------------------------------------------------------
for(kk=0; kk < STATE_NUM; kk++) {
if(path_metc[kk] & 0x80) {
of_flag = 0x01;
}
}
//--------------------------------------------
if(of_flag) {
of_cnt = (UINT8)(of_cnt + 0x01);
}
//--------------------------------------------
if(of_flag == 0x01 && of_cnt == 0x02) {
of_time = i;
small_tmp = path_metc[0];
for(k=1; k < STATE_NUM; k++) {
// calculate the least value.
if(small_tmp<=path_metc[k])
small_tmp = small_tmp;
else
small_tmp = path_metc[k];
}
}
//--------------------------------------------
if(i == of_time + 3) {
small_metc = small_tmp;
small_tmp = 0x00;
of_time = 0;
of_flag = 0x00;
of_cnt = 0x00;
} else {
small_metc = 0x00;
small_tmp = small_tmp;
of_time = of_time;
of_flag = of_flag;
of_cnt = of_cnt;
}
//----------------------------------------------------------------------
// add compare select
for(kk=0; kk < STATE_NUM; kk++) {
if(kk < 32) {
viterbi_acs(eudis[2*kk+1],eudis[2*kk],path_metc[2*kk+1],path_metc[2*kk],small_metc,&sur_tmp[kk],&path_metc[kk]);
} else {
viterbi_acs(eudis[2*kk+1],eudis[2*kk],path_metc_tmp[2*kk+1-STATE_NUM],path_metc_tmp[2*kk-STATE_NUM],small_metc,&sur_tmp[kk],&path_metc[kk]);
}
// surrivor path save
if(i < 6)
sur_2ary[i*STATE_NUM+kk] = 0x00;
else
sur_2ary[(i%TRANC_LEN)*STATE_NUM + kk] = sur_tmp[kk];
}
// tranceback
if(i > TRANC_LEN/2) {
if(i%TRANC_LEN == TRANC_LEN-1) {
start_state = 0x00;
for(k=0; k < TRANC_LEN; k++) {
start_state = (UINT8)((((start_state << 1)&0x3E) | (sur_2ary[(TRANC_LEN-k-1)*STATE_NUM + start_state]&0x01)) & 0x3F);
if(k > (TRANC_LEN/2-1)) {
vtbit_tmp[i -k] = (UINT8)((start_state>>5) & 0x01);
}
}
} else if(i%(TRANC_LEN/2) == (TRANC_LEN/2-1)) {
start_state = 0x00;
for(k=0; k < TRANC_LEN/2; k++) {
start_state = (UINT8)((((start_state << 1)&0x3E) | (sur_2ary[((TRANC_LEN/2-1)-k)*STATE_NUM + start_state]&0x01)) & 0x3F);
}
for(k=0; k < TRANC_LEN/2; k++) {
start_state = (UINT8)((((start_state << 1)&0x3E) | (sur_2ary[(TRANC_LEN-k-1)*STATE_NUM + start_state]&0x01)) & 0x3F);
vtbit_tmp[i -k -TRANC_LEN/2] = (UINT8)((start_state>>5) & 0x01);
}
}
}
if(i == decod_len-1) {
start_state = 0x00;
if(decod_len%TRANC_LEN == 0) {
for(k=0; k < TRANC_LEN/2; k++) { // OK
start_state = (UINT8)((((start_state << 1)&0x3E) | (sur_2ary[(TRANC_LEN-k-1)*STATE_NUM + start_state]&0x01)) & 0x3F);
vtbit_tmp[i -k] = (UINT8)((start_state>>5) & 0x01);
}
} else if(decod_len%(TRANC_LEN/2) == 0) { // OK
for(k=0; k < TRANC_LEN/2; k++) {
start_state = (UINT8)((((start_state << 1)&0x3E) | (sur_2ary[(TRANC_LEN/2-k-1)*STATE_NUM + start_state]&0x01)) & 0x3F);
vtbit_tmp[i -k] = (UINT8)((start_state>>5) & 0x01);
}
} else if(decod_len%(TRANC_LEN/2) == decod_len%TRANC_LEN && decod_len > TRANC_LEN) { // OK
for(k=0; k < decod_len%(TRANC_LEN/2); k++) {
start_state = (UINT8)((((start_state << 1)&0x3E) | (sur_2ary[(decod_len%(TRANC_LEN/2) -k -1)*STATE_NUM + start_state]&0x01)) & 0x3F);
vtbit_tmp[i -k] = (UINT8)((start_state>>5) & 0x01);
}
for(k=0; k < TRANC_LEN/2; k++) {
start_state = (UINT8)((((start_state << 1)&0x3E) | (sur_2ary[(TRANC_LEN-k-1)*STATE_NUM + start_state]&0x01)) & 0x3F);
vtbit_tmp[i -k -decod_len%(TRANC_LEN/2)] = (UINT8)((start_state>>5) & 0x01);
}
} else {
for(k=0; k < decod_len%TRANC_LEN; k++) { //OK
start_state = (UINT8)((((start_state << 1)&0x3E) | (sur_2ary[(decod_len%TRANC_LEN -k -1)*STATE_NUM + start_state]&0x01)) & 0x3F);
vtbit_tmp[i -k] = (UINT8)((start_state>>5) & 0x01);
}
}
}
}
vtbit_tmp[decod_len] = 0x00;
for(i=0; i < decod_len-1; i++) {
dat_out[i] = vtbit_tmp[i+1];
}
dat_out[decod_len-1] = 0x00;
BitToByte
(
dat_out, //Bit
p_dat_out, //Byte
(UINT16)(decod_len - PADDI_LEN) //Bit length
);
/**************************************************************/
if(data_in != NULL) {
free(data_in);
}
if(depun_dat != NULL) {
free(depun_dat);
}
if(eras_sym != NULL) {
free(eras_sym);
}
if(vtbit_tmp != NULL) {
free(vtbit_tmp);
}
if(dat_out != NULL) {
free(dat_out);
}
return(0);
}
/*
* *************************************************************************************
* *
* CC D-Interleaver *
* *
* -------------------------------------------------------------------------------------
*/
/*
* *************************************************************************************
* function: CC_DIntlver module
* parameters:
* UINT8 *p_dat_in, // block data input (bit)
* UINT8 *p_dat_out, // block data output(CC D-interleave result,bit)
* UINT16 blocksize, // block size
* UINT8 rate_id,
* description: CC deinterleave module
* Author : caolin
* -------------------------------------------------------------------------------------
*/
int dl_deinterleave
(
UINT8 *p_dat_in, // block data input (bit)
UINT8 *p_dat_out, // block data output(CC D-interleave result,bit)
UINT16 blocksize, // block size
UINT8 rate_id
)
{
UINT16 i=0;
UINT8 mod_type = 0x00;
//parameter Generate
switch(rate_id) {
case 0 :
case 1 :
mod_type = 0x02;
break;
case 2 :
case 3 :
mod_type = 0x04;
break;
case 4 :
case 5 :
case 6 :
mod_type = 0x06;
break;
default :
printf("<<<< Error: Not a valid rate_id for CC deinterleave(dl_deinterleave)! >>>>\n");
break;
}
//Deinterleave
switch(mod_type) {
case 2 : //QPSK
switch(blocksize) {
case 96 :
for(i=0; i < blocksize; i++) {
p_dat_out[addint_CC_QPSK_96[i]] = p_dat_in[i];
}
break;
case 192 :
for(i=0; i < blocksize; i++) {
p_dat_out[addint_CC_QPSK_192[i]] = p_dat_in[i];
}
break;
case 288 :
for(i=0; i < blocksize; i++) {
p_dat_out[addint_CC_QPSK_288[i]] = p_dat_in[i];
}
break;
case 384 :
for(i=0; i < blocksize; i++) {
p_dat_out[addint_CC_QPSK_384[i]] = p_dat_in[i];
}
break;
case 480 :
for(i=0; i < blocksize; i++) {
p_dat_out[addint_CC_QPSK_480[i]] = p_dat_in[i];
}
break;
case 576 :
for(i=0; i < blocksize; i++) {
p_dat_out[addint_CC_QPSK_576[i]] = p_dat_in[i];
}
break;
default :
printf("ERROR: No such block size(QPSK-DIntlver)!!\n");
break;
}
break;
case 4 : //16QAM
switch(blocksize) {
case 192 :
for(i=0; i < blocksize; i++) {
p_dat_out[addint_CC_16QAM_192[i]] = p_dat_in[i];
}
break;
case 384 :
for(i=0; i < blocksize; i++) {
p_dat_out[addint_CC_16QAM_384[i]] = p_dat_in[i];
}
break;
case 576 :
for(i=0; i < blocksize; i++) {
p_dat_out[addint_CC_16QAM_576[i]] = p_dat_in[i];
}
break;
default :
printf("ERROR: No such block size(16QAM-DIntlver)!!\n");
break;
}
break;
case 6 : //64QAM
switch(blocksize) {
case 288 :
for(i=0; i < blocksize; i++) {
p_dat_out[addint_CC_64QAM_288[i]] = p_dat_in[i];
}
break;
case 576 :
for(i=0; i < blocksize; i++) {
p_dat_out[addint_CC_64QAM_576[i]] = p_dat_in[i];
}
break;
default :
printf("ERROR: No such block size(64QAM-DIntlver)!!\n");
break;
}
break;
default :
printf("<<<< Error: Not a valid modulation type(DIntlver)!!\n >>>>");
break;
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -