Mercurial > hg > qm-dsp
comparison dsp/transforms/FFT.cpp @ 74:769da847732b
* A few fixes prompted by vamp-plugin-tester
author | cannam |
---|---|
date | Mon, 08 Jun 2009 12:30:20 +0000 |
parents | dcb555b90924 |
children | e5907ae6de17 |
comparison
equal
deleted
inserted
replaced
73:dcb555b90924 | 74:769da847732b |
---|---|
197 | 197 |
198 FFT::FFT(unsigned int n) : | 198 FFT::FFT(unsigned int n) : |
199 m_n(n), | 199 m_n(n), |
200 m_private(0) | 200 m_private(0) |
201 { | 201 { |
202 if (m_n & 1) { | |
203 std::cerr << "Error: Odd FFT size " << m_n | |
204 << " not supported in this implementation" | |
205 << std::endl; | |
206 return; | |
207 } | |
202 KissFFTRec *rec = new KissFFTRec; | 208 KissFFTRec *rec = new KissFFTRec; |
203 rec->forward = kiss_fft_alloc(m_n, 0, 0, 0); | 209 rec->forward = kiss_fft_alloc(m_n, 0, 0, 0); |
204 rec->inverse = kiss_fft_alloc(m_n, 1, 0, 0); | 210 rec->inverse = kiss_fft_alloc(m_n, 1, 0, 0); |
205 rec->in = new kiss_fft_cpx[m_n]; | 211 rec->in = new kiss_fft_cpx[m_n]; |
206 rec->out = new kiss_fft_cpx[m_n]; | 212 rec->out = new kiss_fft_cpx[m_n]; |
207 m_private = rec; | 213 m_private = rec; |
208 } | 214 } |
209 | 215 |
210 FFT::~FFT() | 216 FFT::~FFT() |
211 { | 217 { |
218 if (!m_private) return; | |
212 KissFFTRec *rec = (KissFFTRec *)m_private; | 219 KissFFTRec *rec = (KissFFTRec *)m_private; |
213 kiss_fft_free(rec->forward); | 220 kiss_fft_free(rec->forward); |
214 kiss_fft_free(rec->inverse); | 221 kiss_fft_free(rec->inverse); |
215 delete[] rec->in; | 222 delete[] rec->in; |
216 delete[] rec->out; | 223 delete[] rec->out; |
219 void | 226 void |
220 FFT::process(bool inverse, | 227 FFT::process(bool inverse, |
221 const double *rin, const double *iin, | 228 const double *rin, const double *iin, |
222 double *rout, double *iout) | 229 double *rout, double *iout) |
223 { | 230 { |
231 if (!m_private) return; | |
224 KissFFTRec *rec = (KissFFTRec *)m_private; | 232 KissFFTRec *rec = (KissFFTRec *)m_private; |
225 for (int i = 0; i < m_n; ++i) { | 233 for (int i = 0; i < m_n; ++i) { |
226 rec->in[i].r = rin[i]; | 234 rec->in[i].r = rin[i]; |
227 } | 235 } |
228 if (iin) { | 236 if (iin) { |
253 | 261 |
254 FFTReal::FFTReal(unsigned int n) : | 262 FFTReal::FFTReal(unsigned int n) : |
255 m_n(n), | 263 m_n(n), |
256 m_private(0) | 264 m_private(0) |
257 { | 265 { |
266 if (m_n & 1) { | |
267 std::cerr << "Error: Odd FFT size " << m_n | |
268 << " not supported in this implementation" | |
269 << std::endl; | |
270 return; | |
271 } | |
258 KissFFTRealRec *rec = new KissFFTRealRec; | 272 KissFFTRealRec *rec = new KissFFTRealRec; |
259 rec->forward = kiss_fftr_alloc(m_n, 0, 0, 0); | 273 rec->forward = kiss_fftr_alloc(m_n, 0, 0, 0); |
260 rec->inverse = kiss_fftr_alloc(m_n, 1, 0, 0); | 274 rec->inverse = kiss_fftr_alloc(m_n, 1, 0, 0); |
261 rec->out = new kiss_fft_cpx[m_n]; | 275 rec->out = new kiss_fft_cpx[m_n]; |
262 m_private = rec; | 276 m_private = rec; |
263 } | 277 } |
264 | 278 |
265 FFTReal::~FFTReal() | 279 FFTReal::~FFTReal() |
266 { | 280 { |
281 if (!m_private) return; | |
267 KissFFTRealRec *rec = (KissFFTRealRec *)m_private; | 282 KissFFTRealRec *rec = (KissFFTRealRec *)m_private; |
268 kiss_fftr_free(rec->forward); | 283 kiss_fftr_free(rec->forward); |
269 kiss_fftr_free(rec->inverse); | 284 kiss_fftr_free(rec->inverse); |
270 delete[] rec->out; | 285 delete[] rec->out; |
271 } | 286 } |
273 void | 288 void |
274 FFTReal::process(bool inverse, | 289 FFTReal::process(bool inverse, |
275 const double *rin, | 290 const double *rin, |
276 double *rout, double *iout) | 291 double *rout, double *iout) |
277 { | 292 { |
293 if (!m_private) return; | |
278 KissFFTRealRec *rec = (KissFFTRealRec *)m_private; | 294 KissFFTRealRec *rec = (KissFFTRealRec *)m_private; |
279 if (inverse) { | 295 if (inverse) { |
280 kiss_fftr(rec->inverse, rin, rec->out); | 296 kiss_fftr(rec->inverse, rin, rec->out); |
281 for (int i = 0; i < m_n; ++i) { | 297 for (int i = 0; i < m_n; ++i) { |
282 rout[i] = rec->out[i].r; | 298 rout[i] = rec->out[i].r; |