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

📄 nb_celp_dec.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 C
📖 第 1 页 / 共 2 页
字号:
	float bws_mp_exc[],            /* out: decoded excitation */
	long *acb_delay,               /* out: adaptive code delay */
	float *adaptive_gain,          /* out: adaptive code gain */
    long dec_enhstages,
    long postfilter,
    long SampleRateMode
)
{

    float *tmp_lpc_coefficients;
    long i;

    long num_lpc_indices;

    if(fs8kHz==SampleRateMode) {
        num_lpc_indices = PAN_NUM_LPC_INDICES;
    }else {
        num_lpc_indices = PAN_NUM_LPC_INDICES_W;
    }

    if((tmp_lpc_coefficients=(float *)calloc(lpc_order, sizeof(float)))==NULL) {
		printf("\n Memory allocation error in abs_exc_generation\n");
		exit(1);
	}

    for(i=0;i<lpc_order;i++) 
        tmp_lpc_coefficients[i] = -int_Qlpc_coefficients[i];

       nec_abs_excitation_generation(
        tmp_lpc_coefficients,  /* in: interpolated LPC */
        shape_indices,         /* in: shape code indices */
        gain_indices,          /* in: gain code indices */
        rms_index,             /* in: RMS code index */
        signal_mode,             /* in: signal mode */
        excitation,            /* out: decoded excitation */
        adaptive_gain,         /* out: adaptive code gain */
        acb_delay,             /* out: adaptive code delay */
        lpc_order,             /* in: order of LPC */
        sbfrm_size,            /* in: subframe size */
        n_subframes,           /* in: number of subframes */
	org_frame_bit_allocation+num_lpc_indices,
        num_shape_cbks,        /* in: number of shape codebooks */
        num_gain_cbks,          /* in: number of gain codebooks */
	dec_enhstages,             /* in: number of enhancement stages */
        bws_mp_exc,
	postfilter,
        SampleRateMode		     );

    if ( tmp_lpc_coefficients != NULL)FREE(tmp_lpc_coefficients);

}

void bws_excitation_generation(
	unsigned long shape_indices[],          /* in: shape code indices */
	unsigned long gain_indices[],           /* in: gain code indices */
	long num_shape_cbks,           /* in: number of shape codebooks */
    long num_gain_cbks,            /* in: number of gain codebooks */
	unsigned long rms_index,                /* in: RMS code index */
	float int_Qlpc_coefficients[], /* in: interpolated LPC */
	long lpc_order,                /* in: order of LPC */
	long sbfrm_size,               /* in: subframe size */
	long n_subframes,              /* in: number of subframes */
	unsigned long signal_mode,              /* in: signal mode */
	long org_frame_bit_allocation[],   /* in: bit number for each index */
	float excitation[],            /* out: decoded excitation */
	float bws_mp_exc[],            /* in: decoded mp excitation */
	long acb_indx_8[],	       /* in: acb_delay */
	long *acb_delay,               /* out: adaptive code delay */
	float *adaptive_gain,           /* out: adaptive code gain */
    long postfilter
)
{

    float *tmp_lpc_coefficients;
    long i;

    if((tmp_lpc_coefficients=(float *)calloc(lpc_order, sizeof(float)))==NULL) {
       printf("\n Memory allocation error in abs_exc_generation\n");
       exit(1);
    }

    for(i=0;i<lpc_order;i++) 
       tmp_lpc_coefficients[i] = -int_Qlpc_coefficients[i];

    nec_bws_excitation_generation(
        tmp_lpc_coefficients,  /* in: interpolated LPC */
        shape_indices,         /* in: shape code indices */
        gain_indices,          /* in: gain code indices */
        rms_index,             /* in: RMS code index */
        signal_mode,           /* in: signal_mode */
        excitation,            /* out: decoded excitation */
        adaptive_gain,         /* out: adaptive code gain */
        acb_delay,             /* out: adaptive code delay */
        lpc_order,             /* in: order of LPC */
        sbfrm_size,            /* in: subframe size */
        n_subframes,           /* in: number of subframes */
	org_frame_bit_allocation,
        num_shape_cbks,        /* in: number of shape codebooks */
        num_gain_cbks,          /* in: number of gain codebooks */
	bws_mp_exc,
        acb_indx_8, postfilter );

   FREE(tmp_lpc_coefficients);

}

void nb_abs_postprocessing(
	float synth_signal[], 		/* input */
	float PP_synth_signal[],		/* output */
	float int_Qlpc_coefficients[], /* input */
	long lpc_order, 		/* configuration input */
	long sbfrm_sizes, 	/* configuration input */
	long acb_delay, 		/* input */
	float adaptive_gain /* input */
)
{

    float *tmp_lpc_coefficients;
    long i;

    if((tmp_lpc_coefficients=(float *)calloc(lpc_order, sizeof(float)))==NULL) {
		printf("\n Memory allocation error in abs_postprocessing\n");
		exit(1);
	}

    for(i=0;i<lpc_order;i++) 
        tmp_lpc_coefficients[i] = -int_Qlpc_coefficients[i];

    att_abs_postprocessing(
		synth_signal, 		/* input */
		PP_synth_signal,		/* output */
		tmp_lpc_coefficients, /* input */
		lpc_order, 		/* configuration input */
		sbfrm_sizes, 	/* configuration input */
		acb_delay, 		/* input */
		adaptive_gain /* input */
			     );

   FREE(tmp_lpc_coefficients);

}

void wb_celp_lsp_decode(
    unsigned long lpc_indices[], 	/* in: LPC code indices */
    float int_Qlpc_coefficients[],	/* out: quantized & interpolated LPC*/ 
    long lpc_order,			        /* in: order of LPC */
    long n_subframes,               /* in: number of subframes */
    float *prev_Qlsp_coefficients
)
{

    #include	"inc_lsp46w.tbl"

    float *Qlsp_coefficients;
    float *int_Qlsp_coefficients;
    float *tmp_lpc_coefficients;
    long i, j;

    float *lsp_tbl;
    float *d_tbl;
    float *pd_tbl;
    long *dim_1;
    long *dim_2;
    long *ncd_1;
    long *ncd_2;

    long offset;
    long orderLsp;

/* Memory allocation */
    if((Qlsp_coefficients=(float *)calloc(lpc_order, sizeof(float)))==NULL) {
		printf("\n Memory allocation error in abs_lpc_quantizer\n");
		exit(1);
	}
    if((int_Qlsp_coefficients=(float *)calloc(lpc_order, sizeof(float)))==NULL) {
		printf("\n Memory allocation error in abs_lpc_quantizer\n");
		exit(2);
	}
    if((tmp_lpc_coefficients=(float *)calloc(lpc_order+1, sizeof(float)))==NULL) {
		printf("\n Memory allocation error in abs_lpc_quantizer\n");
		exit(3);
	}

/* LSP decode - lower part */
    orderLsp = dim46w_L1[0]+dim46w_L1[1];
    lsp_tbl = lsp_tbl46w_L;
    d_tbl = d_tbl46w_L;
    pd_tbl = pd_tbl46w_L;
    dim_1 = dim46w_L1;
    dim_2 = dim46w_L2;
    ncd_1 = ncd46w_L1;
    ncd_2 = ncd46w_L2;
    pan_lspdec(prev_Qlsp_coefficients, Qlsp_coefficients, 
            PAN_LSP_AR_R_CELP_W, PAN_MINGAP_CELP_W, orderLsp, lpc_indices, 
            lsp_tbl, d_tbl, pd_tbl, dim_1, ncd_1, dim_2, ncd_2, 0, 1);

/* LSP decode - upper part */
    offset = dim46w_L1[0]+dim46w_L1[1];
    orderLsp = dim46w_U1[0]+dim46w_U1[1];
    lsp_tbl = lsp_tbl46w_U;
    d_tbl = d_tbl46w_U;
    pd_tbl = pd_tbl46w_U;
    dim_1 = dim46w_U1;
    dim_2 = dim46w_U2;
    ncd_1 = ncd46w_U1;
    ncd_2 = ncd46w_U2;
    pan_lspdec(prev_Qlsp_coefficients+offset, Qlsp_coefficients+offset, 
            PAN_LSP_AR_R_CELP_W, PAN_MINGAP_CELP_W, orderLsp, lpc_indices+5, 
            lsp_tbl, d_tbl, pd_tbl, dim_1, ncd_1, dim_2, ncd_2, 0, 1);

    pan_stab(Qlsp_coefficients, PAN_MINGAP_CELP_W, lpc_order);

/* for Testing 
	for(i=0;i<lpc_order;i++) printf("%7.5f ", Qlsp_coefficients[i]);
	printf("\n");
*/

/* Interpolation & LSP -> LPC conversion */
    for(i=0;i<n_subframes;i++) {
        pan_lsp_interpolation(prev_Qlsp_coefficients, Qlsp_coefficients, 
                int_Qlsp_coefficients, lpc_order, n_subframes, i);

        for(j=0;j<lpc_order;j++) int_Qlsp_coefficients[j] *= PAN_PI;

        lsf2pc(tmp_lpc_coefficients, int_Qlsp_coefficients, lpc_order);

        for(j=0;j<lpc_order;j++) 
                int_Qlpc_coefficients[lpc_order*i+j] 
                    = -tmp_lpc_coefficients[j+1];
    }

    pan_mv_fdata(prev_Qlsp_coefficients, Qlsp_coefficients, lpc_order);

   FREE(Qlsp_coefficients);
   FREE(int_Qlsp_coefficients);
   FREE(tmp_lpc_coefficients);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -