Back to Discrete Fourier transform
// Description: Discrete Fourier transform
#ifndef PASTELGFX_FOURIER_TRANSFORM_H
#define PASTELGFX_FOURIER_TRANSFORM_H
#include "pastel/sys/mytypes.h"
#include "pastel/sys/array.h"
#include "pastel/sys/view/view.h"
#include "pastel/sys/range.h"
#include <complex>
namespace Pastel
{
    //! Computes a discrete Fourier transform.
    /*!
   Preconditions:
   isPowerOfTwo(input.size())
   */
    template <
        typename Complex_ConstRange, 
        typename Complex_Range>
    void dft(
        const Complex_ConstRange& input,
        const Complex_Range& output);
    //! Computes a discrete Fourier transform.
    /*!
   This is a convenience function that calls:
   dft(inputOutput, inputOutput);
   See the documentation for that function.
   */
    template <typename Complex_Range>
    void dft(
        const Complex_Range& inputOutput);
    PASTEL_RANGE_ALGORITHM(dft, Dft);
    //! Computes a unitary discrete Fourier transform.
    /*!
   Preconditions:
   isPowerOfTwo(input.size())
   */
    template <
        typename Complex_ConstRange, 
        typename Complex_Range>
    void unitaryDft(
        const Complex_ConstRange& input,
        const Complex_Range& output);
    //! Computes a unitary discrete Fourier transform.
    /*!
   This is a convenience function that calls:
   unitaryDft(inputOutput, inputOutput);
   See the documentation for that function.
   */
    template <typename Complex_Range>
    void unitaryDft(
        const Complex_Range& inputOutput);
    PASTEL_RANGE_ALGORITHM(unitaryDft, UnitaryDft);
    //! Computes an inverse discrete Fourier transform.
    /*!
   Preconditions:
   isPowerOfTwo(input.size())
   */
    template <
        typename Complex_ConstRange, 
        typename Complex_Range>
    void inverseDft(
        const Complex_ConstRange& input,
        const Complex_Range& output);
    //! Computes an inverse discrete Fourier transform.
    /*!
   This is a convenience function that calls:
   inverseDft(inputOutput, inputOutput);
   See the documentation for that function.
   */
    template <typename Complex_Range>
    void inverseDft(
        const Complex_Range& inputOutput);
    PASTEL_RANGE_ALGORITHM(inverseDft, InverseDft);
    //! Computes an inverse unitary discrete Fourier transform.
    /*!
   Preconditions:
   isPowerOfTwo(input.size())
   */
    template <
        typename Complex_ConstRange, 
        typename Complex_Range>
    void inverseUnitaryDft(
        const Complex_ConstRange& input,
        const Complex_Range& output);
    //! Computes an inverse unitary discrete Fourier transform.
    /*!
   This is a convenience function that calls:
   inverseUnitaryDft(inputOutput, inputOutput);
   See the documentation for that function.
   */
    template <typename Complex_Range>
    void inverseUnitaryDft(
        const Complex_Range& inputOutput);
    PASTEL_RANGE_ALGORITHM(inverseUnitaryDft, InverseUnitaryDft);
}
#include "pastel/gfx/transform/fourier_transform.hpp"
#endif