Advertisement
Guest User

Fixed

a guest
Jan 1st, 2017
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.41 KB | None | 0 0
  1. /* 1, 2, 4, 8, ..., 2^17 */
  2. static const uint16_t invmod2vals[18] = { 0x0, 0x0, 0x3, 0x7, 0xf, 0xf, 0x2f, 0x6f, 0xef, 0xef, 0x2ef, 0x6ef, 0xeef, 0xeef, 0x2eef, 0x6eef, 0xeeef, 0xeeef };
  3.  
  4. void ff_fft15_transform(FFTContext *s, FFTComplex *out, FFTComplex *in)
  5. {
  6. FFTComplex fft15in[15];
  7. unsigned int unused, nbits = s->nbits, n = (1U << nbits), Ntot = 15*n;
  8. unsigned int inv_1 = (n << ((4 - nbits)&3));
  9. unsigned int inv_2 = invmod2vals[nbits];
  10. unsigned int i, j;
  11.  
  12. for (i = 0; i < n; i++) {
  13. unsigned int l = s->revtab_fwd[i];
  14. for (j = 0; j < 15; j++) {
  15. unsigned int q = (n*j)/15;
  16. q += i;
  17. q >>= nbits;
  18. k = 15*i + ((j - q*15)<<nbits);
  19. fft15in[j] = in[k];
  20. }
  21. fft15(out+l, fft15in, n);
  22. }
  23. for (i = 0; i < 15; i++) {
  24. fft_calc_internal(out+n*i, nbits); // this is "ff_fft_calc_interleave_sse" in the ffmpeg codebase
  25. }
  26. memcpy(in, out, Ntot * sizeof(FFTComplex));
  27. for (j = 0; j < 15; j++) {
  28. for (i = 0; i < n; i++) {
  29. unsigned int q = (j*inv_1)/15;
  30. q += (i*inv_2);
  31. q >>= nbits;
  32. k = (i*inv_2*15 + j*inv_1) - q*Ntot;
  33. out[k] = in[n*j + i];
  34. }
  35. }
  36. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement