1 #ifndef INCLUDE_ONCE_3A48838B_2D1A_4326_9585_2E19F9D300D1 2 #define INCLUDE_ONCE_3A48838B_2D1A_4326_9585_2E19F9D300D1 5 #include <unsupported/Eigen/FFT> 7 void fourierInterpolate(
float const*
const points,
const std::size_t inPointCount,
8 std::complex<float>*
const intermediate ,
9 float*
const interpolated, std::size_t
const interpolationPointCount)
11 if(inPointCount==interpolationPointCount)
13 std::copy_n(points, inPointCount, interpolated);
17 assert(interpolationPointCount > inPointCount);
19 Eigen::FFT<float> fft;
20 fft.fwd(intermediate, points, inPointCount);
23 const auto fftHalfCount=(inPointCount+1)/2;
26 std::fill_n(intermediate+fftHalfCount, interpolationPointCount-fftHalfCount, 0);
30 const auto fftHalfCount=inPointCount/2;
36 const auto numPreservedElems=fftHalfCount+1;
37 std::fill_n(intermediate+numPreservedElems, interpolationPointCount-numPreservedElems, 0);
38 intermediate[fftHalfCount] /= 2;
40 fft.inv(interpolated, intermediate, interpolationPointCount);
41 for(std::size_t i=0; i<interpolationPointCount; ++i)
42 interpolated[i] *=
float(interpolationPointCount)/inPointCount;