comparison dsp/transforms/FFT.cpp @ 65:d1d65fff5356

* wire up KissFFT implementation
author cannam
date Wed, 13 May 2009 10:45:54 +0000
parents 6cb2b3cd5356
children 2af6edd98dfa
comparison
equal deleted inserted replaced
64:6cb2b3cd5356 65:d1d65fff5356
13 13
14 #include <cmath> 14 #include <cmath>
15 15
16 #include <iostream> 16 #include <iostream>
17 17
18 #define USE_BUILTIN_FFT 1 18 //#define USE_BUILTIN_FFT 1
19 19
20 #ifdef USE_BUILTIN_FFT 20 #ifdef USE_BUILTIN_FFT
21 21
22 FFT::FFT(unsigned int n) : 22 FFT::FFT(unsigned int n) :
23 m_n(n), 23 m_n(n),
184 #else 184 #else
185 185
186 #include "kissfft/kiss_fft.h" 186 #include "kissfft/kiss_fft.h"
187 #include "kissfft/kiss_fftr.h" 187 #include "kissfft/kiss_fftr.h"
188 188
189 struct KissFFTRec {
190 kiss_fft_cfg forward;
191 kiss_fft_cfg inverse;
192 kiss_fft_cpx *in;
193 kiss_fft_cpx *out;
194 };
195
196 FFT::FFT(unsigned int n) :
197 m_n(n),
198 m_private(0)
199 {
200 KissFFTRec *rec = new KissFFTRec;
201 rec->forward = kiss_fft_alloc(m_n, 0, 0, 0);
202 rec->inverse = kiss_fft_alloc(m_n, 1, 0, 0);
203 rec->in = new kiss_fft_cpx[m_n];
204 rec->out = new kiss_fft_cpx[m_n];
205 m_private = rec;
206 }
207
208 FFT::~FFT()
209 {
210 KissFFTRec *rec = (KissFFTRec *)m_private;
211 kiss_fft_free(rec->forward);
212 kiss_fft_free(rec->inverse);
213 delete[] rec->in;
214 delete[] rec->out;
215 }
216
217 void
218 FFT::process(bool inverse,
219 const double *rin, const double *iin,
220 double *rout, double *iout)
221 {
222 KissFFTRec *rec = (KissFFTRec *)m_private;
223 for (int i = 0; i < m_n; ++i) {
224 rec->in[i].r = rin[i];
225 }
226 if (iin) {
227 for (int i = 0; i < m_n; ++i) {
228 rec->in[i].i = iin[i];
229 }
230 } else {
231 for (int i = 0; i < m_n; ++i) {
232 rec->in[i].i = 0.0;
233 }
234 }
235 if (inverse) {
236 kiss_fft(rec->inverse, rec->in, rec->out);
237 } else {
238 kiss_fft(rec->forward, rec->in, rec->out);
239 }
240 for (int i = 0; i < m_n; ++i) {
241 rout[i] = rec->out[i].r;
242 iout[i] = rec->out[i].i;
243 }
244 }
245
246 struct KissFFTRealRec {
247 kiss_fftr_cfg forward;
248 kiss_fftr_cfg inverse;
249 kiss_fft_cpx *out;
250 };
251
252 FFTReal::FFTReal(unsigned int n) :
253 m_n(n),
254 m_private(0)
255 {
256 KissFFTRealRec *rec = new KissFFTRealRec;
257 rec->forward = kiss_fftr_alloc(m_n, 0, 0, 0);
258 rec->inverse = kiss_fftr_alloc(m_n, 1, 0, 0);
259 rec->out = new kiss_fft_cpx[m_n];
260 m_private = rec;
261 }
262
263 FFTReal::~FFTReal()
264 {
265 KissFFTRealRec *rec = (KissFFTRealRec *)m_private;
266 kiss_fftr_free(rec->forward);
267 kiss_fftr_free(rec->inverse);
268 delete[] rec->out;
269 }
270
271 void
272 FFTReal::process(bool inverse,
273 const double *rin,
274 double *rout, double *iout)
275 {
276 KissFFTRealRec *rec = (KissFFTRealRec *)m_private;
277 if (inverse) {
278 kiss_fftr(rec->inverse, rin, rec->out);
279 } else {
280 kiss_fftr(rec->forward, rin, rec->out);
281 }
282 for (int i = 0; i < m_n; ++i) {
283 rout[i] = rec->out[i].r;
284 iout[i] = rec->out[i].i;
285 }
286 }
287
189 #endif 288 #endif