/* * ---------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * Dmitry Ivanov wrote this file. As long as you retain * this notice you can do whatever you want with this stuff. If we meet some day, * and you think this stuff is worth it, you can buy me a beer in return. * ---------------------------------------------------------------------------- */ #ifndef __SIMPLE_FFT__FFT_H__ #define __SIMPLE_FFT__FFT_H__ #include using std::size_t; /// The public API namespace simple_fft { /// FFT and IFFT functions // in-place, complex, forward template bool FFT(TComplexArray1D & data, const size_t size, const char *& error_description); template bool FFT(TComplexArray2D & data, const size_t size1, const size_t size2, const char *& error_description); template bool FFT(TComplexArray3D & data, const size_t size1, const size_t size2, const size_t size3, const char *& error_description); // in-place, complex, inverse template bool IFFT(TComplexArray1D & data, const size_t size, const char *& error_description); template bool IFFT(TComplexArray2D & data, const size_t size1, const size_t size2, const char *& error_description); template bool IFFT(TComplexArray3D & data, const size_t size1, const size_t size2, const size_t size3, const char *& error_description); // not-in-place, complex, forward template bool FFT(const TComplexArray1D & data_in, TComplexArray1D & data_out, const size_t size, const char *& error_description); template bool FFT(const TComplexArray2D & data_in, TComplexArray2D & data_out, const size_t size1, const size_t size2, const char *& error_description); template bool FFT(const TComplexArray3D & data_in, TComplexArray3D & data_out, const size_t size1, const size_t size2, const size_t size3, const char *& error_description); // not-in-place, complex, inverse template bool IFFT(const TComplexArray1D & data_in, TComplexArray1D & data_out, const size_t size, const char *& error_description); template bool IFFT(const TComplexArray2D & data_in, TComplexArray2D & data_out, const size_t size1, const size_t size2, const char *& error_description); template bool IFFT(const TComplexArray3D & data_in, TComplexArray3D & data_out, const size_t size1, const size_t size2, const size_t size3, const char *& error_description); // not-in-place, real, forward template bool FFT(const TRealArray1D & data_in, TComplexArray1D & data_out, const size_t size, const char *& error_description); template bool FFT(const TRealArray2D & data_in, TComplexArray2D & data_out, const size_t size1, const size_t size2, const char *& error_description); template bool FFT(const TRealArray3D & data_in, TComplexArray3D & data_out, const size_t size1, const size_t size2, const size_t size3, const char *& error_description); // NOTE: There is no inverse transform from complex spectrum to real signal // because round-off errors during computation of inverse FFT lead to the appearance // of signal imaginary components even though they are small by absolute value. // These can be ignored but the author of this file thinks adding such an function // would be wrong methodogically: looking at complex result, you can estimate // the value of spurious imaginary part. Otherwise you may never know that IFFT // provides too large imaginary values due to too small grid size, for example. } // namespace simple_fft #endif // __SIMPLE_FFT__FFT_H__ #include "fft.hpp"