    // Copyright (C) 2013  Davis E. King (davis@dlib.net)
    // License: Boost Software License   See LICENSE.txt for the full license.
    #undef DLIB_FFt_ABSTRACT_H__
    #ifdef DLIB_FFt_ABSTRACT_H__

    #include "matrix_abstract.h"
    #include "../algs.h"

    namespace dlib
    {

    // ----------------------------------------------------------------------------------------

        bool is_power_of_two (
            const unsigned long& value
        );
        /*!
            ensures
                - returns true if value contains a power of two and false otherwise.  As a
                  special case, we also consider 0 to be a power of two.
        !*/

    // ----------------------------------------------------------------------------------------

        template <typename EXP>
        typename EXP::matrix_type fft (
            const matrix_exp<EXP>& data
        );
        /*!
            requires
                - data contains elements of type std::complex<>
                - is_vector(data) == true
                - is_power_of_two(data.size()) == true
            ensures
                - Computes the discrete Fourier transform of the given data vector and
                  returns it.  In particular, we return a matrix D such that:
                    - D.nr() == data.nr()
                    - D.nc() == data.nc()
                    - D(0) == the DC term of the Fourier transform.
                    - starting with D(0), D contains progressively higher frequency components
                      of the input data.
                    - ifft(D) == D
                - if DLIB_USE_FFTW is #defined then this function will use the very fast fftw
                  library when given double precision matrices instead of dlib's default fft
                  implementation.  Note that you must also link to the fftw3 library to use
                  this feature.
        !*/

    // ----------------------------------------------------------------------------------------

        template <typename EXP>
        typename EXP::matrix_type ifft (
            const matrix_exp<EXP>& data
        );
        /*!
            requires
                - data contains elements of type std::complex<>
                - is_vector(data) == true
                - is_power_of_two(data.size()) == true
            ensures
                - Computes the inverse discrete Fourier transform of the given data vector and
                  returns it.  In particular, we return a matrix D such that:
                    - D.nr() == data.nr()
                    - D.nc() == data.nc()
                    - fft(D) == data
                - if DLIB_USE_FFTW is #defined then this function will use the very fast fftw
                  library when given double precision matrices instead of dlib's default fft
                  implementation.  Note that you must also link to the fftw3 library to use
                  this feature.
        !*/

    // ----------------------------------------------------------------------------------------

    }

    #endif // DLIB_FFt_ABSTRACT_H__