5c242cfcec524117fe992724a72d3a64bbea2e29
[opus.git] / libcelt / tests / cwrs32-test.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include <stdio.h>
6 #include <string.h>
7
8 #define CELT_C
9 #include "../libcelt/stack_alloc.h"
10 #include "../libcelt/entenc.c"
11 #include "../libcelt/entdec.c"
12 #include "../libcelt/entcode.c"
13 #include "../libcelt/cwrs.c"
14 #include "../libcelt/mathops.c"
15 #include "../libcelt/rate.h"
16
17 #define NMAX (208)
18 #define KMAX (128)
19
20 static const int pn[40]={
21    2,   3,   4,   5,   6,   7,   8,   9,  10,
22   11,  12,  13,  14,  16,  18,  20,  22,  24,
23   26,  28,  32,  36,  40,  44,  48,  52,  56,
24   64,  72,  80,  88,  96, 104, 112, 128, 144,
25  160, 176, 192, 208
26 };
27
28 static const int pkmax[40]={
29  128, 128, 128, 128,  88,  52,  36,  26,  22,
30   18,  16,  15,  13,  12,  11,  10,   9,   9,
31    8,   8,   7,   7,   7,   6,   6,   6,   6,
32    5,   5,   5,   5,   5,   5,   4,   4,   4,
33    4,   4,   4,   4
34 };
35
36 int main(int _argc,char **_argv){
37   int t;
38   int n;
39   ALLOC_STACK;
40   for(t=0;t<40;t++){
41     int pseudo;
42     n=pn[t];
43     for(pseudo=1;pseudo<41;pseudo++)
44     {
45       int k;
46       opus_uint32 uu[KMAX+2U];
47       opus_uint32 inc;
48       opus_uint32 nc;
49       opus_uint32 i;
50       k=get_pulses(pseudo);
51       if (k>pkmax[t])break;
52       printf("Testing CWRS with N=%i, K=%i...\n",n,k);
53       nc=ncwrs_urow(n,k,uu);
54       inc=nc/10000;
55       if(inc<1)inc=1;
56       for(i=0;i<nc;i+=inc){
57         opus_uint32 u[KMAX+2U];
58         int           y[NMAX];
59         int           sy;
60         int           yy[5];
61         opus_uint32 v;
62         opus_uint32 ii;
63         int           kk;
64         int           j;
65         memcpy(u,uu,(k+2U)*sizeof(*u));
66         cwrsi(n,k,i,y,u);
67         sy=0;
68         for(j=0;j<n;j++)sy+=ABS(y[j]);
69         if(sy!=k){
70           fprintf(stderr,"N=%d Pulse count mismatch in cwrsi (%d!=%d).\n",
71            n,sy,k);
72           return 99;
73         }
74         /*printf("%6u of %u:",i,nc);
75         for(j=0;j<n;j++)printf(" %+3i",y[j]);
76         printf(" ->");*/
77         ii=icwrs(n,k,&v,y,u);
78         if(ii!=i){
79           fprintf(stderr,"Combination-index mismatch (%lu!=%lu).\n",
80            (long)ii,(long)i);
81           return 1;
82         }
83         if(v!=nc){
84           fprintf(stderr,"Combination count mismatch (%lu!=%lu).\n",
85            (long)v,(long)nc);
86           return 2;
87         }
88 #ifndef SMALL_FOOTPRINT
89         if(n==2){
90           cwrsi2(k,i,yy);
91           for(j=0;j<2;j++)if(yy[j]!=y[j]){
92             fprintf(stderr,"N=2 pulse vector mismatch ({%i,%i}!={%i,%i}).\n",
93              yy[0],yy[1],y[0],y[1]);
94             return 3;
95           }
96           ii=icwrs2(yy,&kk);
97           if(ii!=i){
98             fprintf(stderr,"N=2 combination-index mismatch (%lu!=%lu).\n",
99              (long)ii,(long)i);
100             return 4;
101           }
102           if(kk!=k){
103             fprintf(stderr,"N=2 pulse count mismatch (%i,%i).\n",kk,k);
104             return 5;
105           }
106           v=ncwrs2(k);
107           if(v!=nc){
108             fprintf(stderr,"N=2 combination count mismatch (%lu,%lu).\n",
109              (long)v,(long)nc);
110             return 6;
111           }
112         }
113         else if(n==3){
114           cwrsi3(k,i,yy);
115           for(j=0;j<3;j++)if(yy[j]!=y[j]){
116             fprintf(stderr,"N=3 pulse vector mismatch "
117              "({%i,%i,%i}!={%i,%i,%i}).\n",yy[0],yy[1],yy[2],y[0],y[1],y[2]);
118             return 7;
119           }
120           ii=icwrs3(yy,&kk);
121           if(ii!=i){
122             fprintf(stderr,"N=3 combination-index mismatch (%lu!=%lu).\n",
123              (long)ii,(long)i);
124             return 8;
125           }
126           if(kk!=k){
127             fprintf(stderr,"N=3 pulse count mismatch (%i!=%i).\n",kk,k);
128             return 9;
129           }
130           v=ncwrs3(k);
131           if(v!=nc){
132             fprintf(stderr,"N=3 combination count mismatch (%lu!=%lu).\n",
133              (long)v,(long)nc);
134             return 10;
135           }
136         }
137         else if(n==4){
138           cwrsi4(k,i,yy);
139           for(j=0;j<4;j++)if(yy[j]!=y[j]){
140             fprintf(stderr,"N=4 pulse vector mismatch "
141              "({%i,%i,%i,%i}!={%i,%i,%i,%i}.\n",
142              yy[0],yy[1],yy[2],yy[3],y[0],y[1],y[2],y[3]);
143             return 11;
144           }
145           ii=icwrs4(yy,&kk);
146           if(ii!=i){
147             fprintf(stderr,"N=4 combination-index mismatch (%lu!=%lu).\n",
148              (long)ii,(long)i);
149             return 12;
150           }
151           if(kk!=k){
152             fprintf(stderr,"N=4 pulse count mismatch (%i!=%i).\n",kk,k);
153             return 13;
154           }
155           v=ncwrs4(k);
156           if(v!=nc){
157             fprintf(stderr,"N=4 combination count mismatch (%lu!=%lu).\n",
158              (long)v,(long)nc);
159             return 14;
160           }
161         }
162 #endif /* SMALL_FOOTPRINT */
163         /*printf(" %6u\n",i);*/
164       }
165       /*printf("\n");*/
166     }
167   }
168   return 0;
169 }