void test1d(int nfft,int isinverse,int arch) { mdct_lookup cfg; size_t buflen = sizeof(kiss_fft_scalar)*nfft; kiss_fft_scalar * in = (kiss_fft_scalar*)malloc(buflen); kiss_fft_scalar * in_copy = (kiss_fft_scalar*)malloc(buflen); kiss_fft_scalar * out= (kiss_fft_scalar*)malloc(buflen); opus_val16 * window= (opus_val16*)malloc(sizeof(opus_val16)*nfft/2); int k; clt_mdct_init(&cfg, nfft, 0, arch); for (k=0;k<nfft;++k) { in[k] = (rand() % 32768) - 16384; } for (k=0;k<nfft/2;++k) { window[k] = Q15ONE; } for (k=0;k<nfft;++k) { in[k] *= 32768; } if (isinverse) { for (k=0;k<nfft;++k) { in[k] /= nfft; } } for (k=0;k<nfft;++k) in_copy[k] = in[k]; /*for (k=0;k<nfft;++k) printf("%d %d ", in[k].r, in[k].i);printf("\n");*/ if (isinverse) { for (k=0;k<nfft;++k) out[k] = 0; clt_mdct_backward(&cfg,in,out, window, nfft/2, 0, 1, arch); /* apply TDAC because clt_mdct_backward() no longer does that */ for (k=0;k<nfft/4;++k) out[nfft-k-1] = out[nfft/2+k]; check_inv(in,out,nfft,isinverse); } else { clt_mdct_forward(&cfg,in,out,window, nfft/2, 0, 1, arch); check(in_copy,out,nfft,isinverse); } /*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/ free(in); free(in_copy); free(out); free(window); clt_mdct_clear(&cfg, arch); }
void test1d(int nfft,int isinverse) { mdct_lookup cfg; size_t buflen = sizeof(kiss_fft_scalar)*nfft; kiss_fft_scalar * in = (kiss_fft_scalar*)malloc(buflen); kiss_fft_scalar * out= (kiss_fft_scalar*)malloc(buflen); celt_word16 * window= (celt_word16*)malloc(sizeof(celt_word16)*nfft/2); int k; clt_mdct_init(&cfg, nfft); for (k=0;k<nfft;++k) { in[k] = (rand() % 32768) - 16384; } for (k=0;k<nfft/2;++k) { window[k] = Q15ONE; } #ifdef DOUBLE_PRECISION for (k=0;k<nfft;++k) { in[k] *= 32768; } #endif if (isinverse) { for (k=0;k<nfft;++k) { in[k] /= nfft; } } /*for (k=0;k<nfft;++k) printf("%d %d ", in[k].r, in[k].i);printf("\n");*/ if (isinverse) { for (k=0;k<nfft;++k) out[k] = 0; clt_mdct_backward(&cfg,in,out, window, nfft/2); check_inv(in,out,nfft,isinverse); } else { clt_mdct_forward(&cfg,in,out,window, nfft/2); check(in,out,nfft,isinverse); } /*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/ free(in); free(out); clt_mdct_clear(&cfg); }
static #endif void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[], opus_val16 *oldBandE, int start, int effEnd, int C, int CC, int isTransient, int LM, int downsample, int silence, int arch) { int c, i; int M; int b; int B; int N, NB; int shift; int nbEBands; int overlap; VARDECL(celt_sig, freq); SAVE_STACK; overlap = mode->overlap; nbEBands = mode->nbEBands; N = mode->shortMdctSize<<LM; ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */ M = 1<<LM; if (isTransient) { B = M; NB = mode->shortMdctSize; shift = mode->maxLM; } else { B = 1; NB = mode->shortMdctSize<<LM; shift = mode->maxLM-LM; } if (CC==2&&C==1) { /* Copying a mono streams to two channels */ celt_sig *freq2; denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M, downsample, silence); /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */ freq2 = out_syn[1]+overlap/2; OPUS_COPY(freq2, freq, N); for (b=0;b<B;b++) clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch); for (b=0;b<B;b++) clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch); } else if (CC==1&&C==2) { /* Downmixing a stereo stream to mono */ celt_sig *freq2; freq2 = out_syn[0]+overlap/2; denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M, downsample, silence); /* Use the output buffer as temp array before downmixing. */ denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M, downsample, silence); for (i=0;i<N;i++) freq[i] = HALF32(ADD32(freq[i],freq2[i])); for (b=0;b<B;b++) clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch); } else { /* Normal case (mono or stereo) */ c=0; do { denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M, downsample, silence); for (b=0;b<B;b++) clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch); } while (++c<CC); } RESTORE_STACK; }