lookahead no longer defined when creating a mode
[opus.git] / tests / dft-test.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include <stdio.h>
6 #include "kiss_fft.h"
7
8 int ret = 0;
9
10 void check(kiss_fft_cpx  * in,kiss_fft_cpx  * out,int nfft,int isinverse)
11 {
12     int bin,k;
13     double errpow=0,sigpow=0, snr;
14     
15     for (bin=0;bin<nfft;++bin) {
16         double ansr = 0;
17         double ansi = 0;
18         double difr;
19         double difi;
20
21         for (k=0;k<nfft;++k) {
22             double phase = -2*M_PI*bin*k/nfft;
23             double re = cos(phase);
24             double im = sin(phase);
25             if (isinverse)
26                 im = -im;
27
28             if (!isinverse)
29             {
30                re /= nfft;
31                im /= nfft;
32             }
33
34             ansr += in[k].r * re - in[k].i * im;
35             ansi += in[k].r * im + in[k].i * re;
36         }
37         /*printf ("%d %d ", (int)ansr, (int)ansi);*/
38         difr = ansr - out[bin].r;
39         difi = ansi - out[bin].i;
40         errpow += difr*difr + difi*difi;
41         sigpow += ansr*ansr+ansi*ansi;
42     }
43     snr = 10*log10(sigpow/errpow);
44     printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
45     if (snr<60) {
46        printf( "** poor snr: %f ** \n", snr);
47        ret = 1;
48     }
49 }
50
51 void test1d(int nfft,int isinverse)
52 {
53     size_t buflen = sizeof(kiss_fft_cpx)*nfft;
54
55     kiss_fft_cpx  * in = (kiss_fft_cpx*)malloc(buflen);
56     kiss_fft_cpx  * out= (kiss_fft_cpx*)malloc(buflen);
57     kiss_fft_cfg  cfg = kiss_fft_alloc(nfft,0,0);
58     int k;
59
60     for (k=0;k<nfft;++k) {
61         in[k].r = (rand() % 32767) - 16384;
62         in[k].i = (rand() % 32767) - 16384;
63     }
64
65 #ifdef DOUBLE_PRECISION
66     for (k=0;k<nfft;++k) {
67        in[k].r *= 32768;
68        in[k].i *= 32768;
69     }
70 #endif
71     
72     if (isinverse)
73     {
74        for (k=0;k<nfft;++k) {
75           in[k].r /= nfft;
76           in[k].i /= nfft;
77        }
78     }
79     
80     /*for (k=0;k<nfft;++k) printf("%d %d ", in[k].r, in[k].i);printf("\n");*/
81        
82     if (isinverse)
83        kiss_ifft(cfg,in,out);
84     else
85        kiss_fft(cfg,in,out);
86
87     /*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/
88
89     check(in,out,nfft,isinverse);
90
91     free(in);
92     free(out);
93     free(cfg);
94 }
95
96 int main(int argc,char ** argv)
97 {
98     if (argc>1) {
99         int k;
100         for (k=1;k<argc;++k) {
101             test1d(atoi(argv[k]),0);
102             test1d(atoi(argv[k]),1);
103         }
104     }else{
105         test1d(32,0);
106         test1d(32,1);
107         test1d(128,0);
108         test1d(128,1);
109         test1d(256,0);
110         test1d(256,1);
111 #ifndef RADIX_TWO_ONLY
112         test1d(36,0);
113         test1d(36,1);
114         test1d(50,0);
115         test1d(50,1);
116         test1d(120,0);
117         test1d(120,1);
118         test1d(105,0);
119         test1d(105,1);
120 #endif
121     }
122     return ret;
123 }