alg_quant() now handles the sign of X[] separately from the quantisation

process
This commit is contained in:
Jean-Marc Valin 2008-12-04 21:21:41 -05:00
parent 8ed865813e
commit 6cde5dd24c
2 changed files with 17 additions and 7 deletions

View file

@ -91,7 +91,7 @@ static void mix_pitch_and_residual(int * restrict iy, celt_norm_t * restrict X,
} }
void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *P, ec_enc *enc) void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, celt_norm_t *P, ec_enc *enc)
{ {
VARDECL(celt_norm_t, y); VARDECL(celt_norm_t, y);
VARDECL(int, iy); VARDECL(int, iy);
@ -122,8 +122,11 @@ void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *
X[j] -= P[j]; X[j] -= P[j];
if (X[j]>0) if (X[j]>0)
signx[j]=1; signx[j]=1;
else else {
signx[j]=-1; signx[j]=-1;
X[j]=-X[j];
P[j]=-P[j];
}
iy[j] = 0; iy[j] = 0;
y[j] = 0; y[j] = 0;
sum = MAC16_16(sum, P[j],P[j]); sum = MAC16_16(sum, P[j],P[j]);
@ -164,7 +167,7 @@ void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *
do { do {
celt_word16_t Rxy, Ryy; celt_word16_t Rxy, Ryy;
/* Select sign based on X[j] alone */ /* Select sign based on X[j] alone */
s = MULT16_16(signx[j],magnitude); s = magnitude;
/* Temporary sums of the new pulse(s) */ /* Temporary sums of the new pulse(s) */
Rxy = EXTRACT16(SHR32(MAC16_16(xy, s,X[j]),rshift)); Rxy = EXTRACT16(SHR32(MAC16_16(xy, s,X[j]),rshift));
/* We're multiplying y[j] by two so we don't have to do it here */ /* We're multiplying y[j] by two so we don't have to do it here */
@ -185,7 +188,7 @@ void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *
} while (++j<N); } while (++j<N);
j = best_id; j = best_id;
is = MULT16_16(signx[j],pulsesAtOnce); is = pulsesAtOnce;
s = SHL16(is, yshift); s = SHL16(is, yshift);
/* Updating the sums of the new pulse(s) */ /* Updating the sums of the new pulse(s) */
@ -216,7 +219,7 @@ void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *
celt_word16_t Rxy, Ryy, Ryp; celt_word16_t Rxy, Ryy, Ryp;
celt_word16_t num; celt_word16_t num;
/* Select sign based on X[j] alone */ /* Select sign based on X[j] alone */
s = MULT16_16(signx[j],magnitude); s = magnitude;
/* Temporary sums of the new pulse(s) */ /* Temporary sums of the new pulse(s) */
Rxy = ROUND16(MAC16_16(xy, s,X[j]), 14); Rxy = ROUND16(MAC16_16(xy, s,X[j]), 14);
/* We're multiplying y[j] by two so we don't have to do it here */ /* We're multiplying y[j] by two so we don't have to do it here */
@ -242,8 +245,15 @@ void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *
best_id = j; best_id = j;
} }
} while (++j<N); } while (++j<N);
iy[best_id] += signx[best_id]; iy[best_id] += 1;
} }
j=0;
do {
P[j] = MULT16_16(signx[j],P[j]);
X[j] = MULT16_16(signx[j],X[j]);
if (signx[j] < 0)
iy[j] = -iy[j];
} while (++j<N);
encode_pulses(iy, N, K, enc); encode_pulses(iy, N, K, enc);
/* Recompute the gain in one pass to reduce the encoder-decoder mismatch /* Recompute the gain in one pass to reduce the encoder-decoder mismatch

View file

@ -50,7 +50,7 @@
* @param p Pitch vector (it is assumed that p+x is a unit vector) * @param p Pitch vector (it is assumed that p+x is a unit vector)
* @param enc Entropy encoder state * @param enc Entropy encoder state
*/ */
void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *P, ec_enc *enc); void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, celt_norm_t *P, ec_enc *enc);
/** Algebraic pulse decoder /** Algebraic pulse decoder
* @param x Decoded normalised spectrum (returned) * @param x Decoded normalised spectrum (returned)