This both reverts 3fe0db172c
that caused
accuracy-related issues at high bit-rate, and fixed an overflow caused by large Rxy values.
This commit is contained in:
parent
65fb92e824
commit
0bc5f7fcdc
1 changed files with 10 additions and 5 deletions
15
libcelt/vq.c
15
libcelt/vq.c
|
@ -139,10 +139,16 @@ void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *
|
||||||
int pulsesAtOnce=1;
|
int pulsesAtOnce=1;
|
||||||
int best_id;
|
int best_id;
|
||||||
celt_word16_t magnitude;
|
celt_word16_t magnitude;
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
int rshift;
|
||||||
|
#endif
|
||||||
/* Decide on how many pulses to find at once */
|
/* Decide on how many pulses to find at once */
|
||||||
pulsesAtOnce = (pulsesLeft*N_1)>>9; /* pulsesLeft/N */
|
pulsesAtOnce = (pulsesLeft*N_1)>>9; /* pulsesLeft/N */
|
||||||
if (pulsesAtOnce<1)
|
if (pulsesAtOnce<1)
|
||||||
pulsesAtOnce = 1;
|
pulsesAtOnce = 1;
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
rshift = yshift+1+celt_ilog2(K-pulsesLeft+pulsesAtOnce);
|
||||||
|
#endif
|
||||||
magnitude = SHL16(pulsesAtOnce, yshift);
|
magnitude = SHL16(pulsesAtOnce, yshift);
|
||||||
|
|
||||||
best_id = 0;
|
best_id = 0;
|
||||||
|
@ -161,9 +167,9 @@ void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *
|
||||||
/* Select sign based on X[j] alone */
|
/* Select sign based on X[j] alone */
|
||||||
s = signx[j]*magnitude;
|
s = signx[j]*magnitude;
|
||||||
/* Temporary sums of the new pulse(s) */
|
/* Temporary sums of the new pulse(s) */
|
||||||
Rxy = EXTRACT16(SHR32(xy + MULT16_16(s,X[j]),14));
|
Rxy = EXTRACT16(SHR32(xy + MULT16_16(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 */
|
||||||
Ryy = EXTRACT16(SHR32(yy + MULT16_16(s,y[j]),14));
|
Ryy = EXTRACT16(SHR32(yy + MULT16_16(s,y[j]),rshift));
|
||||||
|
|
||||||
/* Approximate score: we maximise Rxy/sqrt(Ryy) (we're guaranteed that
|
/* Approximate score: we maximise Rxy/sqrt(Ryy) (we're guaranteed that
|
||||||
Rxy is positive because the sign is pre-computed) */
|
Rxy is positive because the sign is pre-computed) */
|
||||||
|
@ -189,8 +195,7 @@ void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *
|
||||||
/* Select sign based on X[j] alone */
|
/* Select sign based on X[j] alone */
|
||||||
s = signx[j]*magnitude;
|
s = signx[j]*magnitude;
|
||||||
/* Temporary sums of the new pulse(s) */
|
/* Temporary sums of the new pulse(s) */
|
||||||
/* We only shift by 13 so we don't have to multiply by 2 later */
|
Rxy = ROUND16(xy + MULT16_16(s,X[j]), 14);
|
||||||
Rxy = ROUND16(xy + MULT16_16(s,X[j]), 13);
|
|
||||||
/* 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 */
|
||||||
Ryy = ROUND16(yy + MULT16_16(s,y[j]), 14);
|
Ryy = ROUND16(yy + MULT16_16(s,y[j]), 14);
|
||||||
Ryp = ROUND16(yp + MULT16_16(s,P[j]), 14);
|
Ryp = ROUND16(yp + MULT16_16(s,P[j]), 14);
|
||||||
|
@ -203,7 +208,7 @@ void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *
|
||||||
/* score = 2*g*Rxy - g*g*Ryy;*/
|
/* score = 2*g*Rxy - g*g*Ryy;*/
|
||||||
#ifdef FIXED_POINT
|
#ifdef FIXED_POINT
|
||||||
/* No need to multiply Rxy by 2 because we did it earlier */
|
/* No need to multiply Rxy by 2 because we did it earlier */
|
||||||
num = MULT16_16_Q15(SUB16(Rxy,g),g);
|
num = MULT16_16_Q15(ADD16(SUB16(Rxy,g),Rxy),g);
|
||||||
#else
|
#else
|
||||||
num = g*(2*Rxy-g);
|
num = g*(2*Rxy-g);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue