Mercurial > hg > vamp-plugin-sdk
diff src/vamp-sdk/FFT.cpp @ 445:7f7a10bcaff1 vampipe
Single or double-precision FFTs (double in the default build), not both
author | Chris Cannam |
---|---|
date | Thu, 18 Aug 2016 15:06:23 +0100 |
parents | 41baa6241da2 |
children | d132b92ec65d |
line wrap: on
line diff
--- a/src/vamp-sdk/FFT.cpp Thu Aug 18 14:43:52 2016 +0100 +++ b/src/vamp-sdk/FFT.cpp Thu Aug 18 15:06:23 2016 +0100 @@ -47,36 +47,7 @@ _VAMP_SDK_PLUGSPACE_BEGIN(FFT.cpp) -// Override C linkage for KissFFT headers. So long as we have already -// included all of the other (system etc) headers KissFFT depends on, -// this should work out OK -#undef __cplusplus - -namespace KissSingle { -#undef KISS_FFT_H -#undef KISS_FTR_H -#undef KISS_FFT__GUTS_H -#undef FIXED_POINT -#undef USE_SIMD -#undef kiss_fft_scalar -#define kiss_fft_scalar float -inline void free(void *ptr) { ::free(ptr); } -#include "ext/kiss_fft.c" -#include "ext/kiss_fftr.c" -} - -namespace KissDouble { -#undef KISS_FFT_H -#undef KISS_FTR_H -#undef KISS_FFT__GUTS_H -#undef FIXED_POINT -#undef USE_SIMD -#undef kiss_fft_scalar -#define kiss_fft_scalar double -inline void free(void *ptr) { ::free(ptr); } -#include "ext/kiss_fft.c" -#include "ext/kiss_fftr.c" -} +#include "FFTimpl.cpp" namespace Vamp { @@ -86,9 +57,9 @@ double *ro, double *io) { int n(un); - KissDouble::kiss_fft_cfg c = KissDouble::kiss_fft_alloc(n, false, 0, 0); - KissDouble::kiss_fft_cpx *in = new KissDouble::kiss_fft_cpx[n]; - KissDouble::kiss_fft_cpx *out = new KissDouble::kiss_fft_cpx[n]; + Kiss::kiss_fft_cfg c = Kiss::kiss_fft_alloc(n, false, 0, 0); + Kiss::kiss_fft_cpx *in = new Kiss::kiss_fft_cpx[n]; + Kiss::kiss_fft_cpx *out = new Kiss::kiss_fft_cpx[n]; for (int i = 0; i < n; ++i) { in[i].r = ri[i]; in[i].i = 0; @@ -103,7 +74,7 @@ ro[i] = out[i].r; io[i] = out[i].i; } - KissDouble::kiss_fft_free(c); + Kiss::kiss_fft_free(c); delete[] in; delete[] out; } @@ -114,9 +85,9 @@ double *ro, double *io) { int n(un); - KissDouble::kiss_fft_cfg c = KissDouble::kiss_fft_alloc(n, true, 0, 0); - KissDouble::kiss_fft_cpx *in = new KissDouble::kiss_fft_cpx[n]; - KissDouble::kiss_fft_cpx *out = new KissDouble::kiss_fft_cpx[n]; + Kiss::kiss_fft_cfg c = Kiss::kiss_fft_alloc(n, true, 0, 0); + Kiss::kiss_fft_cpx *in = new Kiss::kiss_fft_cpx[n]; + Kiss::kiss_fft_cpx *out = new Kiss::kiss_fft_cpx[n]; for (int i = 0; i < n; ++i) { in[i].r = ri[i]; in[i].i = 0; @@ -132,7 +103,7 @@ ro[i] = out[i].r * scale; io[i] = out[i].i * scale; } - KissDouble::kiss_fft_free(c); + Kiss::kiss_fft_free(c); delete[] in; delete[] out; } @@ -143,18 +114,26 @@ D(int n) : m_n(n), - m_cf(KissSingle::kiss_fftr_alloc(n, false, 0, 0)), - m_ci(KissSingle::kiss_fftr_alloc(n, true, 0, 0)), - m_freq(new KissSingle::kiss_fft_cpx[n/2+1]) { } + m_cf(Kiss::kiss_fftr_alloc(n, false, 0, 0)), + m_ci(Kiss::kiss_fftr_alloc(n, true, 0, 0)), + m_ri(new Kiss::kiss_fft_scalar[m_n]), + m_ro(new Kiss::kiss_fft_scalar[m_n]), + m_freq(new Kiss::kiss_fft_cpx[n/2+1]) { } ~D() { - KissSingle::kiss_fftr_free(m_cf); - KissSingle::kiss_fftr_free(m_ci); + Kiss::kiss_fftr_free(m_cf); + Kiss::kiss_fftr_free(m_ci); + delete[] m_ri; + delete[] m_ro; delete[] m_freq; } - void forward(const float *ri, float *co) { - KissSingle::kiss_fftr(m_cf, ri, m_freq); + void forward(const double *ri, double *co) { + for (int i = 0; i < m_n; ++i) { + // in case kiss_fft_scalar is float + m_ri[i] = ri[i]; + } + Kiss::kiss_fftr(m_cf, m_ri, m_freq); int hs = m_n/2 + 1; for (int i = 0; i < hs; ++i) { co[i*2] = m_freq[i].r; @@ -162,24 +141,26 @@ } } - void inverse(const float *ci, float *ro) { + void inverse(const double *ci, double *ro) { int hs = m_n/2 + 1; for (int i = 0; i < hs; ++i) { m_freq[i].r = ci[i*2]; m_freq[i].i = ci[i*2+1]; } - KissSingle::kiss_fftri(m_ci, m_freq, ro); + Kiss::kiss_fftri(m_ci, m_freq, m_ro); double scale = 1.0 / double(m_n); for (int i = 0; i < m_n; ++i) { - ro[i] *= scale; + ro[i] = m_ro[i] * scale; } } private: int m_n; - KissSingle::kiss_fftr_cfg m_cf; - KissSingle::kiss_fftr_cfg m_ci; - KissSingle::kiss_fft_cpx *m_freq; + Kiss::kiss_fftr_cfg m_cf; + Kiss::kiss_fftr_cfg m_ci; + Kiss::kiss_fft_scalar *m_ri; + Kiss::kiss_fft_scalar *m_ro; + Kiss::kiss_fft_cpx *m_freq; }; FFTReal::FFTReal(unsigned int n) : @@ -193,13 +174,13 @@ } void -FFTReal::forward(const float *ri, float *co) +FFTReal::forward(const double *ri, double *co) { m_d->forward(ri, co); } void -FFTReal::inverse(const float *ci, float *ro) +FFTReal::inverse(const double *ci, double *ro) { m_d->inverse(ci, ro); }