Blame tests/mdct-test.c

Packit 664db3
#ifdef HAVE_CONFIG_H
Packit 664db3
#include "config.h"
Packit 664db3
#endif
Packit 664db3
Packit 664db3
#include <stdio.h>
Packit 664db3
#include "mdct.c"
Packit 664db3
#include "stack_alloc.h"
Packit 664db3
#include "kiss_fft.c"
Packit 664db3
Packit 664db3
#ifndef M_PI
Packit 664db3
#define M_PI 3.141592653
Packit 664db3
#endif
Packit 664db3
Packit 664db3
int ret = 0;
Packit 664db3
void check(kiss_fft_scalar  * in,kiss_fft_scalar  * out,int nfft,int isinverse)
Packit 664db3
{
Packit 664db3
    int bin,k;
Packit 664db3
    double errpow=0,sigpow=0;
Packit 664db3
    double snr;
Packit 664db3
    for (bin=0;bin
Packit 664db3
        double ansr = 0;
Packit 664db3
        double difr;
Packit 664db3
Packit 664db3
        for (k=0;k
Packit 664db3
           double phase = 2*M_PI*(k+.5+.25*nfft)*(bin+.5)/nfft;
Packit 664db3
           double re = cos(phase);
Packit 664db3
            
Packit 664db3
           re /= nfft/4;
Packit 664db3
Packit 664db3
           ansr += in[k] * re;
Packit 664db3
        }
Packit 664db3
        /*printf ("%f %f\n", ansr, out[bin]);*/
Packit 664db3
        difr = ansr - out[bin];
Packit 664db3
        errpow += difr*difr;
Packit 664db3
        sigpow += ansr*ansr;
Packit 664db3
    }
Packit 664db3
    snr = 10*log10(sigpow/errpow);
Packit 664db3
    printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
Packit 664db3
    if (snr<60) {
Packit 664db3
       printf( "** poor snr: %f **\n", snr);
Packit 664db3
       ret = 1;
Packit 664db3
    }
Packit 664db3
}
Packit 664db3
Packit 664db3
void check_inv(kiss_fft_scalar  * in,kiss_fft_scalar  * out,int nfft,int isinverse)
Packit 664db3
{
Packit 664db3
   int bin,k;
Packit 664db3
   double errpow=0,sigpow=0;
Packit 664db3
   double snr;
Packit 664db3
   for (bin=0;bin
Packit 664db3
      double ansr = 0;
Packit 664db3
      double difr;
Packit 664db3
Packit 664db3
      for (k=0;k
Packit 664db3
         double phase = 2*M_PI*(bin+.5+.25*nfft)*(k+.5)/nfft;
Packit 664db3
         double re = cos(phase);
Packit 664db3
Packit 664db3
         //re *= 2;
Packit 664db3
Packit 664db3
         ansr += in[k] * re;
Packit 664db3
      }
Packit 664db3
      /*printf ("%f %f\n", ansr, out[bin]);*/
Packit 664db3
      difr = ansr - out[bin];
Packit 664db3
      errpow += difr*difr;
Packit 664db3
      sigpow += ansr*ansr;
Packit 664db3
   }
Packit 664db3
   snr = 10*log10(sigpow/errpow);
Packit 664db3
   printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
Packit 664db3
   if (snr<60) {
Packit 664db3
      printf( "** poor snr: %f **\n", snr);
Packit 664db3
      ret = 1;
Packit 664db3
   }
Packit 664db3
}
Packit 664db3
Packit 664db3
Packit 664db3
void test1d(int nfft,int isinverse)
Packit 664db3
{
Packit 664db3
    mdct_lookup cfg;
Packit 664db3
    size_t buflen = sizeof(kiss_fft_scalar)*nfft;
Packit 664db3
Packit 664db3
    kiss_fft_scalar  * in = (kiss_fft_scalar*)malloc(buflen);
Packit 664db3
    kiss_fft_scalar  * out= (kiss_fft_scalar*)malloc(buflen);
Packit 664db3
    celt_word16_t  * window= (celt_word16_t*)malloc(sizeof(celt_word16_t)*nfft/2);
Packit 664db3
    int k;
Packit 664db3
Packit 664db3
    mdct_init(&cfg, nfft);
Packit 664db3
    for (k=0;k
Packit 664db3
        in[k] = (rand() % 32768) - 16384;
Packit 664db3
    }
Packit 664db3
Packit 664db3
    for (k=0;k
Packit 664db3
       window[k] = Q15ONE;
Packit 664db3
    }
Packit 664db3
#ifdef DOUBLE_PRECISION
Packit 664db3
    for (k=0;k
Packit 664db3
       in[k] *= 32768;
Packit 664db3
    }
Packit 664db3
#endif
Packit 664db3
    
Packit 664db3
    if (isinverse)
Packit 664db3
    {
Packit 664db3
       for (k=0;k
Packit 664db3
          in[k] /= nfft;
Packit 664db3
       }
Packit 664db3
    }
Packit 664db3
    
Packit 664db3
    /*for (k=0;k
Packit 664db3
       
Packit 664db3
    if (isinverse)
Packit 664db3
    {
Packit 664db3
       for (k=0;k
Packit 664db3
          out[k] = 0;
Packit 664db3
       mdct_backward(&cfg,in,out, window, nfft/2);
Packit 664db3
       check_inv(in,out,nfft,isinverse);
Packit 664db3
    } else {
Packit 664db3
       mdct_forward(&cfg,in,out,window, nfft/2);
Packit 664db3
       check(in,out,nfft,isinverse);
Packit 664db3
    }
Packit 664db3
    /*for (k=0;k
Packit 664db3
Packit 664db3
Packit 664db3
    free(in);
Packit 664db3
    free(out);
Packit 664db3
    mdct_clear(&cfg;;
Packit 664db3
}
Packit 664db3
Packit 664db3
int main(int argc,char ** argv)
Packit 664db3
{
Packit 664db3
    ALLOC_STACK;
Packit 664db3
    if (argc>1) {
Packit 664db3
        int k;
Packit 664db3
        for (k=1;k
Packit 664db3
            test1d(atoi(argv[k]),0);
Packit 664db3
            test1d(atoi(argv[k]),1);
Packit 664db3
        }
Packit 664db3
    }else{
Packit 664db3
        test1d(32,0);
Packit 664db3
        test1d(32,1);
Packit 664db3
        test1d(256,0);
Packit 664db3
        test1d(256,1);
Packit 664db3
        test1d(512,0);
Packit 664db3
        test1d(512,1);
Packit 664db3
#ifndef RADIX_TWO_ONLY
Packit 664db3
        test1d(40,0);
Packit 664db3
        test1d(40,1);
Packit 664db3
        test1d(56,0);
Packit 664db3
        test1d(56,1);
Packit 664db3
        test1d(120,0);
Packit 664db3
        test1d(120,1);
Packit 664db3
        test1d(240,0);
Packit 664db3
        test1d(240,1);
Packit 664db3
        test1d(480,0);
Packit 664db3
        test1d(480,1);
Packit 664db3
#endif
Packit 664db3
    }
Packit 664db3
    return ret;
Packit 664db3
}