No longer interleaving channels of the normalised spectrum. Also fixed the
indexing of the pitch code for stereo
This commit is contained in:
parent
676c5fd5d3
commit
abd67230c1
1 changed files with 28 additions and 58 deletions
|
@ -104,7 +104,7 @@ void normalise_bands(const CELTMode *m, const celt_sig_t * restrict freq, celt_n
|
|||
E = VSHR32(bank[i+c*m->nbEBands], shift);
|
||||
g = EXTRACT16(celt_rcp(SHL32(E,3)));
|
||||
j=eBands[i]; do {
|
||||
X[j*C+c] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g);
|
||||
X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g);
|
||||
} while (++j<eBands[i+1]);
|
||||
} while (++i<m->nbEBands);
|
||||
}
|
||||
|
@ -170,7 +170,7 @@ void normalise_bands(const CELTMode *m, const celt_sig_t * restrict freq, celt_n
|
|||
int j;
|
||||
celt_word16_t g = 1.f/(1e-10+bank[i+c*m->nbEBands]);
|
||||
for (j=eBands[i];j<eBands[i+1];j++)
|
||||
X[j*C+c] = freq[j+c*N]*g;
|
||||
X[j+c*N] = freq[j+c*N]*g;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -208,7 +208,7 @@ void denormalise_bands(const CELTMode *m, const celt_norm_t * restrict X, celt_s
|
|||
int j;
|
||||
celt_word32_t g = SHR32(bank[i+c*m->nbEBands],1);
|
||||
j=eBands[i]; do {
|
||||
freq[j+c*N] = SHL32(MULT16_32_Q15(X[j*C+c], g),2);
|
||||
freq[j+c*N] = SHL32(MULT16_32_Q15(X[j+c*N], g),2);
|
||||
} while (++j<eBands[i+1]);
|
||||
}
|
||||
for (i=eBands[m->nbEBands];i<eBands[m->nbEBands+1];i++)
|
||||
|
@ -224,13 +224,18 @@ int compute_pitch_gain(const CELTMode *m, const celt_sig_t *X, const celt_sig_t
|
|||
const int C = CHANNELS(m);
|
||||
celt_word32_t Sxy=0, Sxx=0, Syy=0;
|
||||
int len = m->pitchEnd;
|
||||
const int N = FRAMESIZE(m);
|
||||
#ifdef FIXED_POINT
|
||||
int shift = 0;
|
||||
celt_word32_t maxabs=0;
|
||||
for (j=0;j<len;j++)
|
||||
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
maxabs = MAX32(maxabs, ABS32(X[j]));
|
||||
maxabs = MAX32(maxabs, ABS32(P[j]));
|
||||
for (j=0;j<len;j++)
|
||||
{
|
||||
maxabs = MAX32(maxabs, ABS32(X[j+c*N]));
|
||||
maxabs = MAX32(maxabs, ABS32(P[j+c*N]));
|
||||
}
|
||||
}
|
||||
shift = celt_ilog2(maxabs)-12;
|
||||
if (shift<0)
|
||||
|
@ -243,8 +248,8 @@ int compute_pitch_gain(const CELTMode *m, const celt_sig_t *X, const celt_sig_t
|
|||
for (j=0;j<len;j++)
|
||||
{
|
||||
celt_word16_t Xj, Pj;
|
||||
Xj = EXTRACT16(SHR32(X[C*j+c], shift));
|
||||
Pj = MULT16_16_P15(gg,EXTRACT16(SHR32(P[C*j+c], shift)));
|
||||
Xj = EXTRACT16(SHR32(X[j+c*N], shift));
|
||||
Pj = MULT16_16_P15(gg,EXTRACT16(SHR32(P[j+c*N], shift)));
|
||||
Sxy = MAC16_16(Sxy, Xj, Pj);
|
||||
Sxx = MAC16_16(Sxx, Pj, Pj);
|
||||
Syy = MAC16_16(Syy, Xj, Xj);
|
||||
|
@ -294,12 +299,13 @@ int compute_pitch_gain(const CELTMode *m, const celt_sig_t *X, const celt_sig_t
|
|||
|
||||
void apply_pitch(const CELTMode *m, celt_sig_t *X, const celt_sig_t *P, int gain_id, int pred)
|
||||
{
|
||||
int j, c;
|
||||
int j, c, N;
|
||||
celt_word16_t gain;
|
||||
celt_word16_t delta;
|
||||
const int C = CHANNELS(m);
|
||||
int len = m->pitchEnd;
|
||||
|
||||
N = FRAMESIZE(m);
|
||||
gain = ADD16(QCONST16(.5,14), MULT16_16_16(QCONST16(.05,14),gain_id));
|
||||
delta = PDIV32_16(gain, len);
|
||||
if (pred)
|
||||
|
@ -311,7 +317,7 @@ void apply_pitch(const CELTMode *m, celt_sig_t *X, const celt_sig_t *P, int gain
|
|||
celt_word16_t gg = gain;
|
||||
for (j=0;j<len;j++)
|
||||
{
|
||||
X[C*j+c] += SHL(MULT16_32_Q15(gg,P[C*j+c]),1);
|
||||
X[j+c*N] += SHL(MULT16_32_Q15(gg,P[j+c*N]),1);
|
||||
gg = ADD16(gg, delta);
|
||||
}
|
||||
}
|
||||
|
@ -353,49 +359,18 @@ static void stereo_band_mix(const CELTMode *m, celt_norm_t *X, celt_norm_t *Y, c
|
|||
}
|
||||
|
||||
|
||||
void interleave(celt_norm_t *x, int N)
|
||||
{
|
||||
int i;
|
||||
VARDECL(celt_norm_t, tmp);
|
||||
SAVE_STACK;
|
||||
ALLOC(tmp, N, celt_norm_t);
|
||||
|
||||
for (i=0;i<N;i++)
|
||||
tmp[i] = x[i];
|
||||
for (i=0;i<N>>1;i++)
|
||||
{
|
||||
x[i<<1] = tmp[i];
|
||||
x[(i<<1)+1] = tmp[i+(N>>1)];
|
||||
}
|
||||
RESTORE_STACK;
|
||||
}
|
||||
|
||||
void deinterleave(celt_norm_t *x, int N)
|
||||
{
|
||||
int i;
|
||||
VARDECL(celt_norm_t, tmp);
|
||||
SAVE_STACK;
|
||||
ALLOC(tmp, N, celt_norm_t);
|
||||
|
||||
for (i=0;i<N;i++)
|
||||
tmp[i] = x[i];
|
||||
for (i=0;i<N>>1;i++)
|
||||
{
|
||||
x[i] = tmp[i<<1];
|
||||
x[i+(N>>1)] = tmp[(i<<1)+1];
|
||||
}
|
||||
RESTORE_STACK;
|
||||
}
|
||||
|
||||
#endif /* DISABLE_STEREO */
|
||||
|
||||
int folding_decision(const CELTMode *m, celt_norm_t *X, celt_word16_t *average, int *last_decision)
|
||||
{
|
||||
int i, c;
|
||||
int i, c, N0;
|
||||
int NR=0;
|
||||
celt_word32_t ratio = EPSILON;
|
||||
const int C = CHANNELS(m);
|
||||
const celt_int16_t * restrict eBands = m->eBands;
|
||||
|
||||
N0 = FRAMESIZE(m);
|
||||
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
for (i=0;i<m->nbEBands;i++)
|
||||
|
@ -404,13 +379,13 @@ int folding_decision(const CELTMode *m, celt_norm_t *X, celt_word16_t *average,
|
|||
int max_i=0;
|
||||
celt_word16_t max_val=EPSILON;
|
||||
celt_word32_t floor_ener=EPSILON;
|
||||
celt_norm_t * restrict x = X+C*eBands[i]+c;
|
||||
celt_norm_t * restrict x = X+eBands[i]+c*N0;
|
||||
N = eBands[i+1]-eBands[i];
|
||||
for (j=0;j<N;j++)
|
||||
{
|
||||
if (ABS16(x[C*j])>max_val)
|
||||
if (ABS16(x[j])>max_val)
|
||||
{
|
||||
max_val = ABS16(x[C*j]);
|
||||
max_val = ABS16(x[j]);
|
||||
max_i = j;
|
||||
}
|
||||
}
|
||||
|
@ -423,13 +398,13 @@ int folding_decision(const CELTMode *m, celt_norm_t *X, celt_word16_t *average,
|
|||
#else
|
||||
floor_ener = QCONST32(1.,28)-MULT16_16(max_val,max_val);
|
||||
if (max_i < N-1)
|
||||
floor_ener -= MULT16_16(x[C*(max_i+1)], x[C*(max_i+1)]);
|
||||
floor_ener -= MULT16_16(x[(max_i+1)], x[(max_i+1)]);
|
||||
if (max_i < N-2)
|
||||
floor_ener -= MULT16_16(x[C*(max_i+2)], x[C*(max_i+2)]);
|
||||
floor_ener -= MULT16_16(x[(max_i+2)], x[(max_i+2)]);
|
||||
if (max_i > 0)
|
||||
floor_ener -= MULT16_16(x[C*(max_i-1)], x[C*(max_i-1)]);
|
||||
floor_ener -= MULT16_16(x[(max_i-1)], x[(max_i-1)]);
|
||||
if (max_i > 1)
|
||||
floor_ener -= MULT16_16(x[C*(max_i-2)], x[C*(max_i-2)]);
|
||||
floor_ener -= MULT16_16(x[(max_i-2)], x[(max_i-2)]);
|
||||
floor_ener = MAX32(floor_ener, EPSILON);
|
||||
#endif
|
||||
if (N>7)
|
||||
|
@ -527,7 +502,6 @@ void quant_bands_stereo(const CELTMode *m, celt_norm_t *_X, const celt_ener_t *b
|
|||
const celt_int16_t * restrict eBands = m->eBands;
|
||||
celt_norm_t * restrict norm, *X, *Y;
|
||||
VARDECL(celt_norm_t, _norm);
|
||||
const int C = CHANNELS(m);
|
||||
int B;
|
||||
celt_word16_t mid, side;
|
||||
SAVE_STACK;
|
||||
|
@ -537,7 +511,6 @@ void quant_bands_stereo(const CELTMode *m, celt_norm_t *_X, const celt_ener_t *b
|
|||
norm = _norm;
|
||||
|
||||
balance = 0;
|
||||
deinterleave(_X, C*eBands[m->nbEBands+1]);
|
||||
X = _X;
|
||||
Y = _X+eBands[m->nbEBands+1];
|
||||
for (i=0;i<m->nbEBands;i++)
|
||||
|
@ -746,7 +719,6 @@ void quant_bands_stereo(const CELTMode *m, celt_norm_t *_X, const celt_ener_t *b
|
|||
renormalise_vector(X+eBands[i], Q15ONE, N, 1);
|
||||
renormalise_vector(Y+eBands[i], Q15ONE, N, 1);
|
||||
}
|
||||
interleave(_X, C*eBands[m->nbEBands+1]);
|
||||
RESTORE_STACK;
|
||||
}
|
||||
#endif /* DISABLE_STEREO */
|
||||
|
@ -822,7 +794,6 @@ void unquant_bands_stereo(const CELTMode *m, celt_norm_t *_X, const celt_ener_t
|
|||
const celt_int16_t * restrict eBands = m->eBands;
|
||||
celt_norm_t * restrict norm, *X, *Y;
|
||||
VARDECL(celt_norm_t, _norm);
|
||||
const int C = CHANNELS(m);
|
||||
int B;
|
||||
celt_word16_t mid, side;
|
||||
SAVE_STACK;
|
||||
|
@ -1015,7 +986,6 @@ void unquant_bands_stereo(const CELTMode *m, celt_norm_t *_X, const celt_ener_t
|
|||
renormalise_vector(X+eBands[i], Q15ONE, N, 1);
|
||||
renormalise_vector(Y+eBands[i], Q15ONE, N, 1);
|
||||
}
|
||||
interleave(_X, C*eBands[m->nbEBands+1]);
|
||||
RESTORE_STACK;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue