📄 phi_xits.c
字号:
den += y[i] * y[i]; } r = num * num / den; /* =============================================================*/ /* Check if the curent lag is the best candidate */ /* =============================================================*/ if (r > rs) { ks = k; rs = r; *g = num / den; } } *vid = pi[ks]; /*==================================================================*/ /* Gain Quantisation */ /*==================================================================*/ i = *g < (float)0.0 ? -1 : 1; *g = (float)fabs((double)*g); for (j = 0; *g > (float)tbl_cba_dir[j].dec && j < QLa - 1; j ++); *g = (float) i * (float)tbl_cba_dir[j].rep; *gid = i == 1 ? (long)j : (((long)(-j - 1)) & 63); /*==================================================================*/ /* Free temp states */ /*==================================================================*/ free(y); free(yp); return;}/*---------------------------------------------------------------------------- computes residual signal after adaptive codebook----------------------------------------------------------------------------*/ void PHI_calc_cba_residual(long nos, /* In: Number of samples to be processed */float *vi, /* In: Succesful excitation candidate */ float gain, /* In: Gain of the adaptive codebook */ float *h, /* In: Impulse response of synthesis filt */float *t, /* In: The real target signal */float *e /* Out: Adapt-cbk residual: Target for f-cbk */){ float v; int i, j; for (i = 0; i < (int)nos; i ++) { v = (float)0.0; for (j = 0; j <= i; j ++) { v += h[i - j] * vi[j]; } e[i] = t[i] - gain * v; } return;}/*---------------------------------------------------------------------------- determines phase of the local rpe codebook vectors----------------------------------------------------------------------------*/void PHI_calc_cbf_phase(long pulse_spacing, /* In: Regular Spacing Between Pulses */long nos, /* In: Number of samples to be processed */float *tf, /* In: Backward filtered target signal */ long *p /* Out: Phase of the local RPE codebook vector*/){ float vs, v; int i, j; vs = -FLT_MAX; *p = 0; for (i = 0; i < (int)pulse_spacing; i ++) { for (j = i, v = (float)0.0; j < (int)nos; j += (int)pulse_spacing) { v += (float)fabs((double)tf[j]); } if (v > vs) { vs = v; *p = (long)i; } } return;}/*---------------------------------------------------------------------------- computes rpe pulse amplitude (Version 2:only computes amplitude)----------------------------------------------------------------------------*/void PHI_CompAmpArray(long num_of_pulses, /* In: Number of pulses in the sequence */long pulse_spacing, /* In: Regular Spacing Between Pulses */float *tf, /* In: Backward filtered target signal */ long p, /* In: Phase of the RPE codebook */long *amp /* Out: Pulse amplitudes +/- 1 */ ){ int i, k; float v; for (k = (int)p, i = 0; i < (int)num_of_pulses; k += (int)pulse_spacing, i ++) { v = tf[k]; if (v == (float)0.0) { amp[i] = 0; /* THIS SHOULD BE ZERO!!! */ } else { amp[i] = v > (float)0.0 ? (long)1 : (long)-1; } } return;}/*---------------------------------------------------------------------------- computes pos array {extension to Vienna code which only fixed 1 amp----------------------------------------------------------------------------*/void PHI_CompPosArray(long num_of_pulses, /* In: Number of pulses in the sequence */long pulse_spacing, /* In: Regular Spacing Between Pulses */long num_fxd_amps, /* IN: Number of fixed amplitudes */float *tf, /* In: Backward filtered target signal */ long p, /* In: Phase of the RPE codebook */long *pos /* Out: Pulse amplitudes +/- 1 */ ){ float *d_tmp; int i, nr_nonzero_samples; /*==================================================================*/ /* Allocate d_tmp */ /*==================================================================*/ if ((d_tmp = (float *)malloc((unsigned int)num_of_pulses * sizeof(float)))== NULL ) { fprintf(stderr, "\n Malloc Failure in CompPosArray:Excitation Anlaysis \n"); exit(1); } for (i = nr_nonzero_samples = 0; i < (int)num_of_pulses; i ++) { pos[i] = 0; d_tmp[i] = (float)fabs((double)tf[(int)p + i * (int)pulse_spacing]); if (d_tmp[i] > 0) nr_nonzero_samples++; } if (nr_nonzero_samples >= (int)num_fxd_amps) { for (i = 0; i < (int)num_fxd_amps; i ++) { float tmp = (float)0.0; int p_tmp = 0; int l; for(l = 0; l < (int)num_of_pulses; l++) { if (d_tmp[l] > tmp) { tmp = d_tmp[l]; p_tmp = l; } } pos[p_tmp] = 1; d_tmp[p_tmp] = (float)0; } } else { int l; for(i = 0; i < (int)num_of_pulses; i++) { if (d_tmp[i] > 0) { pos[i] = 1; } } for(i = 0, l = nr_nonzero_samples; l < num_fxd_amps; i++) { if (d_tmp[i] == 0) { pos[i] = 1; l++; } } } free(d_tmp); return;}/*---------------------------------------------------------------------------- generates local fixed codebook----------------------------------------------------------------------------*/void PHI_generate_cbf(long num_of_pulses, /* In: Number of pulses in the sequence */long pulse_spacing, /* In: Regular Spacing Between Pulses */long num_fcbk_vecs, /* In: #Vectors in the fixed code book */long nos, /* In: Number of samples to be processed */long **cb, /* Out: Generated Local Fixed Codebook */ long p, /* In: Phase of the codebook vector */long *amp, /* In: Pulse Amplitudes */ long *pos /* In: Array saying which are fixed amps */){ int i, j, k, m, n, index; for (i = 0; i < (int)num_fcbk_vecs; i ++) for (j = 0; j < (int)nos; j ++) cb[i][j] = 0; for (index = (int)p, i = 0; i < (int)num_of_pulses; index += (int)pulse_spacing, i ++) { cb[0][index] = amp[i]; } for (index = (int)p,i = 0, m = 1; i < (int)num_of_pulses; index += (int)pulse_spacing, i ++) { if (!pos[i]) { for (j = 0, k = m; j < k; j ++) { for (n = (int)p; n < (int)nos; n += (int)pulse_spacing) { cb[m][n] = cb[j][n]; } cb[m ++][index] = 0; } } } /* -----------------------------------------------------------------*/ /* To test the codebook content */ /* -----------------------------------------------------------------*/ /* for (i = 0; i < (int)num_fcbk_vecs; i ++) { for (j = (int)p; j < (int)nos; j += (int)pulse_spacing) printf("%3d ", cb[i][j]); printf("\n"); } printf("\n"); */ /* -----------------------------------------------------------------*/ return;}/*---------------------------------------------------------------------------- preselection of fixed codebook indices (Reduction from 16 to 5 WDBxx)----------------------------------------------------------------------------*/void PHI_cbf_preselection(long pulse_spacing, /* In: Regular Spacing Between Pulses */long num_fcbk_cands, /* In: #Preselected candidates for fixed cbk */long num_fcbk_vecs, /* In: #Vectors in the fixed code book */long nos, /* In: Number of samples to be processed */long **cb, /* In: Local fixed codebook,(Nf-1) by (nos-1)*/ long p, /* In: Phase of the RPE codebook */float *tf, /* In: Backward-filtered target signal */ float a, /* In: LPC coeffs of the preselection filter */long *pi /* Out: Result: Preselected Codebook Indices */){ float t1, t2, e; float *rfp; long is; int i, j; /*==================================================================*/ /* Allocate memory for rfp */ /*==================================================================*/ if ((rfp = (float *)malloc((unsigned int)num_fcbk_vecs * sizeof(float)))== NULL ) { fprintf(stderr, "\n Malloc Failure in Block:Excitation Anlaysis \n"); exit(1); } /*==================================================================*/ /* computes rfp ratios */ /*==================================================================*/ for (i = 0; i < (int)num_fcbk_vecs; i ++) { t1 = t2 = (float)0.0; e = FLT_MIN; for (j = 0; j < (int)nos; j ++) { t1 = t1 * a + (float) cb[i][j]; e += t1 * t1; } for (j = (int)p; j < (int)nos; j += (int)pulse_spacing) { t2 += (float) cb[i][j] * tf[j]; } rfp[i] = (t2 * t2) / e; } /*==================================================================*/ /* select Pf indices with largest rfp's */ /*==================================================================*/ for (j = 0; j < (int)num_fcbk_cands; j ++) { e = -FLT_MAX; for (i = 0; i < (int)num_fcbk_vecs; i ++) if (rfp[i] > e) { e = rfp[i]; is = (long)i; } assert(is < num_fcbk_vecs); pi[j] = is; rfp[is] = -FLT_MAX; } /*==================================================================*/ /* Free rfp */ /*==================================================================*/ free(rfp); return;}/*------------------------------------------------------------------------ fixed codebook search------------------------------------------------------------------------*/void PHI_cbf_search(long num_of_pulses, /* In: Number of pulses in the sequence */long pulse_spacing, /* In: Regular Spacing Between Pulses */long num_fcbk_cands, /* In: #Preselected candidates for fixed cbk */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -