[FFmpeg-devel] [PATCH 3/4] lavc/fft-test: add FFTW3 tests

Ganesh Ajjanagadde gajjanag at gmail.com
Fri Mar 25 01:50:51 CET 2016


Basic FFTW3 testing; the next patch does some slight modifications for fair
benchmarking purposes.

Signed-off-by: Ganesh Ajjanagadde <gajjanag at gmail.com>
---
 libavcodec/fft-test.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 67 insertions(+), 7 deletions(-)

diff --git a/libavcodec/fft-test.c b/libavcodec/fft-test.c
index d647fde..7fe42be 100644
--- a/libavcodec/fft-test.c
+++ b/libavcodec/fft-test.c
@@ -43,7 +43,10 @@
 #if FFT_FLOAT
 #include "dct.h"
 #include "rdft.h"
-#endif
+#if CONFIG_LIBFFTW3
+#include "fftw.h"
+#endif /* CONFIG_LIBFFTW3 */
+#endif /* FFT_FLOAT */
 
 /* reference fft */
 
@@ -208,6 +211,7 @@ static int check_diff(FFTSample *tab1, FFTSample *tab2, int n, double scale)
             max = e;
     }
     av_log(NULL, AV_LOG_INFO, "max:%f e:%g\n", max, sqrt(error / n));
+
     return err;
 }
 
@@ -217,6 +221,7 @@ static void help(void)
            "usage: fft-test [-h] [-s] [-i] [-n b]\n"
            "-h     print this help\n"
            "-s     speed test\n"
+           "-t     FFTW test\n"
            "-m     (I)MDCT test\n"
            "-d     (I)DCT test\n"
            "-r     (I)RDFT test\n"
@@ -227,6 +232,7 @@ static void help(void)
 
 enum tf_transform {
     TRANSFORM_FFT,
+    TRANSFORM_FFTW,
     TRANSFORM_MDCT,
     TRANSFORM_RDFT,
     TRANSFORM_DCT,
@@ -245,6 +251,10 @@ int main(int argc, char **argv)
 #if FFT_FLOAT
     RDFTContext r;
     DCTContext d;
+#if CONFIG_LIBFFTW3
+    FFTWContext fftw;
+    FFTWComplex *tab_fftw;
+#endif /* CONFIG_LIBFFTW3 */
 #endif /* FFT_FLOAT */
     int it, i, err = 1;
     int do_speed = 0, do_inverse = 0;
@@ -255,7 +265,7 @@ int main(int argc, char **argv)
     av_lfg_init(&prng, 1);
 
     for (;;) {
-        int c = getopt(argc, argv, "hsimrdn:f:c:");
+        int c = getopt(argc, argv, "hsitmrdn:f:c:");
         if (c == -1)
             break;
         switch (c) {
@@ -268,6 +278,11 @@ int main(int argc, char **argv)
         case 'i':
             do_inverse = 1;
             break;
+#if CONFIG_LIBFFTW3
+        case 't':
+            transform = TRANSFORM_FFTW;
+            break;
+#endif /* CONFIG_LIBFFTW3 */
         case 'm':
             transform = TRANSFORM_MDCT;
             break;
@@ -301,6 +316,11 @@ int main(int argc, char **argv)
     tab1     = av_malloc_array(fft_size, sizeof(FFTComplex));
     tab_ref  = av_malloc_array(fft_size, sizeof(FFTComplex));
     tab2     = av_malloc_array(fft_size, sizeof(FFTSample));
+#if CONFIG_LIBFFTW3 && FFT_FLOAT
+    tab_fftw = av_malloc_array(fft_size, sizeof(*tab_fftw));
+    if (!tab_fftw)
+        goto cleanup_fftw;
+#endif /* CONFIG_LIBFFTW3 */
 
     if (!(tab && tab1 && tab_ref && tab2))
         goto cleanup;
@@ -325,6 +345,17 @@ int main(int argc, char **argv)
         if ((err = fft_ref_init(fft_nbits, do_inverse)) < 0)
             goto cleanup;
         break;
+#if CONFIG_LIBFFTW3 && FFT_FLOAT
+    case TRANSFORM_FFTW:
+        if (do_inverse)
+            av_log(NULL, AV_LOG_INFO, "IFFTW");
+        else
+            av_log(NULL, AV_LOG_INFO, "FFTW");
+        ff_fftw_init(&fftw, fft_size, do_inverse);
+        if ((err = fft_ref_init(fft_nbits, do_inverse)) < 0)
+            goto cleanup;
+        break;
+#endif /* CONFIG_LIBFFTW3 */
 #if FFT_FLOAT
 #    if CONFIG_RDFT
     case TRANSFORM_RDFT:
@@ -358,6 +389,10 @@ int main(int argc, char **argv)
     for (i = 0; i < fft_size; i++) {
         tab1[i].re = frandom(&prng);
         tab1[i].im = frandom(&prng);
+#if CONFIG_LIBFFTW3 && FFT_FLOAT
+        tab_fftw[i][0] = tab1[i].re;
+        tab_fftw[i][1] = tab1[i].im;
+#endif /* CONFIG_LIBFFTW3 */
     }
 
     /* checking result */
@@ -385,6 +420,17 @@ int main(int argc, char **argv)
         fft_ref(tab_ref, tab1, fft_nbits);
         err = check_diff(&tab_ref->re, &tab->re, fft_size * 2, 1.0);
         break;
+#if CONFIG_LIBFFTW3 && FFT_FLOAT
+    case TRANSFORM_FFTW:
+        fftw.fft_calc(&fftw, tab_fftw);
+        fft_ref(tab_ref, tab1, fft_nbits);
+        for (i = 0; i < fft_size; i++) {
+            tab[i].re = tab_fftw[i][0];
+            tab[i].im = tab_fftw[i][1];
+        }
+        err = check_diff(&tab_ref->re, &tab->re, fft_size * 2, 1.0);
+        break;
+#endif /* CONFIG_LIBFFTW3 */
 #if FFT_FLOAT
 #if CONFIG_RDFT
     case TRANSFORM_RDFT:
@@ -458,6 +504,11 @@ int main(int argc, char **argv)
                     memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
                     s.fft_calc(&s, tab);
                     break;
+#if CONFIG_LIBFFTW3 && FFT_FLOAT
+                case TRANSFORM_FFTW:
+                    fftw.fft_calc(&fftw, tab_fftw);
+                    break;
+#endif /* CONFIG_LIBFFTW3 */
 #if FFT_FLOAT
                 case TRANSFORM_RDFT:
                     memcpy(tab2, tab1, fft_size * sizeof(FFTSample));
@@ -491,6 +542,11 @@ int main(int argc, char **argv)
     case TRANSFORM_FFT:
         ff_fft_end(&s);
         break;
+#if CONFIG_LIBFFTW3 && FFT_FLOAT
+    case TRANSFORM_FFTW:
+        ff_fftw_deinit(&fftw);
+        break;
+#endif /* CONFIG_LIBFFTW3 */
 #if FFT_FLOAT
 #    if CONFIG_RDFT
     case TRANSFORM_RDFT:
@@ -505,12 +561,16 @@ int main(int argc, char **argv)
 #endif /* FFT_FLOAT */
     }
 
+#if CONFIG_LIBFFTW3 && FFT_FLOAT
+cleanup_fftw:
+    av_freep(&tab_fftw);
+#endif /* CONFIG_LIBFFTW3 */
 cleanup:
-    av_free(tab);
-    av_free(tab1);
-    av_free(tab2);
-    av_free(tab_ref);
-    av_free(exptab);
+    av_freep(&tab);
+    av_freep(&tab1);
+    av_freep(&tab2);
+    av_freep(&tab_ref);
+    av_freep(&exptab);
 
     if (err)
         printf("Error: %d.\n", err);
-- 
2.7.4



More information about the ffmpeg-devel mailing list