Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* 1, 2, 4, 8, ..., 2^17 */
- static const uint16_t invmod2vals[18] = { 0x0, 0x0, 0x3, 0x7, 0xf, 0xf, 0x2f, 0x6f, 0xef, 0xef, 0x2ef, 0x6ef, 0xeef, 0xeef, 0x2eef, 0x6eef, 0xeeef, 0xeeef };
- void ff_fft15_transform(FFTContext *s, FFTComplex *out, FFTComplex *in)
- {
- FFTComplex fft15in[15];
- unsigned int unused, nbits = s->nbits, n = (1U << nbits), Ntot = 15*n;
- unsigned int inv_1 = (n << ((4 - nbits)&3));
- unsigned int inv_2 = invmod2vals[nbits];
- unsigned int i, j;
- for (i = 0; i < n; i++) {
- unsigned int l = s->revtab_fwd[i];
- for (j = 0; j < 15; j++) {
- unsigned int q = (n*j)/15;
- q += i;
- q >>= nbits;
- k = 15*i + ((j - q*15)<<nbits);
- fft15in[j] = in[k];
- }
- fft15(out+l, fft15in, n);
- }
- for (i = 0; i < 15; i++) {
- fft_calc_internal(out+n*i, nbits); // this is "ff_fft_calc_interleave_sse" in the ffmpeg codebase
- }
- memcpy(in, out, Ntot * sizeof(FFTComplex));
- for (j = 0; j < 15; j++) {
- for (i = 0; i < n; i++) {
- unsigned int q = (j*inv_1)/15;
- q += (i*inv_2);
- q >>= nbits;
- k = (i*inv_2*15 + j*inv_1) - q*Ntot;
- out[k] = in[n*j + i];
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement