📄 phi_xits.c
字号:
long nos, /* In: Number of samples to be processed */long **cb, /* In: Local fixed codebook */long p, /* In: Phase of the fixed codebook, 0 to D-1 */long *pi, /* In: Preselected codebook indices, p[0..Pf-1]*/float *h, /* In: Synthesis filter impulse response, */float *e, /* In: Target residual signal, e[0..nos-1] */float *gain, /* Out: Selected Fixed Codebook gain (Uncoded) */ long *gid, /* Out: Selected Fixed Codebook gain index */long *amp, /* Out: S rpe pulse amplitudes, amp[0..Np-1] */long n /* In: Subframe index, 0 to n_subframes-1 */){ static float gp ; float *y; float num, den; float g, r, rs; int ks; int i, j, k, m; rs = -FLT_MAX; /*==================================================================*/ /* Allocate temp states */ /*==================================================================*/ if ((y = (float *)malloc((unsigned int)nos * sizeof(float))) == NULL ) { fprintf(stderr, "\n Malloc Failure in Block: Excitation Anlaysis \n"); exit(1); } for (k = 0; k < (int)num_fcbk_cands; k ++) { for (i = 0; i < (int)nos; i ++) { register float temp_y = (float)0.0; for (j = (int)p; j <= i; j += (int)pulse_spacing) { temp_y += h[i - j] * (float) cb[pi[k]][j]; } y[i] = temp_y; } num = (float)0.0; den = FLT_MIN; for (i = 0; i < (int)nos; i ++) { num += e[i] * y[i]; den += y[i] * y[i]; } g = num / den; if (!n) { for (m = 0; g > (float)tbl_cbf_dir[m].dec && m < QLf - 1; m ++); g = (float)tbl_cbf_dir[m].rep; } else { g /= gp; for (m = 0; g > (float)tbl_cbf_dif[m].dec && m < QLfd - 1; m ++); g = gp * (float)tbl_cbf_dif[m].rep; } r = (float)2.0 * g * num - g * g * den; if (r > rs) { rs = r; ks = k; *gid = (long)m; *gain = g; } } for (k = (int)p, i = 0; i < (int)num_of_pulses; k += (int)pulse_spacing, i ++) { amp[i] = cb[pi[ks]][k]; } gp = *gain; /*==================================================================*/ /* Free temp states */ /*==================================================================*/ free(y); return;}/*---------------------------------------------------------------------------- encodes rpe pulse amplitudes and phase into one index ----------------------------------------------------------------------------*/void PHI_code_cbf_amplitude_phase(long num_of_pulses, /* In: Number of pulses in the sequence */long pulse_spacing, /* In: Regular Spacing Between Pulses */long *amp, /* In: Array of Pulse Amplitudes, amp[0..Np-1]*/long phase, /* In: The Phase of the RPE sequence */long *index /* Out: Coded Index: Fixed Codebook index */){ int i; long ac = 0; for (i = 0; i < (int)num_of_pulses; i ++) { ac = (ac * 3) + (amp[i] == -1 ? (long)0 : (amp[i] == 1 ? (long)1 : (long)2)); } ac *= pulse_spacing; *index = ac + phase; return;}/*---------------------------------------------------------------------------- Decodes the RPE amplitudes and phase from the cbk-index----------------------------------------------------------------------------*/voidPHI_decode_cbf_amplitude_phase(const long num_of_pulses, /* In: Number of pulses in the sequence */const long pulse_spacing, /* In: Regular Spacing Between Pulses */long * const amp, /* Out: The Array of pulse amplitudes */long * const phase, /* Out: The phase of the RPE sequence */ const long index /* In: Coded Fixed codebook index */){ int i; long ac; /* =================================================================*/ /* Extract the phase First */ /* =================================================================*/ *phase = (index % pulse_spacing); ac = index - *phase; ac /= pulse_spacing; /* =================================================================*/ /* The remainder is used to extract the amplitude values */ /* =================================================================*/ for (i = (int)num_of_pulses - 1; i >= 0; i--) { amp[i] = (ac % 3); ac /= 3; /*==============================================================*/ /* Only 3 amplitude values are permitted */ /*==============================================================*/ if (amp[i] == 0) amp[i] = -1; else if (amp[i] == 2) amp[i] = 0; else if (amp[i] == 1) amp[i] = 1; else { fprintf(stderr, "FATAL ERROR: Unpermitted Amplitude Value \n"); exit(1); } } return;}/*---------------------------------------------------------------------------- Decodes the Adaptive-Codebook Gain----------------------------------------------------------------------------*/voidPHI_DecodeAcbkGain(long acbk_gain_index,float *gain){ int i, j; if (acbk_gain_index > 31) { acbk_gain_index = -(64 - acbk_gain_index); } if (acbk_gain_index < 0) { i = -1; j = (-1 * (int)acbk_gain_index) - 1; } else { i = 1; j = (int)acbk_gain_index; } *gain = (float)i * (float)tbl_cba_dir[j].rep;}/*---------------------------------------------------------------------------- Decodes the Fixed-Codebook Gain----------------------------------------------------------------------------*/voidPHI_DecodeFcbkGain(long fcbk_gain_index,long ctr,float prev_gain, float *gain){ if (ctr == 0) { *gain = (float)tbl_cbf_dir[fcbk_gain_index].rep; } else { *gain = (float)tbl_cbf_dif[fcbk_gain_index].rep * prev_gain; }}/*------------------------------------------------------------------------ computes excitation of the adaptive codebook------------------------------------------------------------------------*/void PHI_calc_cba_excitation(long nos, /* In: Number of samples to be updated */long max_lag, /* In: Maximum Permitted Adapt cbk Lag */long min_lag, /* In: Minimum Permitted Adapt cbk Lag */float *cb, /* In: The current Adaptive codebook content*/ long idx, /* In: The chosen lag candidate */float *v /* Out: The Adaptive Codebook contribution */){ int i, j; i = (int)(max_lag - min_lag - idx); for (j = 0; j < (int)nos; j ++) v[j] = cb[i + j]; return;}/*---------------------------------------------------------------------------- computes excitation of the fixed codebook----------------------------------------------------------------------------*/void PHI_calc_cbf_excitation(long nos, /* In: Number of samples to be updated */long num_of_pulses, /* In: Number of pulses in the sequence */long pulse_spacing, /* In: Regular Spacing Between Pulses */long *amp, /* In: Aray of RPE pulse amplitudes */long p, /* In: Phase of the RPE sequence */float *v /* Out: The fixed codebook contribution */){ int i,k; for (i = 0; i < (int)nos; i ++) v[i] = (float)0; for (k = 0, i = (int)p; k < (int)num_of_pulses; i += (int)pulse_spacing, k++) v[i] = (float)amp[k]; return;}/*---------------------------------------------------------------------------- compute the sum of the excitations----------------------------------------------------------------------------*/void PHI_sum_excitations ( long nos, /* In: Number of samples to be updated */float again, /* In: Adaptive Codebook gain */ float *asig, /* In: Adaptive Codebook Contribution */ float fgain, /* In: Fixed Codebook gain */ float *fsig, /* In: Fixed Codebook Contribution */ float *sum_sig /* Out: The Excitation sequence */){ int k; for(k = 0; k < (int)nos; k++) { sum_sig[k] = again * asig[k] + fgain * fsig[k]; } return;}/*---------------------------------------------------------------------------- update adaptive codebook with the total excitation computed----------------------------------------------------------------------------*/void PHI_update_cba_memory(long nos, /* In: Number of samples to be updated */long max_lag, /* In: Maximum Adaptive Codebook Lag */float *cb, /* In/Out: Adaptive Codebook */ float *vi /* In: Sum of adaptive and fixed excitaion */){ int i; for (i = (int)nos; i < (int)max_lag; i ++) cb[i - (int)nos] = cb[i]; for (i = 0; i < (int)nos; i ++) cb[(int)max_lag - 1 - i] = vi[(int)nos - 1 - i]; return;}/*--------------------------------------------------------------------------- update synthesis filter states----------------------------------------------------------------------------*/void PHI_update_filter_states(long nos, /* In: Number of samples */long order, /* In: Order of the LPC */ float *vi, /* In: Total Codebook contribution */float *vp, /* In/Out: Filter States, vp[0..order-1] */ float *a /* In: Lpc Coefficients, a[0..order-1] */){ float v; int i, j; for (i = 0; i < (int)nos; i ++) { v = vi[i]; for (j = 0; j < (int)order; j ++) v += a[j] * vp[j]; for (j = (int)order - 1; j > 0; j --) vp[j] = vp[j - 1]; vp[0] = v; } return;}/*======================================================================*//* H I S T O R Y *//*======================================================================*//* 17-04-96 R. Taori Initial Version *//* 13-08-96 R. Taori Added 2 subroutines CompAmpArray CompPosArray *//* Modified generate_cbf to reflect the above */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -