/*****************************************************************************
FFTReal.h
Copyright (c) 2005 Laurent de Soras
--- Legal stuff ---
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*Tab=3***********************************************************************/
#if ! defined (FFTReal_HEADER_INCLUDED)#define FFTReal_HEADER_INCLUDED#if defined (_MSC_VER)#pragma once#pragma warning (4 : 4250) // "Inherits via dominance."#endif/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/#include "def.h"#include "DynArray.h"#include "OscSinCos.h"template<class DT>class FFTReal
{
/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/public:
enum { MAX_BIT_DEPTH =30 }; // So length can be represented as long inttypedef DT DataType;
explicit FFTReal (long length);
virtual~FFTReal () {}
long get_length () const;
void do_fft (DataType f [],const DataType x []) const;
void do_ifft (const DataType f [], DataType x []) const;
void rescale (DataType x []) const;
DataType * use_buffer () const;
/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/protected:
/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/private:
// Over this bit depth, we use direct calculation for sin/cosenum { TRIGO_BD_LIMIT =12 };
typedef OscSinCos <DataType> OscType;
void init_br_lut ();
void init_trigo_lut ();
void init_trigo_osc ();
FORCEINLINE constlong*
get_br_ptr () const;
FORCEINLINE const DataType *
get_trigo_ptr (int level) const;
FORCEINLINE long
get_trigo_level_index (int level) const;
inlinevoid compute_fft_general (DataType f [],const DataType x []) const;
inlinevoid compute_direct_pass_1_2 (DataType df [],const DataType x []) const;
inlinevoid compute_direct_pass_3 (DataType df [],const DataType sf []) const;
inlinevoid compute_direct_pass_n (DataType df [],const DataType sf [],int pass) const;
inlinevoid compute_direct_pass_n_lut (DataType df [],const DataType sf [],int pass) const;
inlinevoid compute_direct_pass_n_osc (DataType df [],const DataType sf [],int pass) const;
inlinevoid compute_ifft_general (const DataType f [], DataType x []) const;
inlinevoid compute_inverse_pass_n (DataType df [],const DataType sf [],int pass) const;
inlinevoid compute_inverse_pass_n_osc (DataType df [],const DataType sf [],int pass) const;
inlinevoid compute_inverse_pass_n_lut (DataType df [],const DataType sf [],int pass) const;
inlinevoid compute_inverse_pass_3 (DataType df [],const DataType sf []) const;
inlinevoid compute_inverse_pass_1_2 (DataType x [],const DataType sf []) const;
constlong _length;
constint _nbr_bits;
DynArray <long>
_br_lut;
DynArray <DataType>
_trigo_lut;
mutable DynArray <DataType>
_buffer;
mutable DynArray <OscType>
_trigo_osc;
/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/private:
FFTReal ();
FFTReal (const FFTReal &other);
FFTReal &operator= (const FFTReal &other);
bool operator== (const FFTReal &other);
bool operator!= (const FFTReal &other);
}; // class FFTReal#include "FFTReal.hpp"#endif // FFTReal_HEADER_INCLUDED/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/