Mercurial > hg > qm-dsp
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 |