1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4     Vamp
5 
6     An API for audio analysis and feature extraction plugins.
7 
8     Centre for Digital Music, Queen Mary, University of London.
9     Copyright 2006-2012 Chris Cannam and QMUL.
10 
11     Permission is hereby granted, free of charge, to any person
12     obtaining a copy of this software and associated documentation
13     files (the "Software"), to deal in the Software without
14     restriction, including without limitation the rights to use, copy,
15     modify, merge, publish, distribute, sublicense, and/or sell copies
16     of the Software, and to permit persons to whom the Software is
17     furnished to do so, subject to the following conditions:
18 
19     The above copyright notice and this permission notice shall be
20     included in all copies or substantial portions of the Software.
21 
22     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
26     ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
27     CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28     WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 
30     Except as contained in this notice, the names of the Centre for
31     Digital Music; Queen Mary, University of London; and Chris Cannam
32     shall not be used in advertising or otherwise to promote the sale,
33     use or other dealings in this Software without prior written
34     authorization.
35 */
36 
37 #ifndef _VAMP_FFT_H_
38 #define _VAMP_FFT_H_
39 
40 #include "plugguard.h"
41 _VAMP_SDK_PLUGSPACE_BEGIN(FFT.h)
42 
43 namespace Vamp {
44 
45 /**
46  * A simple FFT implementation provided for convenience of plugin
47  * authors. This class provides one-shot (i.e. fixed table state is
48  * recalculated every time) double-precision complex-complex
49  * transforms. For repeated transforms from real time-domain data, use
50  * an FFTComplex or FFTReal object instead.
51  *
52  * Note: If the SDK has been compiled with the SINGLE_PRECISION_FFT
53  * flag, then all FFTs will use single precision internally. The
54  * default is double precision. The API uses doubles in either case.
55  *
56  * The forward transform is unscaled; the inverse transform is scaled
57  * by 1/n.
58  */
59 class FFT
60 {
61 public:
62     /**
63      * Calculate a one-shot forward transform of size n.
64      * n must be a multiple of 2.
65      *
66      * ri and ii must point to the real and imaginary component arrays
67      * of the input. For real input, ii may be NULL.
68      *
69      * ro and io must point to enough space to receive the real and
70      * imaginary component arrays of the output.
71      *
72      * All input and output arrays are of size n.
73      */
74     static void forward(unsigned int n,
75                         const double *ri, const double *ii,
76                         double *ro, double *io);
77 
78     /**
79      * Calculate a one-shot inverse transform of size n.
80      * n must be a power of 2, greater than 1.
81      *
82      * ri and ii must point to the real and imaginary component arrays
83      * of the input. For real input, ii may be NULL.
84      *
85      * ro and io must point to enough space to receive the real and
86      * imaginary component arrays of the output. The output is scaled
87      * by 1/n. The output pointers may not be NULL, even if the output
88      * is expected to be real.
89      *
90      * All input and output arrays are of size n.
91      */
92     static void inverse(unsigned int n,
93                         const double *ri, const double *ii,
94                         double *ro, double *io);
95 };
96 
97 /**
98  * A simple FFT implementation provided for convenience of plugin
99  * authors. This class provides double-precision complex-complex
100  * transforms.
101  *
102  * Note: If the SDK has been compiled with the SINGLE_PRECISION_FFT
103  * flag, then all FFTs will use single precision internally. The
104  * default is double precision. The API uses doubles in either case.
105  *
106  * The forward transform is unscaled; the inverse transform is scaled
107  * by 1/n.
108  */
109 class FFTComplex
110 {
111 public:
112     /**
113      * Prepare to calculate transforms of size n.
114      * n must be a multiple of 2.
115      */
116     FFTComplex(unsigned int n);
117 
118     ~FFTComplex();
119 
120     /**
121      * Calculate a forward transform of size n.
122      *
123      * ci must point to the interleaved complex input data of size n
124      * (that is, 2n doubles in total).
125      *
126      * co must point to enough space to receive an interleaved complex
127      * output array of size n (that is, 2n doubles in total).
128      */
129     void forward(const double *ci, double *co);
130 
131     /**
132      * Calculate an inverse transform of size n.
133      *
134      * ci must point to an interleaved complex input array of size n
135      * (that is, 2n doubles in total).
136      *
137      * co must point to enough space to receive the interleaved
138      * complex output data of size n (that is, 2n doubles in
139      * total). The output is scaled by 1/n.
140      */
141     void inverse(const double *ci, double *co);
142 
143 private:
144     class D;
145     D *m_d;
146 };
147 
148 /**
149  * A simple FFT implementation provided for convenience of plugin
150  * authors. This class provides transforms between double-precision
151  * real time-domain and double-precision complex frequency-domain
152  * data.
153  *
154  * Note: If the SDK has been compiled with the SINGLE_PRECISION_FFT
155  * flag, then all FFTs will use single precision internally. The
156  * default is double precision. The API uses doubles in either case.
157  *
158  * The forward transform is unscaled; the inverse transform is scaled
159  * by 1/n.
160  */
161 class FFTReal
162 {
163 public:
164     /**
165      * Prepare to calculate transforms of size n.
166      * n must be a multiple of 2.
167      */
168     FFTReal(unsigned int n);
169 
170     ~FFTReal();
171 
172     /**
173      * Calculate a forward transform of size n.
174      *
175      * ri must point to the real input data of size n.
176      *
177      * co must point to enough space to receive an interleaved complex
178      * output array of size n/2+1 (that is, n+2 doubles in total).
179      */
180     void forward(const double *ri, double *co);
181 
182     /**
183      * Calculate an inverse transform of size n.
184      *
185      * ci must point to an interleaved complex input array of size
186      * n/2+1 (that is, n+2 doubles in total).
187      *
188      * ro must point to enough space to receive the real output data
189      * of size n. The output is scaled by 1/n and only the real part
190      * is returned.
191      */
192     void inverse(const double *ci, double *ro);
193 
194 private:
195     class D;
196     D *m_d;
197 };
198 
199 }
200 
201 _VAMP_SDK_PLUGSPACE_END(FFT.h)
202 
203 #endif
204