/*---------------------------------------------------------------------------- * pst_ltp - harmonic postfilter *---------------------------------------------------------------------------- */ static void pst_ltpe( int t0, /* input : pitch delay given by coder */ FLOAT *ptr_sig_in, /* input : postfilter input filter (residu2) */ FLOAT *ptr_sig_pst0, /* output: harmonic postfilter output */ int *vo, /* output: voicing decision 0 = uv, > 0 delay */ FLOAT gamma_harm /* input: harmonic postfilter coefficient */ ) { /**** Declare variables */ int ltpdel, phase; FLOAT num_gltp, den_gltp; FLOAT num2_gltp, den2_gltp; FLOAT gain_plt; FLOAT y_up[SIZ_Y_UP]; FLOAT *ptr_y_up; int off_yup; /* Sub optimal delay search */ search_del(t0, ptr_sig_in, <pdel, &phase, &num_gltp, &den_gltp, y_up, &off_yup); *vo = ltpdel; if(num_gltp == (F)0.) { copy(ptr_sig_in, ptr_sig_pst0, L_SUBFR); } else { if(phase == 0) { ptr_y_up = ptr_sig_in - ltpdel; } else { /* Filtering with long filter */ compute_ltp_l(ptr_sig_in, ltpdel, phase, ptr_sig_pst0, &num2_gltp, &den2_gltp); if(select_ltp(num_gltp, den_gltp, num2_gltp, den2_gltp) == 1){ /* select short filter */ ptr_y_up = y_up + ((phase-1) * L_SUBFRP1 + off_yup); } else { /* select long filter */ num_gltp = num2_gltp; den_gltp = den2_gltp; ptr_y_up = ptr_sig_pst0; } } if(num_gltp >= den_gltp) { /* beta bounded to 1 */ if (gamma_harm == GAMMA_HARM) gain_plt = MIN_GPLT; else gain_plt = (F)1./((F)1.+ gamma_harm); } else { gain_plt = den_gltp / (den_gltp + gamma_harm * num_gltp); } /** filtering by H0(z) = harmonic filter **/ filt_plt(ptr_sig_in, ptr_y_up, ptr_sig_pst0, gain_plt); } return; }
/*---------------------------------------------------------------------------- * pst_ltp - harmonic postfilter *---------------------------------------------------------------------------- */ static void pst_ltp( Word16 t0, /* input : pitch delay given by coder */ Word16 *ptr_sig_in, /* input : postfilter input filter (residu2) */ Word16 *ptr_sig_pst0, /* output: harmonic postfilter output */ Word16 *vo /* output: voicing decision 0 = uv, > 0 delay */ ) { /**** Declare variables */ int i; Word16 temp; Word16 ltpdel, phase; Word16 num_gltp, den_gltp; Word16 num2_gltp, den2_gltp; Word16 sh_num, sh_den; Word16 sh_num2, sh_den2; Word16 gain_plt; Word16 y_up[SIZ_Y_UP]; Word16 *ptr_y_up; Word16 off_yup; Word16 *ptr_sig; Word16 sig_cadr[SIZ_RES2], *ptr_sig_cadr; Word16 nb_sh_sig; Word32 L_temp; /* input signal justified on 13 bits */ ptr_sig = ptr_sig_in - MEM_RES2; temp = 0; for(i=0; i<SIZ_RES2; i++) { temp |= abs_s(ptr_sig[i]); } nb_sh_sig = sub(3, norm_s(temp)); for(i=0; i<SIZ_RES2; i++) { /* nb_sh_sig may be >0, <0 or =0 */ sig_cadr[i] = shr( ptr_sig[i], nb_sh_sig); } ptr_sig_cadr = sig_cadr + MEM_RES2; /* Sub optimal delay search */ search_del(t0, ptr_sig_cadr, <pdel, &phase, &num_gltp, &den_gltp, &sh_num, &sh_den, y_up, &off_yup); *vo = ltpdel; if(num_gltp == 0) { Copy(ptr_sig_in, ptr_sig_pst0, L_SUBFR); } else { if(phase == 0) { ptr_y_up = ptr_sig_in - ltpdel; } else { /* Filtering with long filter */ compute_ltp_l(ptr_sig_cadr, ltpdel, phase, ptr_sig_pst0, &num2_gltp, &den2_gltp, &sh_num2, &sh_den2); if(select_ltp(num_gltp, den_gltp, sh_num, sh_den, num2_gltp, den2_gltp, sh_num2, sh_den2) == 1) { /* select short filter */ temp = sub(phase, 1); L_temp = L_mult(temp, L_SUBFRP1); L_temp = L_shr(L_temp, 1); temp = extract_l(L_temp); temp = add(temp, off_yup); /* ptr_y_up = y_up + (phase-1) * L_SUBFRP1 + off_yup */ ptr_y_up = y_up + temp; } else { /* select long filter */ num_gltp = num2_gltp; den_gltp = den2_gltp; sh_num = sh_num2; sh_den = sh_den2; ptr_y_up = ptr_sig_pst0; } /* rescale y_up */ for(i=0; i<L_SUBFR; i++) { /* nb_sh_sig may be >0, <0 or =0 */ ptr_y_up[i] = shl(ptr_y_up[i], nb_sh_sig); } } temp = sub(sh_num,sh_den); if(temp >= 0) den_gltp = shr(den_gltp, temp); else { num_gltp = shl(num_gltp, temp); /* >> (-temp) */ } if(sub(num_gltp ,den_gltp)>=0) { /* beta bounded to 1 */ gain_plt = MIN_GPLT; } else { /* GAMMA_G = 0.5 */ /* gain_plt = den_gltp x 2**15 / (den_gltp + 0.5 num_gltp) */ /* shift 1 bit to avoid overflows in add */ num_gltp = shr(num_gltp, 2); den_gltp = shr(den_gltp, 1); temp = add(den_gltp, num_gltp); gain_plt = div_s(den_gltp, temp); /* Q15 */ } /** filtering by H0(z) = harmonic filter **/ filt_plt(ptr_sig_in, ptr_y_up, ptr_sig_pst0, gain_plt); } return; }