Theoretica
A C++ numerical and automatic mathematical library
fft.h
Go to the documentation of this file.
1 
5 
6 #ifndef THEORETICA_FFT_H
7 #define THEORETICA_FFT_H
8 
9 #include "../core/bit_op.h"
10 #include "../algebra/algebra_types.h"
11 #include "../algebra/algebra.h"
12 #include "../complex/complex.h"
13 
14 
15 namespace theoretica {
16 
17 
19  namespace signal {
20 
21 
28  template<typename ReturnVector = cvec, typename InputVector = cvec>
29  inline ReturnVector fft(const InputVector& x, bool inverse = false) {
30 
31  // Resulting vector in the frequency domain
32  ReturnVector k = x;
33  const unsigned int N = x.size();
34  const real sign = (inverse ? 1.0 : -1.0);
35 
36  // Compute the logarithm of the size
37  const unsigned int log2N = ilog2(N);
38 
39  // Enforce power of 2 vector size
40  if (N != (unsigned int) (1 << log2N)) {
41  return algebra::vec_error(k);
42  }
43 
44  // Bit reverse
45  swap_bit_reverse(k, log2N);
46 
47 
48  for (unsigned int p = 1; p <= log2N; p++) {
49 
50  const unsigned int m = 1 << p;
51  const unsigned int offset = m / 2;
52 
53  complex<real> w (1.0, 0.0);
54 
55  // Phase shift between iterations
56  const complex<real> phase = complex<real>(
57  cos(sign * 2 * PI / m),
58  sin(sign * 2 * PI / m)
59  );
60 
61  for (unsigned int j = 0; j < offset; j++) {
62 
63  for (unsigned int i = j; i < N; i += m) {
64 
65  const complex<real> t = w * k[i + offset];
66  k[i + offset] = k[i] - t;
67  k[i] += t;
68  }
69 
70  w *= phase;
71  }
72  }
73 
74  // The normalization constant is 1/N
75  if (inverse)
76  k /= N;
77 
78  return k;
79  }
80 
81 
87  template<typename ReturnVector = cvec, typename InputVector = cvec>
88  inline ReturnVector ifft(const InputVector& k) {
89  return fft(k, true);
90  }
91  }
92 }
93 
94 
95 #endif
Complex number in algebraic form .
Definition: complex.h:26
Vector & vec_error(Vector &v)
Overwrite the given vector with the error vector with NaN values.
Definition: algebra.h:62
ReturnVector fft(const InputVector &x, bool inverse=false)
Compute the Fast Fourier Transform of a set of data points.
Definition: fft.h:29
ReturnVector ifft(const InputVector &k)
Compute the Inverse Fast Fourier Transform of a set of data points.
Definition: fft.h:88
Main namespace of the library which contains all functions and objects.
Definition: algebra.h:27
double real
A real number, defined as a floating point type.
Definition: constants.h:188
UnsignedIntType ilog2(UnsignedIntType x)
Find the integer logarithm of x.
Definition: real_analysis.h:551
complex< T > inverse(complex< T > z)
Compute the conjugate of a complex number.
Definition: complex_analysis.h:35
dual2 cos(dual2 x)
Compute the cosine of a second order dual number.
Definition: dual2_functions.h:82
dual2 sin(dual2 x)
Compute the sine of a second order dual number.
Definition: dual2_functions.h:70
constexpr real PI
The Pi mathematical constant.
Definition: constants.h:206
void swap_bit_reverse(Vector &x, unsigned int m)
Swap the elements of a vector pair-wise, by exchanging elements with indices related by bit reversion...
Definition: bit_op.h:90