10 constexpr double Pi
{3.141592653589793238462643383279502884};
14 void complex_fft(std::complex<double> *FFTBuffer
, int FFTSize
, double Sign
)
16 /* Bit-reversal permutation applied to a sequence of FFTSize items */
17 for(int i
{1};i
< FFTSize
-1;i
++)
20 for(int mask
{1};mask
< FFTSize
;mask
<<= 1)
29 std::swap(FFTBuffer
[i
], FFTBuffer
[j
]);
32 /* Iterative form of Danielson–Lanczos lemma */
34 for(int i
{1};i
< FFTSize
;i
<<=1, step
<<=1)
37 double arg
{Pi
/ step2
};
39 std::complex<double> w
{std::cos(arg
), std::sin(arg
)*Sign
};
40 std::complex<double> u
{1.0, 0.0};
41 for(int j
{0};j
< step2
;j
++)
43 for(int k
{j
};k
< FFTSize
;k
+=step
)
45 std::complex<double> temp
{FFTBuffer
[k
+step2
] * u
};
46 FFTBuffer
[k
+step2
] = FFTBuffer
[k
] - temp
;
55 void complex_hilbert(std::complex<double> *Buffer
, int size
)
57 const double inverse_size
= 1.0/(double)size
;
59 for(int i
{0};i
< size
;i
++)
62 complex_fft(Buffer
, size
, 1.0);
67 Buffer
[i
++] *= inverse_size
;
69 Buffer
[i
++] *= 2.0*inverse_size
;
70 Buffer
[i
++] *= inverse_size
;
73 Buffer
[i
] = std::complex<double>{};
75 complex_fft(Buffer
, size
, -1.0);