To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / vamp-sdk / FFT.h

History | View | Annotate | Download (6.41 KB)

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