diff --git a/libcelt/celt.c b/libcelt/celt.c index f4b154ed..dd46d162 100644 --- a/libcelt/celt.c +++ b/libcelt/celt.c @@ -161,13 +161,14 @@ inline celt_int16_t SIG2INT16(celt_sig_t x) } /** Apply window and compute the MDCT for all sub-frames and all channels in a frame */ -static celt_word32_t compute_mdcts(const mdct_lookup *mdct_lookup, celt_word16_t *window, celt_sig_t *in, celt_sig_t *out, int N, int B, int C) +static celt_word32_t compute_mdcts(const mdct_lookup *mdct_lookup, celt_word16_t *window, celt_sig_t *in, celt_sig_t *out, int N, int overlap, int B, int C) { - int i, c; + int i, c, N4; celt_word32_t E = 0; VARDECL(celt_word32_t *x); VARDECL(celt_word32_t *tmp); SAVE_STACK; + N4 = (N-overlap)/2; ALLOC(x, 2*N, celt_word32_t); ALLOC(tmp, N, celt_word32_t); for (c=0;cmode->mdct, st->mode->window, in, freq, N, B, C); + curr_power = compute_mdcts(&st->mode->mdct, st->mode->window, in, freq, N, st->overlap, B, C); #if 0 /* Mask disabled until it can be made to do something useful */ compute_mdct_masking(X, mask, B*C*N, st->Fs); @@ -282,10 +308,15 @@ int celt_encode(CELTEncoder *st, celt_int16_t *pcm, unsigned char *compressed, i /* Pitch analysis */ for (c=0;cmode->window[i], in[C*i+c]); - in[C*(B*N+i)+c] = MULT16_32_Q15(st->mode->window[N+i], in[C*(B*N+i)+c]); + in[C*i+c] = 0; + in[C*(B*N+N-i-1)+c] = 0; + } + for (i=0;ioverlap;i++) + { + in[C*(i+N4)+c] = MULT16_32_Q15(st->mode->window[i+N4], in[C*(i+N4)+c]); + in[C*(B*N+N-i-N4-1)+c] = MULT16_32_Q15(st->mode->window[i+N4], in[C*(B*N+N-i-N4-1)+c]); } } find_spectral_pitch(st->fft, &st->psy, in, st->out_mem, MAX_PERIOD, (B+1)*N, C, &pitch_index); @@ -309,7 +340,7 @@ int celt_encode(CELTEncoder *st, celt_int16_t *pcm, unsigned char *compressed, i /*for (i=0;imode->mdct, st->mode->window, st->out_mem+pitch_index*C, freq, N, B, C); + pitch_power = compute_mdcts(&st->mode->mdct, st->mode->window, st->out_mem+pitch_index*C, freq, N, st->overlap, B, C); quant_energy(st->mode, bandE, st->oldBandE, nbCompressedBytes*8/3, &st->enc); @@ -524,7 +555,7 @@ static void celt_decode_lost(CELTDecoder *st, short *pcm) pitch_index = st->last_pitch_index; /* Use the pitch MDCT as the "guessed" signal */ - compute_mdcts(&st->mode->mdct, st->mode->window, st->out_mem+pitch_index*C, freq, N, B, C); + compute_mdcts(&st->mode->mdct, st->mode->window, st->out_mem+pitch_index*C, freq, N, st->overlap, B, C); CELT_MOVE(st->out_mem, st->out_mem+C*B*N, C*(MAX_PERIOD-B*N)); /* Compute inverse MDCTs */ @@ -606,7 +637,7 @@ int celt_decode(CELTDecoder *st, unsigned char *data, int len, celt_int16_t *pcm } /* Pitch MDCT */ - compute_mdcts(&st->mode->mdct, st->mode->window, st->out_mem+pitch_index*C, freq, N, B, C); + compute_mdcts(&st->mode->mdct, st->mode->window, st->out_mem+pitch_index*C, freq, N, st->overlap, B, C); { VARDECL(celt_ener_t *bandEp); diff --git a/libcelt/modes.c b/libcelt/modes.c index f4617606..07533990 100644 --- a/libcelt/modes.c +++ b/libcelt/modes.c @@ -274,9 +274,15 @@ CELTMode *celt_mode_create(int Fs, int channels, int frame_size, int lookahead, for (i=0;i<2*N;i++) mode->window[i] = 0; +#ifndef FIXED_POINT for (i=0;ioverlap;i++) mode->window[N4+i] = mode->window[2*N-N4-i-1] = Q15ONE*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)); +#else + for (i=0;ioverlap;i++) + mode->window[N4+i] = mode->window[2*N-N4-i-1] + = MIN32(32767,32768.*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap))); +#endif for (i=0;iwindow[N-N4+i] = Q15ONE;