Making VBR slightly exceed the budget rather than fail
[opus.git] / tests / dft-test.c
index d348d32..ad2d020 100644 (file)
@@ -1,11 +1,36 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define SKIP_CONFIG_H
+
+#ifdef STATIC_MODES
+#undef STATIC_MODES
+#endif
+
 #include <stdio.h>
 #include "kiss_fft.h"
 
+#define CELT_C 
+#include "../libcelt/stack_alloc.h"
+#include "../libcelt/kiss_fft.c"
+#include "../libcelt/mathops.c"
+#include "../libcelt/entcode.c"
+
+
+#ifndef M_PI
+#define M_PI 3.141592653
+#endif
+
+#ifdef FIXED_DEBUG  
+long long celt_mips=0;
+#endif
+int ret = 0;
 
 void check(kiss_fft_cpx  * in,kiss_fft_cpx  * out,int nfft,int isinverse)
 {
     int bin,k;
-    double errpow=0,sigpow=0;
+    double errpow=0,sigpow=0, snr;
     
     for (bin=0;bin<nfft;++bin) {
         double ansr = 0;
@@ -20,20 +45,27 @@ void check(kiss_fft_cpx  * in,kiss_fft_cpx  * out,int nfft,int isinverse)
             if (isinverse)
                 im = -im;
 
-#ifdef FIXED_POINT
-            re /= nfft;
-            im /= nfft;
-#endif            
+            if (!isinverse)
+            {
+               re /= nfft;
+               im /= nfft;
+            }
 
             ansr += in[k].r * re - in[k].i * im;
             ansi += in[k].r * im + in[k].i * re;
         }
+        /*printf ("%d %d ", (int)ansr, (int)ansi);*/
         difr = ansr - out[bin].r;
         difi = ansi - out[bin].i;
         errpow += difr*difr + difi*difi;
         sigpow += ansr*ansr+ansi*ansi;
     }
-    printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,10*log10(sigpow/errpow) );
+    snr = 10*log10(sigpow/errpow);
+    printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
+    if (snr<60) {
+       printf( "** poor snr: %f ** \n", snr);
+       ret = 1;
+    }
 }
 
 void test1d(int nfft,int isinverse)
@@ -42,19 +74,38 @@ void test1d(int nfft,int isinverse)
 
     kiss_fft_cpx  * in = (kiss_fft_cpx*)malloc(buflen);
     kiss_fft_cpx  * out= (kiss_fft_cpx*)malloc(buflen);
-    kiss_fft_cfg  cfg = kiss_fft_alloc(nfft,0,0);
+    kiss_fft_state *cfg = kiss_fft_alloc(nfft,0,0);
     int k;
 
     for (k=0;k<nfft;++k) {
-        in[k].r = (rand() % 65536) - 32768;
-        in[k].i = (rand() % 65536) - 32768;
+        in[k].r = (rand() % 32767) - 16384;
+        in[k].i = (rand() % 32767) - 16384;
     }
 
+#ifdef DOUBLE_PRECISION
+    for (k=0;k<nfft;++k) {
+       in[k].r *= 32768;
+       in[k].i *= 32768;
+    }
+#endif
+    
+    if (isinverse)
+    {
+       for (k=0;k<nfft;++k) {
+          in[k].r /= nfft;
+          in[k].i /= nfft;
+       }
+    }
+    
+    /*for (k=0;k<nfft;++k) printf("%d %d ", in[k].r, in[k].i);printf("\n");*/
+       
     if (isinverse)
        kiss_ifft(cfg,in,out);
     else
        kiss_fft(cfg,in,out);
 
+    /*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/
+
     check(in,out,nfft,isinverse);
 
     free(in);
@@ -64,6 +115,7 @@ void test1d(int nfft,int isinverse)
 
 int main(int argc,char ** argv)
 {
+    ALLOC_STACK;
     if (argc>1) {
         int k;
         for (k=1;k<argc;++k) {
@@ -73,14 +125,18 @@ int main(int argc,char ** argv)
     }else{
         test1d(32,0);
         test1d(32,1);
+        test1d(128,0);
+        test1d(128,1);
+        test1d(256,0);
+        test1d(256,1);
+#ifndef RADIX_TWO_ONLY
         test1d(36,0);
         test1d(36,1);
         test1d(50,0);
         test1d(50,1);
         test1d(120,0);
         test1d(120,1);
-        test1d(105,0);
-        test1d(105,1);
+#endif
     }
-    return 0;
+    return ret;
 }