Changed all the celt*int*_t types to remove the _t suffix, which is reserved
[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 #define CELT_C 
9 #include "../libcelt/stack_alloc.h"
10 #include "../libcelt/kiss_fft.c"
11 #include "../libcelt/entcode.c"
12
13
14 #ifndef M_PI
15 #define M_PI 3.141592653
16 #endif
17
18 #ifdef FIXED_DEBUG  
19 long long celt_mips=0;
20 #endif
21 int ret = 0;
22
23 void check(kiss_fft_cpx  * in,kiss_fft_cpx  * out,int nfft,int isinverse)
24 {
25     int bin,k;
26     double errpow=0,sigpow=0, snr;
27     
28     for (bin=0;bin<nfft;++bin) {
29         double ansr = 0;
30         double ansi = 0;
31         double difr;
32         double difi;
33
34         for (k=0;k<nfft;++k) {
35             double phase = -2*M_PI*bin*k/nfft;
36             double re = cos(phase);
37             double im = sin(phase);
38             if (isinverse)
39                 im = -im;
40
41             if (!isinverse)
42             {
43                re /= nfft;
44                im /= nfft;
45             }
46
47             ansr += in[k].r * re - in[k].i * im;
48             ansi += in[k].r * im + in[k].i * re;
49         }
50         /*printf ("%d %d ", (int)ansr, (int)ansi);*/
51         difr = ansr - out[bin].r;
52         difi = ansi - out[bin].i;
53         errpow += difr*difr + difi*difi;
54         sigpow += ansr*ansr+ansi*ansi;
55     }
56     snr = 10*log10(sigpow/errpow);
57     printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
58     if (snr<60) {
59        printf( "** poor snr: %f ** \n", snr);
60        ret = 1;
61     }
62 }
63
64 void test1d(int nfft,int isinverse)
65 {
66     size_t buflen = sizeof(kiss_fft_cpx)*nfft;
67
68     kiss_fft_cpx  * in = (kiss_fft_cpx*)malloc(buflen);
69     kiss_fft_cpx  * out= (kiss_fft_cpx*)malloc(buflen);
70     kiss_fft_cfg  cfg = kiss_fft_alloc(nfft,0,0);
71     int k;
72
73     for (k=0;k<nfft;++k) {
74         in[k].r = (rand() % 32767) - 16384;
75         in[k].i = (rand() % 32767) - 16384;
76     }
77
78 #ifdef DOUBLE_PRECISION
79     for (k=0;k<nfft;++k) {
80        in[k].r *= 32768;
81        in[k].i *= 32768;
82     }
83 #endif
84     
85     if (isinverse)
86     {
87        for (k=0;k<nfft;++k) {
88           in[k].r /= nfft;
89           in[k].i /= nfft;
90        }
91     }
92     
93     /*for (k=0;k<nfft;++k) printf("%d %d ", in[k].r, in[k].i);printf("\n");*/
94        
95     if (isinverse)
96        kiss_ifft(cfg,in,out);
97     else
98        kiss_fft(cfg,in,out);
99
100     /*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/
101
102     check(in,out,nfft,isinverse);
103
104     free(in);
105     free(out);
106     free(cfg);
107 }
108
109 int main(int argc,char ** argv)
110 {
111     ALLOC_STACK;
112     if (argc>1) {
113         int k;
114         for (k=1;k<argc;++k) {
115             test1d(atoi(argv[k]),0);
116             test1d(atoi(argv[k]),1);
117         }
118     }else{
119         test1d(32,0);
120         test1d(32,1);
121         test1d(128,0);
122         test1d(128,1);
123         test1d(256,0);
124         test1d(256,1);
125 #ifndef RADIX_TWO_ONLY
126         test1d(36,0);
127         test1d(36,1);
128         test1d(50,0);
129         test1d(50,1);
130         test1d(120,0);
131         test1d(120,1);
132         test1d(105,0);
133         test1d(105,1);
134 #endif
135     }
136     return ret;
137 }