diff options
Diffstat (limited to 'contrib/ffmpeg/libavcodec/fft-test.c')
-rw-r--r-- | contrib/ffmpeg/libavcodec/fft-test.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/contrib/ffmpeg/libavcodec/fft-test.c b/contrib/ffmpeg/libavcodec/fft-test.c index d2497383d..8ac04611a 100644 --- a/contrib/ffmpeg/libavcodec/fft-test.c +++ b/contrib/ffmpeg/libavcodec/fft-test.c @@ -27,8 +27,11 @@ #include <math.h> #include <unistd.h> #include <sys/time.h> +#include <stdlib.h> +#include <string.h> #undef exit +#undef random int mm_flags; @@ -47,7 +50,7 @@ FFTComplex *exptab; void fft_ref_init(int nbits, int inverse) { int n, i; - float c1, s1, alpha; + double c1, s1, alpha; n = 1 << nbits; exptab = av_malloc((n / 2) * sizeof(FFTComplex)); @@ -66,7 +69,7 @@ void fft_ref_init(int nbits, int inverse) void fft_ref(FFTComplex *tabr, FFTComplex *tab, int nbits) { int n, i, j, k, n2; - float tmp_re, tmp_im, s, c; + double tmp_re, tmp_im, s, c; FFTComplex *q; n = 1 << nbits; @@ -92,10 +95,11 @@ void fft_ref(FFTComplex *tabr, FFTComplex *tab, int nbits) } } -void imdct_ref(float *out, float *in, int n) +void imdct_ref(float *out, float *in, int nbits) { + int n = 1<<nbits; int k, i, a; - float sum, f; + double sum, f; for(i=0;i<n;i++) { sum = 0; @@ -109,10 +113,11 @@ void imdct_ref(float *out, float *in, int n) } /* NOTE: no normalisation by 1 / N is done */ -void mdct_ref(float *output, float *input, int n) +void mdct_ref(float *output, float *input, int nbits) { + int n = 1<<nbits; int k, i; - float a, s; + double a, s; /* do it by hand */ for(k=0;k<n/2;k++) { @@ -141,13 +146,19 @@ int64_t gettime(void) void check_diff(float *tab1, float *tab2, int n) { int i; + double max= 0; + double error= 0; for(i=0;i<n;i++) { - if (fabsf(tab1[i] - tab2[i]) >= 1e-3) { + double e= fabsf(tab1[i] - tab2[i]); + if (e >= 1e-3) { av_log(NULL, AV_LOG_ERROR, "ERROR %d: %f %f\n", i, tab1[i], tab2[i]); } + error+= e*e; + if(e>max) max= e; } + av_log(NULL, AV_LOG_INFO, "max:%f e:%g\n", max, sqrt(error)/n); } @@ -237,11 +248,11 @@ int main(int argc, char **argv) if (do_mdct) { if (do_inverse) { - imdct_ref((float *)tab_ref, (float *)tab1, fft_size); + imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); ff_imdct_calc(m, tab2, (float *)tab1, tabtmp); check_diff((float *)tab_ref, tab2, fft_size); } else { - mdct_ref((float *)tab_ref, (float *)tab1, fft_size); + mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); ff_mdct_calc(m, tab2, (float *)tab1, tabtmp); |