/*---------------------------------------------------------------------------- * Post - adaptive postfilter main function *---------------------------------------------------------------------------- */ void Post( Word16 t0, /* input : pitch delay given by coder */ Word16 *signal_ptr, /* input : input signal (pointer to current subframe */ Word16 *coeff, /* input : LPC coefficients for current subframe */ Word16 *sig_out, /* output: postfiltered output */ Word16 *vo, /* output: voicing decision 0 = uv, > 0 delay */ Word16 Vad /* input : frame type */ ) { /* Local variables and arrays */ Word16 apond1[MP1]; /* s.t. denominator coeff. */ Word16 sig_ltp[L_SUBFRP1]; /* H0 output signal */ Word16 *sig_ltp_ptr; Word16 parcor0; /* Compute weighted LPC coefficients */ Weight_Az(coeff, GAMMA1_PST, M, apond1); Weight_Az(coeff, GAMMA2_PST, M, apond2); /* Compute A(gamma2) residual */ Residu(apond2, signal_ptr, res2_ptr, L_SUBFR); /* Harmonic filtering */ sig_ltp_ptr = sig_ltp + 1; if (sub(Vad, 1) == 0) pst_ltp(t0, res2_ptr, sig_ltp_ptr, vo); else { *vo = 0; Copy(res2_ptr, sig_ltp_ptr, L_SUBFR); } /* Save last output of 1/A(gamma1) */ /* (from preceding subframe) */ sig_ltp[0] = *ptr_mem_stp; /* Controls short term pst filter gain and compute parcor0 */ calc_st_filt(apond2, apond1, &parcor0, sig_ltp_ptr); /* 1/A(gamma1) filtering, mem_stp is updated */ Syn_filt(apond1, sig_ltp_ptr, sig_ltp_ptr, L_SUBFR, mem_stp, 1); /* Tilt filtering */ filt_mu(sig_ltp, sig_out, parcor0); /* Gain control */ scale_st(signal_ptr, sig_out, &gain_prec); /**** Update for next subframe */ Copy(&res2[L_SUBFR], &res2[0], MEM_RES2); return; }
/*---------------------------------------------------------------------------- * Post - adaptive postfilter main function *---------------------------------------------------------------------------- */ void poste( int t0, /* input : pitch delay given by coder */ FLOAT *signal_ptr, /* input : input signal (pointer to current subframe */ FLOAT *coeff, /* input : LPC coefficients for current subframe */ FLOAT *sig_out, /* output: postfiltered output */ int *vo, /* output: voicing decision 0 = uv, > 0 delay */ FLOAT gamma1, /* input: short term postfilt. den. weighting factor*/ FLOAT gamma2, /* input: short term postfilt. num. weighting factor*/ FLOAT gamma_harm, /* input: long term postfilter weighting factor*/ int long_h_st, /* input: impulse response length*/ int m_pst, /* input: LPC order */ int Vad /* input : VAD information (frame type) */ ) { /* Local variables and arrays */ FLOAT apond1[M_BWDP1]; /* s.t. denominator coeff. */ FLOAT sig_ltp[L_SUBFRP1]; /* H0 output signal */ FLOAT *sig_ltp_ptr; FLOAT parcor0; /* Compute weighted LPC coefficients */ weight_az(coeff, gamma1, m_pst, apond1); weight_az(coeff, gamma2, m_pst, apond2); set_zero(&apond2[m_pst+1], (M_BWD-m_pst)); /* Compute A(gamma2) residual */ residue(m_pst, apond2, signal_ptr, res2_ptr, L_SUBFR); /* Harmonic filtering */ sig_ltp_ptr = sig_ltp + 1; if (Vad > 1) pst_ltpe(t0, res2_ptr, sig_ltp_ptr, vo, gamma_harm); else { *vo = 0; copy(res2_ptr, sig_ltp_ptr, L_SUBFR); } /* Save last output of 1/A(gamma1) */ /* (from preceding subframe) */ sig_ltp[0] = *ptr_mem_stp; /* Controls short term pst filter gain and compute parcor0 */ calc_st_filte(apond2, apond1, &parcor0, sig_ltp_ptr, long_h_st, m_pst); /* 1/A(gamma1) filtering, mem_stp is updated */ syn_filte(m_pst, apond1, sig_ltp_ptr, sig_ltp_ptr, L_SUBFR, &mem_stp[M_BWD-m_pst], 0); copy(&sig_ltp_ptr[L_SUBFR-M_BWD], mem_stp, M_BWD); /* Tilt filtering */ filt_mu(sig_ltp, sig_out, parcor0); /* Gain control */ scale_st(signal_ptr, sig_out, &gain_prec); /**** Update for next subframe */ copy(&res2[L_SUBFR], &res2[0], MEM_RES2); return; }