CSL
5.2
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
FFT_Wrapper.h
Go to the documentation of this file.
1
///
2
/// FFT_Wrapper.h -- wrapper class for FFTs that hides implementation details
3
/// This class can be used with FFTW, FFTReal, or other FFT implementations.
4
/// It assumes real-values float vectors as input to the FFT, and can deliver
5
/// real or complex results in several formats (complex #s or mag/phase).
6
/// The IFFT assumes complex input and delivers real-valued output.
7
///
8
/// The API is minimal, with a constructor method and the work-horse
9
/// nextBuffer(Buffer & in, Buffer & out) method doing a single FFT or IFFT
10
///
11
/// This file includes both the abstract wrapper, and the 3 standard concrete subclasses.
12
/// Compile this with one of the API flags defined in the compiler (-DUSE_FFTW), or define it below.
13
/// There are 3 standard concrete subclasses:
14
/// RealFFT (RealFFT code included in CSL), and
15
/// FFTW (assumes fftw3f is installed),
16
/// KISS FFT, built-in FFT from Laurent de Soras (included, untested).
17
///
18
/// See the copyright notice and acknowledgment of authors in the file COPYRIGHT
19
///
20
21
#ifndef CSL_FFT_WRAPPER_H
22
#define CSL_FFT_WRAPPER_H
23
24
// I use compiler flags for these, so different apps can share the same code base.
25
//#define USE_FFTW // use FFTW (faster but complicated to build)
26
//#define USE_FFTREAL // use FFTReal (smaller and simpler)
27
//#define USE_KISSFFT // use KISS FFT (smaller and simpler)
28
29
#include "
CSL_Core.h
"
30
31
#ifdef USE_FFTW
32
#include <fftw3.h>
33
#define FFTWrapper FFTW_Wrapper // which FFT wrapper class to use?
34
#define FFTWF_FLAGS FFTW_MEASURE // or use FFTW_ESTIMATE; FFTW_PRESERVE_INPUT not necessary
35
#endif
36
37
#ifdef USE_FFTREAL
38
#include <
FFTReal.h
>
39
#define FFTWrapper FFTR_Wrapper
40
#endif
41
42
#ifdef USE_KISSFFT
43
#include <kiss_fft.h>
44
#define FFTWrapper KISSFFT_Wrapper
45
#endif
46
47
namespace
csl {
48
49
/// real/complex flag (determines results from forward FFT)
50
51
typedef
enum
{
52
CSL_FFT_REAL
= 0,
53
CSL_FFT_COMPLEX
,
54
CSL_FFT_MAGPHASE
55
}
CSL_FFTType
;
56
57
/// forward/reverse flag (determines FFT direction)
58
59
typedef
enum
{
60
CSL_FFT_FORWARD
= 0,
61
CSL_FFT_INVERSE
62
}
CSL_FFTDir
;
63
64
///
65
/// Abstract FFT class can do forward/reverse real/complex I/O FFTs
66
///
67
68
class
Abst_FFT_W
{
69
public
:
/// Constuctor sets up twiddle factor tables
70
Abst_FFT_W
(
unsigned
size,
CSL_FFTType
type =
CSL_FFT_REAL
,
CSL_FFTDir
dir =
CSL_FFT_FORWARD
)
71
:
mSize
(size),
mCSize
((size / 2) + 1),
mType
(type),
mDirection
(dir) { };
72
73
virtual
~Abst_FFT_W
() { };
///< destructor frees tables
74
75
/// run the transform between in and out
76
virtual
void
nextBuffer
(
Buffer
& in,
Buffer
& out)
throw
(
CException
) = 0;
77
78
unsigned
mSize
;
///< FFT length
79
unsigned
mCSize
;
///< FFT length / 2 + 1
80
protected
:
81
CSL_FFTType
mType
;
///< real/complex output
82
CSL_FFTDir
mDirection
;
///< forward/reverse
83
};
84
85
//
86
// FFTW-wrapper concrete subclass
87
//
88
89
#ifdef USE_FFTW
90
91
class
FFTW_Wrapper :
public
Abst_FFT_W
{
92
public
:
93
FFTW_Wrapper(
unsigned
size,
CSL_FFTType
type =
CSL_FFT_REAL
,
CSL_FFTDir
forward =
CSL_FFT_FORWARD
);
94
~FFTW_Wrapper();
95
/// run the transform between in and out
96
void
nextBuffer(
Buffer
& in,
Buffer
& out)
throw
(
CException
);
97
98
private
:
99
// SampleBuffer mInBuf; ///< input sample* ptr
100
SampleBuffer
mSampBuf;
///< temp sample buf ptr
101
fftwf_complex *mSpectBuf;
///< complex spectrum
102
fftwf_plan mPlan;
///< FFTW plan object
103
};
104
105
#endif
106
107
//
108
// FFTReal-wrapper concrete subclass
109
//
110
111
#ifdef USE_FFTREAL
112
113
class
FFTR_Wrapper :
public
Abst_FFT_W {
114
public
:
115
FFTR_Wrapper(
unsigned
size,
CSL_FFTType
type =
CSL_FFT_REAL
,
CSL_FFTDir
forward =
CSL_FFT_FORWARD
);
116
~FFTR_Wrapper();
117
/// run the transform between in and out
118
void
nextBuffer(Buffer & in, Buffer & out)
throw
(CException);
119
120
private
:
121
SampleBuffer
mTempBuf;
///< temp sample buf ptr
122
FFTReal
mFFT;
///< FFTReal object
123
};
124
125
#endif
126
127
//
128
// KISS_FFT-wrapper concrete subclass (untested)
129
//
130
131
#ifdef USE_KISSFFT
132
133
class
KISSFFT_Wrapper :
public
Abst_FFT_W {
134
public
:
135
KISSFFT_Wrapper(
unsigned
size,
CSL_FFTType
type =
CSL_FFT_REAL
,
CSL_FFTDir
forward =
CSL_FFT_FORWARD
);
136
~KISSFFT_Wrapper();
137
/// run the transform between in and out
138
void
nextBuffer(Buffer & in, Buffer & out)
throw
(CException);
139
140
private
:
141
SampleBuffer
mTempBuf;
///< temp sample buf ptr
142
kiss_fft_cfg mFFT;
///< KISS FFT config object pointer
143
SampleComplexVector
inBuf, outBuf;
144
};
145
146
#endif
147
148
}
149
150
#endif
CSL
Utilities
FFT_Wrapper.h
Generated on Thu Nov 15 2012 22:01:10 for CSL by
1.8.1.1