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;