Blame tests/dft-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 "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
Packit 664db3
void check(kiss_fft_cpx  * in,kiss_fft_cpx  * out,int nfft,int isinverse)
Packit 664db3
{
Packit 664db3
    int bin,k;
Packit 664db3
    double errpow=0,sigpow=0, snr;
Packit 664db3
    
Packit 664db3
    for (bin=0;bin
Packit 664db3
        double ansr = 0;
Packit 664db3
        double ansi = 0;
Packit 664db3
        double difr;
Packit 664db3
        double difi;
Packit 664db3
Packit 664db3
        for (k=0;k
Packit 664db3
            double phase = -2*M_PI*bin*k/nfft;
Packit 664db3
            double re = cos(phase);
Packit 664db3
            double im = sin(phase);
Packit 664db3
            if (isinverse)
Packit 664db3
                im = -im;
Packit 664db3
Packit 664db3
            if (!isinverse)
Packit 664db3
            {
Packit 664db3
               re /= nfft;
Packit 664db3
               im /= nfft;
Packit 664db3
            }
Packit 664db3
Packit 664db3
            ansr += in[k].r * re - in[k].i * im;
Packit 664db3
            ansi += in[k].r * im + in[k].i * re;
Packit 664db3
        }
Packit 664db3
        /*printf ("%d %d ", (int)ansr, (int)ansi);*/
Packit 664db3
        difr = ansr - out[bin].r;
Packit 664db3
        difi = ansi - out[bin].i;
Packit 664db3
        errpow += difr*difr + difi*difi;
Packit 664db3
        sigpow += ansr*ansr+ansi*ansi;
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 test1d(int nfft,int isinverse)
Packit 664db3
{
Packit 664db3
    size_t buflen = sizeof(kiss_fft_cpx)*nfft;
Packit 664db3
Packit 664db3
    kiss_fft_cpx  * in = (kiss_fft_cpx*)malloc(buflen);
Packit 664db3
    kiss_fft_cpx  * out= (kiss_fft_cpx*)malloc(buflen);
Packit 664db3
    kiss_fft_cfg  cfg = kiss_fft_alloc(nfft,0,0);
Packit 664db3
    int k;
Packit 664db3
Packit 664db3
    for (k=0;k
Packit 664db3
        in[k].r = (rand() % 32767) - 16384;
Packit 664db3
        in[k].i = (rand() % 32767) - 16384;
Packit 664db3
    }
Packit 664db3
Packit 664db3
#ifdef DOUBLE_PRECISION
Packit 664db3
    for (k=0;k
Packit 664db3
       in[k].r *= 32768;
Packit 664db3
       in[k].i *= 32768;
Packit 664db3
    }
Packit 664db3
#endif
Packit 664db3
    
Packit 664db3
    if (isinverse)
Packit 664db3
    {
Packit 664db3
       for (k=0;k
Packit 664db3
          in[k].r /= nfft;
Packit 664db3
          in[k].i /= nfft;
Packit 664db3
       }
Packit 664db3
    }
Packit 664db3
    
Packit 664db3
    /*for (k=0;k
Packit 664db3
       
Packit 664db3
    if (isinverse)
Packit 664db3
       kiss_ifft(cfg,in,out);
Packit 664db3
    else
Packit 664db3
       kiss_fft(cfg,in,out);
Packit 664db3
Packit 664db3
    /*for (k=0;k
Packit 664db3
Packit 664db3
    check(in,out,nfft,isinverse);
Packit 664db3
Packit 664db3
    free(in);
Packit 664db3
    free(out);
Packit 664db3
    free(cfg);
Packit 664db3
}
Packit 664db3
Packit 664db3
int main(int argc,char ** argv)
Packit 664db3
{
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(128,0);
Packit 664db3
        test1d(128,1);
Packit 664db3
        test1d(256,0);
Packit 664db3
        test1d(256,1);
Packit 664db3
#ifndef RADIX_TWO_ONLY
Packit 664db3
        test1d(36,0);
Packit 664db3
        test1d(36,1);
Packit 664db3
        test1d(50,0);
Packit 664db3
        test1d(50,1);
Packit 664db3
        test1d(120,0);
Packit 664db3
        test1d(120,1);
Packit 664db3
        test1d(105,0);
Packit 664db3
        test1d(105,1);
Packit 664db3
#endif
Packit 664db3
    }
Packit 664db3
    return ret;
Packit 664db3
}