Making VBR slightly exceed the budget rather than fail
[opus.git] / tests / mdct-test.c
index 909e58e..eb03333 100644 (file)
@@ -2,15 +2,35 @@
 #include "config.h"
 #endif
 
+#define SKIP_CONFIG_H
+
+#ifdef STATIC_MODES
+#undef STATIC_MODES
+#endif
+
 #include <stdio.h>
 #include "mdct.h"
+#define CELT_C 
+#include "../libcelt/stack_alloc.h"
+
+#include "../libcelt/kiss_fft.c"
+#include "../libcelt/mdct.c"
+#include "../libcelt/mathops.c"
+#include "../libcelt/entcode.c"
 
+#ifndef M_PI
+#define M_PI 3.141592653
+#endif
 
-void check(float  * in,float  * out,int nfft,int isinverse)
+#ifdef FIXED_DEBUG  
+long long celt_mips=0;
+#endif
+int ret = 0;
+void check(kiss_fft_scalar  * in,kiss_fft_scalar  * out,int nfft,int isinverse)
 {
     int bin,k;
     double errpow=0,sigpow=0;
-    
+    double snr;
     for (bin=0;bin<nfft/2;++bin) {
         double ansr = 0;
         double difr;
@@ -28,14 +48,19 @@ void check(float  * in,float  * out,int nfft,int isinverse)
         errpow += difr*difr;
         sigpow += ansr*ansr;
     }
-    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 check_inv(float  * in,float  * out,int nfft,int isinverse)
+void check_inv(kiss_fft_scalar  * in,kiss_fft_scalar  * out,int nfft,int isinverse)
 {
    int bin,k;
    double errpow=0,sigpow=0;
-    
+   double snr;
    for (bin=0;bin<nfft;++bin) {
       double ansr = 0;
       double difr;
@@ -43,7 +68,9 @@ void check_inv(float  * in,float  * out,int nfft,int isinverse)
       for (k=0;k<nfft/2;++k) {
          double phase = 2*M_PI*(bin+.5+.25*nfft)*(k+.5)/nfft;
          double re = cos(phase);
-            
+
+         //re *= 2;
+
          ansr += in[k] * re;
       }
       /*printf ("%f %f\n", ansr, out[bin]);*/
@@ -51,28 +78,36 @@ void check_inv(float  * in,float  * out,int nfft,int isinverse)
       errpow += difr*difr;
       sigpow += ansr*ansr;
    }
-   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)
 {
     mdct_lookup cfg;
-    size_t buflen = sizeof(float)*nfft;
+    size_t buflen = sizeof(kiss_fft_scalar)*nfft;
 
-    float  * in = (float*)malloc(buflen);
-    float  * out= (float*)malloc(buflen);
+    kiss_fft_scalar  * in = (kiss_fft_scalar*)malloc(buflen);
+    kiss_fft_scalar  * out= (kiss_fft_scalar*)malloc(buflen);
+    celt_word16  * window= (celt_word16*)malloc(sizeof(celt_word16)*nfft/2);
     int k;
 
-    mdct_init(&cfg, nfft);
+    clt_mdct_init(&cfg, nfft, 0);
     for (k=0;k<nfft;++k) {
-        in[k] = (rand() % 65536) - 32768;
+        in[k] = (rand() % 32768) - 16384;
     }
 
+    for (k=0;k<nfft/2;++k) {
+       window[k] = Q15ONE;
+    }
 #ifdef DOUBLE_PRECISION
     for (k=0;k<nfft;++k) {
-       in[k].r *= 65536;
-       in[k].i *= 65536;
+       in[k] *= 32768;
     }
 #endif
     
@@ -87,10 +122,12 @@ void test1d(int nfft,int isinverse)
        
     if (isinverse)
     {
-       mdct_backward(&cfg,in,out);
+       for (k=0;k<nfft;++k)
+          out[k] = 0;
+       clt_mdct_backward(&cfg,in,out, window, nfft/2, 0);
        check_inv(in,out,nfft,isinverse);
     } else {
-       mdct_forward(&cfg,in,out);
+       clt_mdct_forward(&cfg,in,out,window, nfft/2, 0);
        check(in,out,nfft,isinverse);
     }
     /*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/
@@ -98,11 +135,12 @@ void test1d(int nfft,int isinverse)
 
     free(in);
     free(out);
-    mdct_clear(&cfg);
+    clt_mdct_clear(&cfg);
 }
 
 int main(int argc,char ** argv)
 {
+    ALLOC_STACK;
     if (argc>1) {
         int k;
         for (k=1;k<argc;++k) {
@@ -112,13 +150,20 @@ int main(int argc,char ** argv)
     }else{
         test1d(32,0);
         test1d(32,1);
-        exit(0);
-        test1d(36,0);
-        test1d(36,1);
-        test1d(50,0);
-        test1d(50,1);
+        test1d(256,0);
+        test1d(256,1);
+        test1d(512,0);
+        test1d(512,1);
+#ifndef RADIX_TWO_ONLY
+        test1d(40,0);
+        test1d(40,1);
         test1d(120,0);
         test1d(120,1);
+        test1d(240,0);
+        test1d(240,1);
+        test1d(480,0);
+        test1d(480,1);
+#endif
     }
-    return 0;
+    return ret;
 }