Fixes fixed-point overflow in stereo_merge()
This commit is contained in:
parent
d60e0db0e2
commit
3c15659c39
1 changed files with 13 additions and 4 deletions
|
@ -264,8 +264,10 @@ static void stereo_merge(celt_norm *X, celt_norm *Y, celt_word16 mid, celt_word1
|
||||||
for (j=0;j<N;j++)
|
for (j=0;j<N;j++)
|
||||||
xp = MAC16_16(xp, X[j], Y[j]);
|
xp = MAC16_16(xp, X[j], Y[j]);
|
||||||
/* mid and side are in Q15, not Q14 like X and Y */
|
/* mid and side are in Q15, not Q14 like X and Y */
|
||||||
El = MULT16_16(mid, mid) + MULT16_16(side, side) - 2*SHL32(xp,2);
|
mid = SHR32(mid, 1);
|
||||||
Er = MULT16_16(mid, mid) + MULT16_16(side, side) + 2*SHL32(xp,2);
|
side = SHR32(side, 1);
|
||||||
|
El = MULT16_16(mid, mid) + MULT16_16(side, side) - 2*xp;
|
||||||
|
Er = MULT16_16(mid, mid) + MULT16_16(side, side) + 2*xp;
|
||||||
if (Er < EPSILON)
|
if (Er < EPSILON)
|
||||||
Er = EPSILON;
|
Er = EPSILON;
|
||||||
if (El < EPSILON)
|
if (El < EPSILON)
|
||||||
|
@ -280,13 +282,20 @@ static void stereo_merge(celt_norm *X, celt_norm *Y, celt_word16 mid, celt_word1
|
||||||
t = VSHR32(Er, (kr-7)<<1);
|
t = VSHR32(Er, (kr-7)<<1);
|
||||||
rgain = celt_rsqrt_norm(t);
|
rgain = celt_rsqrt_norm(t);
|
||||||
|
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
if (kl < 7)
|
||||||
|
kl = 7;
|
||||||
|
if (kr < 7)
|
||||||
|
kr = 7;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (j=0;j<N;j++)
|
for (j=0;j<N;j++)
|
||||||
{
|
{
|
||||||
celt_norm r, l;
|
celt_norm r, l;
|
||||||
l = X[j];
|
l = X[j];
|
||||||
r = Y[j];
|
r = Y[j];
|
||||||
X[j] = EXTRACT16(PSHR32(MULT16_16(lgain, l-r), kl));
|
X[j] = EXTRACT16(PSHR32(MULT16_16(lgain, SUB16(l,r)), kl+1));
|
||||||
Y[j] = EXTRACT16(PSHR32(MULT16_16(rgain, l+r), kr));
|
Y[j] = EXTRACT16(PSHR32(MULT16_16(rgain, ADD16(l,r)), kr+1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue