mirror of
https://github.com/Serial-Studio/Serial-Studio.git
synced 2025-01-31 17:42:55 +08:00
123 lines
3.9 KiB
C++
123 lines
3.9 KiB
C++
/*****************************************************************************
|
|
|
|
FFTReal.h
|
|
By Laurent de Soras
|
|
|
|
--- Legal stuff ---
|
|
|
|
This program is free software. It comes without any warranty, to
|
|
the extent permitted by applicable law. You can redistribute it
|
|
and/or modify it under the terms of the Do What The Fuck You Want
|
|
To Public License, Version 2, as published by Sam Hocevar. See
|
|
http://sam.zoy.org/wtfpl/COPYING for more details.
|
|
|
|
*Tab=3***********************************************************************/
|
|
|
|
#if !defined(ffft_FFTReal_HEADER_INCLUDED)
|
|
# define ffft_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"
|
|
|
|
namespace ffft
|
|
{
|
|
|
|
template<class DT>
|
|
class FFTReal
|
|
{
|
|
|
|
/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
|
|
|
|
public:
|
|
enum
|
|
{
|
|
MAX_BIT_DEPTH = 30
|
|
}; // So length can be represented as long int
|
|
|
|
typedef 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/cos
|
|
enum
|
|
{
|
|
TRIGO_BD_LIMIT = 12
|
|
};
|
|
|
|
typedef OscSinCos<DataType> OscType;
|
|
|
|
void init_br_lut();
|
|
void init_trigo_lut();
|
|
void init_trigo_osc();
|
|
|
|
ffft_FORCEINLINE const long *get_br_ptr() const;
|
|
ffft_FORCEINLINE const DataType *get_trigo_ptr(int level) const;
|
|
ffft_FORCEINLINE long get_trigo_level_index(int level) const;
|
|
|
|
inline void compute_fft_general(DataType f[], const DataType x[]) const;
|
|
inline void compute_direct_pass_1_2(DataType df[], const DataType x[]) const;
|
|
inline void compute_direct_pass_3(DataType df[], const DataType sf[]) const;
|
|
inline void compute_direct_pass_n(DataType df[], const DataType sf[],
|
|
int pass) const;
|
|
inline void compute_direct_pass_n_lut(DataType df[], const DataType sf[],
|
|
int pass) const;
|
|
inline void compute_direct_pass_n_osc(DataType df[], const DataType sf[],
|
|
int pass) const;
|
|
|
|
inline void compute_ifft_general(const DataType f[], DataType x[]) const;
|
|
inline void compute_inverse_pass_n(DataType df[], const DataType sf[],
|
|
int pass) const;
|
|
inline void compute_inverse_pass_n_osc(DataType df[], const DataType sf[],
|
|
int pass) const;
|
|
inline void compute_inverse_pass_n_lut(DataType df[], const DataType sf[],
|
|
int pass) const;
|
|
inline void compute_inverse_pass_3(DataType df[], const DataType sf[]) const;
|
|
inline void compute_inverse_pass_1_2(DataType x[], const DataType sf[]) const;
|
|
|
|
const long _length;
|
|
const int _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
|
|
|
|
} // namespace ffft
|
|
|
|
# include "FFTReal.hpp"
|
|
|
|
#endif // ffft_FFTReal_HEADER_INCLUDED
|
|
|
|
/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
|