comparison fft-test.c @ 12364:2e96cab6ecde libavcodec

fft-test: exit with non-zero status if test failed
author mru
date Wed, 04 Aug 2010 06:56:55 +0000
parents 7dd2a45249a9
children 71b2c440157d
comparison
equal deleted inserted replaced
12363:8e3a8008bb90 12364:2e96cab6ecde
174 struct timeval tv; 174 struct timeval tv;
175 gettimeofday(&tv,NULL); 175 gettimeofday(&tv,NULL);
176 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; 176 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
177 } 177 }
178 178
179 static void check_diff(float *tab1, float *tab2, int n, double scale) 179 static int check_diff(float *tab1, float *tab2, int n, double scale)
180 { 180 {
181 int i; 181 int i;
182 double max= 0; 182 double max= 0;
183 double error= 0; 183 double error= 0;
184 int err = 0;
184 185
185 for (i = 0; i < n; i++) { 186 for (i = 0; i < n; i++) {
186 double e= fabsf(tab1[i] - (tab2[i] / scale)); 187 double e= fabsf(tab1[i] - (tab2[i] / scale));
187 if (e >= 1e-3) { 188 if (e >= 1e-3) {
188 av_log(NULL, AV_LOG_ERROR, "ERROR %d: %f %f\n", 189 av_log(NULL, AV_LOG_ERROR, "ERROR %d: %f %f\n",
189 i, tab1[i], tab2[i]); 190 i, tab1[i], tab2[i]);
191 err = 1;
190 } 192 }
191 error+= e*e; 193 error+= e*e;
192 if(e>max) max= e; 194 if(e>max) max= e;
193 } 195 }
194 av_log(NULL, AV_LOG_INFO, "max:%f e:%g\n", max, sqrt(error)/n); 196 av_log(NULL, AV_LOG_INFO, "max:%f e:%g\n", max, sqrt(error)/n);
197 return err;
195 } 198 }
196 199
197 200
198 static void help(void) 201 static void help(void)
199 { 202 {
221 { 224 {
222 FFTComplex *tab, *tab1, *tab_ref; 225 FFTComplex *tab, *tab1, *tab_ref;
223 FFTSample *tab2; 226 FFTSample *tab2;
224 int it, i, c; 227 int it, i, c;
225 int do_speed = 0; 228 int do_speed = 0;
229 int err = 1;
226 enum tf_transform transform = TRANSFORM_FFT; 230 enum tf_transform transform = TRANSFORM_FFT;
227 int do_inverse = 0; 231 int do_inverse = 0;
228 FFTContext s1, *s = &s1; 232 FFTContext s1, *s = &s1;
229 FFTContext m1, *m = &m1; 233 FFTContext m1, *m = &m1;
230 RDFTContext r1, *r = &r1; 234 RDFTContext r1, *r = &r1;
322 switch (transform) { 326 switch (transform) {
323 case TRANSFORM_MDCT: 327 case TRANSFORM_MDCT:
324 if (do_inverse) { 328 if (do_inverse) {
325 imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); 329 imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits);
326 ff_imdct_calc(m, tab2, (float *)tab1); 330 ff_imdct_calc(m, tab2, (float *)tab1);
327 check_diff((float *)tab_ref, tab2, fft_size, scale); 331 err = check_diff((float *)tab_ref, tab2, fft_size, scale);
328 } else { 332 } else {
329 mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); 333 mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits);
330 334
331 ff_mdct_calc(m, tab2, (float *)tab1); 335 ff_mdct_calc(m, tab2, (float *)tab1);
332 336
333 check_diff((float *)tab_ref, tab2, fft_size / 2, scale); 337 err = check_diff((float *)tab_ref, tab2, fft_size / 2, scale);
334 } 338 }
335 break; 339 break;
336 case TRANSFORM_FFT: 340 case TRANSFORM_FFT:
337 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); 341 memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
338 ff_fft_permute(s, tab); 342 ff_fft_permute(s, tab);
339 ff_fft_calc(s, tab); 343 ff_fft_calc(s, tab);
340 344
341 fft_ref(tab_ref, tab1, fft_nbits); 345 fft_ref(tab_ref, tab1, fft_nbits);
342 check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0); 346 err = check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0);
343 break; 347 break;
344 case TRANSFORM_RDFT: 348 case TRANSFORM_RDFT:
345 if (do_inverse) { 349 if (do_inverse) {
346 tab1[ 0].im = 0; 350 tab1[ 0].im = 0;
347 tab1[fft_size_2].im = 0; 351 tab1[fft_size_2].im = 0;
357 fft_ref(tab_ref, tab1, fft_nbits); 361 fft_ref(tab_ref, tab1, fft_nbits);
358 for (i = 0; i < fft_size; i++) { 362 for (i = 0; i < fft_size; i++) {
359 tab[i].re = tab2[i]; 363 tab[i].re = tab2[i];
360 tab[i].im = 0; 364 tab[i].im = 0;
361 } 365 }
362 check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 0.5); 366 err = check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 0.5);
363 } else { 367 } else {
364 for (i = 0; i < fft_size; i++) { 368 for (i = 0; i < fft_size; i++) {
365 tab2[i] = tab1[i].re; 369 tab2[i] = tab1[i].re;
366 tab1[i].im = 0; 370 tab1[i].im = 0;
367 } 371 }
368 ff_rdft_calc(r, tab2); 372 ff_rdft_calc(r, tab2);
369 fft_ref(tab_ref, tab1, fft_nbits); 373 fft_ref(tab_ref, tab1, fft_nbits);
370 tab_ref[0].im = tab_ref[fft_size_2].re; 374 tab_ref[0].im = tab_ref[fft_size_2].re;
371 check_diff((float *)tab_ref, (float *)tab2, fft_size, 1.0); 375 err = check_diff((float *)tab_ref, (float *)tab2, fft_size, 1.0);
372 } 376 }
373 break; 377 break;
374 case TRANSFORM_DCT: 378 case TRANSFORM_DCT:
375 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); 379 memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
376 ff_dct_calc(d, tab); 380 ff_dct_calc(d, tab);
377 if (do_inverse) { 381 if (do_inverse) {
378 idct_ref(tab_ref, tab1, fft_nbits); 382 idct_ref(tab_ref, tab1, fft_nbits);
379 } else { 383 } else {
380 dct_ref(tab_ref, tab1, fft_nbits); 384 dct_ref(tab_ref, tab1, fft_nbits);
381 } 385 }
382 check_diff((float *)tab_ref, (float *)tab, fft_size, 1.0); 386 err = check_diff((float *)tab_ref, (float *)tab, fft_size, 1.0);
383 break; 387 break;
384 } 388 }
385 389
386 /* do a speed test */ 390 /* do a speed test */
387 391
440 break; 444 break;
441 case TRANSFORM_DCT: 445 case TRANSFORM_DCT:
442 ff_dct_end(d); 446 ff_dct_end(d);
443 break; 447 break;
444 } 448 }
445 return 0; 449 return err;
446 } 450 }