⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wib_dl_cc.c

📁 802.16e物理层下行卷积编码。严格按照802.16e实现。
💻 C
📖 第 1 页 / 共 4 页
字号:
					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 + -