From f6dc1eba2615444d24cc84dfc2043d961418a035 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Tue, 6 Oct 2009 20:08:49 -0400 Subject: [PATCH] Further simplifications to mix_pitch_and_residual() (which no longer does anything that its name implies) --- libcelt/vq.c | 41 ++++++++++++++--------------------------- 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/libcelt/vq.c b/libcelt/vq.c index 0b9ca147..62a87848 100644 --- a/libcelt/vq.c +++ b/libcelt/vq.c @@ -99,39 +99,19 @@ static void exp_rotation(celt_norm_t *X, int len, int dir, int stride, int K) /** Takes the pitch vector and the decoded residual vector, computes the gain that will give ||p+g*y||=1 and mixes the residual with the pitch. */ -static void mix_pitch_and_residual(int * restrict iy, celt_norm_t * restrict X, int N, int K) +static void mix_pitch_and_residual(int * restrict iy, celt_norm_t * restrict X, int N, int K, celt_word32_t Ryy) { int i; - celt_word32_t Ryy; celt_word32_t g; - VARDECL(celt_norm_t, y); -#ifdef FIXED_POINT - int yshift; -#endif - SAVE_STACK; -#ifdef FIXED_POINT - yshift = 13-celt_ilog2(K); -#endif - ALLOC(y, N, celt_norm_t); + + g = celt_rsqrt(Ryy); i=0; - Ryy = 0; - do { - y[i] = SHL16(iy[i],yshift); - Ryy = MAC16_16(Ryy, y[i], y[i]); - } while (++i < N); - - g = MULT16_32_Q15(celt_sqrt(Ryy), celt_rcp(SHR32(Ryy,9))); - - i=0; - do - X[i] = ROUND16(MULT16_16(y[i], g),11); + do + X[i] = MULT16_32_P15(g, SHL32(EXTEND32(iy[i]),14)); while (++i < N); - - RESTORE_STACK; } - void alg_quant(celt_norm_t *X, int N, int K, int spread, ec_enc *enc) { VARDECL(celt_norm_t, y); @@ -290,7 +270,7 @@ void alg_quant(celt_norm_t *X, int N, int K, int spread, ec_enc *enc) /* Recompute the gain in one pass to reduce the encoder-decoder mismatch due to the recursive computation used in quantisation. */ - mix_pitch_and_residual(iy, X, N, K); + mix_pitch_and_residual(iy, X, N, K, EXTRACT16(SHR32(yy,2*yshift))); if (spread) exp_rotation(X, N, -1, spread, K); RESTORE_STACK; @@ -301,12 +281,19 @@ void alg_quant(celt_norm_t *X, int N, int K, int spread, ec_enc *enc) the final normalised signal in the current band. */ void alg_unquant(celt_norm_t *X, int N, int K, int spread, ec_dec *dec) { + int i; + celt_word32_t Ryy; VARDECL(int, iy); SAVE_STACK; K = get_pulses(K); ALLOC(iy, N, int); decode_pulses(iy, N, K, dec); - mix_pitch_and_residual(iy, X, N, K); + Ryy = 0; + i=0; + do { + Ryy = MAC16_16(Ryy, iy[i], iy[i]); + } while (++i < N); + mix_pitch_and_residual(iy, X, N, K, Ryy); if (spread) exp_rotation(X, N, -1, spread, K); RESTORE_STACK;