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