11 #include "math_defs.h"
14 void complex_fft(const al::span
<std::complex<double>> buffer
, const double sign
)
16 const size_t fftsize
{buffer
.size()};
17 /* Bit-reversal permutation applied to a sequence of FFTSize items */
18 for(size_t i
{1u};i
< fftsize
-1;i
++)
21 for(size_t imask
{i
+ fftsize
};imask
;imask
>>= 1)
22 j
= (j
<<1) + (imask
&1);
26 std::swap(buffer
[i
], buffer
[j
]);
29 /* Iterative form of Danielson-Lanczos lemma */
31 for(size_t i
{1u};i
< fftsize
;i
<<=1, step
<<=1)
33 const size_t step2
{step
>> 1};
34 const double arg
{al::MathDefs
<double>::Pi() / static_cast<double>(step2
)};
36 const std::complex<double> w
{std::cos(arg
), std::sin(arg
)*sign
};
37 std::complex<double> u
{1.0, 0.0};
38 for(size_t j
{0};j
< step2
;j
++)
40 for(size_t k
{j
};k
< fftsize
;k
+=step
)
42 std::complex<double> temp
{buffer
[k
+step2
] * u
};
43 buffer
[k
+step2
] = buffer
[k
] - temp
;
52 void complex_hilbert(const al::span
<std::complex<double>> buffer
)
56 const double inverse_size
= 1.0/static_cast<double>(buffer
.size());
57 auto bufiter
= buffer
.begin();
58 const auto halfiter
= bufiter
+ (buffer
.size()>>1);
60 *bufiter
*= inverse_size
; ++bufiter
;
61 bufiter
= std::transform(bufiter
, halfiter
, bufiter
,
62 [inverse_size
](const std::complex<double> &c
) -> std::complex<double>
63 { return c
* (2.0*inverse_size
); });
64 *bufiter
*= inverse_size
; ++bufiter
;
66 std::fill(bufiter
, buffer
.end(), std::complex<double>{});