23 #include "hx3d/audio/fft.hpp" 30 const size_t N = vector.size();
34 std::valarray<Complex> even = vector[std::slice(0, N/2, 2)];
35 std::valarray<Complex> odd = vector[std::slice(1, N/2, 2)];
42 for (
size_t k = 0; k < N/2; ++k)
44 Complex t = std::polar(1.0, -2 *
math::PI * k / N) * odd[k];
45 vector[k ] = even[k] + t;
46 vector[k+N/2] = even[k] - t;
53 unsigned int N = vector.size(), k = N, n;
54 double thetaT = 3.14159265358979323846264338328L / N;
55 Complex phiT = Complex(cos(thetaT), sin(thetaT)), T;
62 for (
unsigned int l = 0; l < k; l++)
64 for (
unsigned int a = l; a < N; a += n)
66 unsigned int b = a + k;
67 Complex t = vector[a] - vector[b];
68 vector[a] += vector[b];
76 unsigned int m = (
unsigned int)(log(N) / log(2));
77 for (
unsigned int a = 0; a < N; a++)
81 b = (((b & 0xaaaaaaaa) >> 1) | ((b & 0x55555555) << 1));
82 b = (((b & 0xcccccccc) >> 2) | ((b & 0x33333333) << 2));
83 b = (((b & 0xf0f0f0f0) >> 4) | ((b & 0x0f0f0f0f) << 4));
84 b = (((b & 0xff00ff00) >> 8) | ((b & 0x00ff00ff) << 8));
85 b = ((b >> 16) | (b << 16)) >> (32 - m);
88 Complex t = vector[a];
89 vector[a] = vector[b];
static void fft(std::valarray< Complex > &vector)
Cooley–Tukey FFT (in-place, divide-and-conquer)
static void bfft(std::valarray< Complex > &vector)
Cooley-Tukey FFT (in-place, breadth-first, decimation-in-frequency)