Mercurial > hg > qm-dsp
diff dsp/transforms/FFT.h @ 114:f6ccde089491 pvoc
Tidy real-to-complex FFT -- forward and inverse have different arguments, so make them separate functions; document
author | Chris Cannam |
---|---|
date | Wed, 02 Oct 2013 15:04:38 +0100 |
parents | 6cb2b3cd5356 |
children | 6ec45e85ed81 |
line wrap: on
line diff
--- a/dsp/transforms/FFT.h Tue Oct 01 15:38:56 2013 +0100 +++ b/dsp/transforms/FFT.h Wed Oct 02 15:04:38 2013 +0100 @@ -12,31 +12,82 @@ class FFT { public: - FFT(unsigned int nsamples); + /** + * Construct an FFT object to carry out complex-to-complex + * transforms of size nsamples. nsamples must be a power of two in + * this implementation. + */ + FFT(int nsamples); ~FFT(); + /** + * Carry out a forward or inverse transform (depending on the + * value of inverse) of size nsamples, where nsamples is the value + * provided to the constructor above. + * + * realIn and (where present) imagIn should contain nsamples each, + * and realOut and imagOut should point to enough space to receive + * nsamples each. + * + * imagIn may be NULL if the signal is real, but the other + * pointers must be valid. + * + * The inverse transform is scaled by 1/nsamples. + */ void process(bool inverse, const double *realIn, const double *imagIn, double *realOut, double *imagOut); private: - unsigned int m_n; - void *m_private; + int m_n; }; class FFTReal { public: - FFTReal(unsigned int nsamples); + /** + * Construct an FFT object to carry out real-to-complex transforms + * of size nsamples. nsamples must be a power of two in this + * implementation. + */ + FFTReal(int nsamples); ~FFTReal(); - void process(bool inverse, - const double *realIn, + /** + * Carry out a forward real-to-complex transform of size nsamples, + * where nsamples is the value provided to the constructor above. + * + * realIn, realOut, and imagOut must point to (enough space for) + * nsamples values. For consistency with the FFT class above, and + * compatibility with existing code, the conjugate half of the + * output is returned even though it is redundant. + */ + void forward(const double *realIn, double *realOut, double *imagOut); + /** + * Carry out an inverse real transform (i.e. complex-to-real) of + * size nsamples, where nsamples is the value provided to the + * constructor above. + * + * realIn and imagIn should point to at least nsamples/2+1 values; + * if more are provided, only the first nsamples/2+1 values of + * each will be used (the conjugate half will always be deduced + * from the first nsamples/2+1 rather than being read from the + * input data). realOut should point to enough space to receive + * nsamples values. + * + * The inverse transform is scaled by 1/nsamples. + */ + void inverse(const double *realIn, const double *imagIn, + double *realOut); + private: - unsigned int m_n; - void *m_private; + int m_n; + FFT *m_fft; + double *m_r; + double *m_i; + double *m_discard; }; #endif