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

📄 wib_dl_cc.c

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