diff vamp-sdk/FFT.h @ 446:d132b92ec65d vampipe

Add FFTComplex class by analogy to FFTReal
author Chris Cannam
date Thu, 18 Aug 2016 16:04:25 +0100
parents 7f7a10bcaff1
children aadfe19a0e94
line wrap: on
line diff
--- a/vamp-sdk/FFT.h	Thu Aug 18 15:06:23 2016 +0100
+++ b/vamp-sdk/FFT.h	Thu Aug 18 16:04:25 2016 +0100
@@ -47,7 +47,11 @@
  * authors. This class provides one-shot (i.e. fixed table state is
  * recalculated every time) double-precision complex-complex
  * transforms. For repeated transforms from real time-domain data, use
- * an FFTReal object instead.
+ * an FFTComplex or FFTReal object instead.
+ *
+ * Note: If the SDK has been compiled with the SINGLE_PRECISION_FFT
+ * flag, then all FFTs will use single precision internally. The
+ * default is double precision. The API uses doubles in either case.
  *
  * The forward transform is unscaled; the inverse transform is scaled
  * by 1/n.
@@ -57,7 +61,7 @@
 public:
     /**
      * Calculate a one-shot forward transform of size n.
-     * n must be a power of 2, greater than 1.
+     * n must be a multiple of 2.
      *
      * ri and ii must point to the real and imaginary component arrays
      * of the input. For real input, ii may be NULL.
@@ -92,10 +96,64 @@
 
 /**
  * A simple FFT implementation provided for convenience of plugin
+ * authors. This class provides double-precision complex-complex
+ * transforms.
+ *
+ * Note: If the SDK has been compiled with the SINGLE_PRECISION_FFT
+ * flag, then all FFTs will use single precision internally. The
+ * default is double precision. The API uses doubles in either case.
+ *
+ * The forward transform is unscaled; the inverse transform is scaled
+ * by 1/n.
+ */
+class FFTComplex
+{
+    /**
+     * Prepare to calculate transforms of size n.
+     * n must be a multiple of 2.
+     */
+    FFTComplex(unsigned int n);
+
+    ~FFTComplex();
+
+    /**
+     * Calculate a forward transform of size n.
+     *
+     * ci must point to the interleaved complex input data of size n
+     * (that is, 2n doubles in total).
+     *
+     * co must point to enough space to receive an interleaved complex
+     * output array of size n (that is, 2n doubles in total).
+     */
+    void forward(const double *ci, double *co);
+
+    /**
+     * Calculate an inverse transform of size n.
+     *
+     * ci must point to an interleaved complex input array of size n
+     * (that is, 2n doubles in total).
+     *
+     * co must point to enough space to receive the interleaved
+     * complex output data of size n (that is, 2n doubles in
+     * total). The output is scaled by 1/n.
+     */
+    void inverse(const double *ci, double *co);
+
+private:
+    class D;
+    D *m_d;
+};
+
+/**
+ * A simple FFT implementation provided for convenience of plugin
  * authors. This class provides transforms between double-precision
  * real time-domain and double-precision complex frequency-domain
  * data.
  *
+ * Note: If the SDK has been compiled with the SINGLE_PRECISION_FFT
+ * flag, then all FFTs will use single precision internally. The
+ * default is double precision. The API uses doubles in either case.
+ *
  * The forward transform is unscaled; the inverse transform is scaled
  * by 1/n.
  */
@@ -103,7 +161,7 @@
 {
     /**
      * Prepare to calculate transforms of size n.
-     * n must be a power of 2, greater than 1.
+     * n must be a multiple of 2.
      */
     FFTReal(unsigned int n);
 
@@ -115,14 +173,15 @@
      * ri must point to the real input data of size n.
      *
      * co must point to enough space to receive an interleaved complex
-     * output array of size n/2+1.
+     * output array of size n/2+1 (that is, n+2 doubles in total).
      */
     void forward(const double *ri, double *co);
 
     /**
      * Calculate an inverse transform of size n.
      *
-     * ci must point to an interleaved complex input array of size n/2+1.
+     * ci must point to an interleaved complex input array of size
+     * n/2+1 (that is, n+2 doubles in total).
      *
      * ro must point to enough space to receive the real output data
      * of size n. The output is scaled by 1/n and only the real part