Mercurial > libavcodec.hg
annotate fft-test.c @ 11032:01bd040f8607 libavcodec
Unroll main loop so the edge==0 case is seperate.
This allows many things to be simplified away.
h264 decoder is overall 1% faster with a mbaff sample and
0.1% slower with the cathedral sample, probably because the slow loop
filter code must be loaded into the code cache for each first MB of each
row but isnt used for the following MBs.
| author | michael |
|---|---|
| date | Thu, 28 Jan 2010 01:24:25 +0000 |
| parents | 0985f1f7ab72 |
| children | 4a8900c06c67 |
| rev | line source |
|---|---|
|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
1 /* |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
2 * (c) 2002 Fabrice Bellard |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
3 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
4 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
5 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
7 * modify it under the terms of the GNU Lesser General Public |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
8 * License as published by the Free Software Foundation; either |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
10 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
14 * Lesser General Public License for more details. |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
15 * |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
16 * You should have received a copy of the GNU Lesser General Public |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
19 */ |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
2967
diff
changeset
|
20 |
| 1106 | 21 /** |
|
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
7546
diff
changeset
|
22 * @file libavcodec/fft-test.c |
| 1106 | 23 * FFT and MDCT tests. |
| 24 */ | |
| 25 | |
|
9199
ea0e5e9a520f
Replace random() usage in test programs by av_lfg_*().
diego
parents:
8718
diff
changeset
|
26 #include "libavutil/lfg.h" |
| 781 | 27 #include "dsputil.h" |
| 28 #include <math.h> | |
| 980 | 29 #include <unistd.h> |
| 781 | 30 #include <sys/time.h> |
|
5118
3b190bc34546
Add some #includes to allow compilation without HAVE_AV_CONFIG_H.
diego
parents:
4760
diff
changeset
|
31 #include <stdlib.h> |
|
3b190bc34546
Add some #includes to allow compilation without HAVE_AV_CONFIG_H.
diego
parents:
4760
diff
changeset
|
32 #include <string.h> |
| 781 | 33 |
| 4760 | 34 #undef exit |
| 35 | |
| 781 | 36 /* reference fft */ |
| 37 | |
| 38 #define MUL16(a,b) ((a) * (b)) | |
| 39 | |
| 40 #define CMAC(pre, pim, are, aim, bre, bim) \ | |
| 41 {\ | |
| 42 pre += (MUL16(are, bre) - MUL16(aim, bim));\ | |
| 43 pim += (MUL16(are, bim) + MUL16(bre, aim));\ | |
| 44 } | |
| 45 | |
| 46 FFTComplex *exptab; | |
| 47 | |
|
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
48 static void fft_ref_init(int nbits, int inverse) |
| 781 | 49 { |
| 50 int n, i; | |
|
5418
95234f2e0bdd
make the reference code use double instead of float where it is easy
michael
parents:
5417
diff
changeset
|
51 double c1, s1, alpha; |
| 781 | 52 |
| 53 n = 1 << nbits; | |
| 54 exptab = av_malloc((n / 2) * sizeof(FFTComplex)); | |
| 55 | |
| 10807 | 56 for (i = 0; i < (n/2); i++) { |
| 781 | 57 alpha = 2 * M_PI * (float)i / (float)n; |
| 58 c1 = cos(alpha); | |
| 59 s1 = sin(alpha); | |
| 60 if (!inverse) | |
| 61 s1 = -s1; | |
| 62 exptab[i].re = c1; | |
| 63 exptab[i].im = s1; | |
| 64 } | |
| 65 } | |
| 66 | |
|
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
67 static void fft_ref(FFTComplex *tabr, FFTComplex *tab, int nbits) |
| 781 | 68 { |
| 69 int n, i, j, k, n2; | |
|
5418
95234f2e0bdd
make the reference code use double instead of float where it is easy
michael
parents:
5417
diff
changeset
|
70 double tmp_re, tmp_im, s, c; |
| 781 | 71 FFTComplex *q; |
| 72 | |
| 73 n = 1 << nbits; | |
| 74 n2 = n >> 1; | |
| 10807 | 75 for (i = 0; i < n; i++) { |
| 781 | 76 tmp_re = 0; |
| 77 tmp_im = 0; | |
| 78 q = tab; | |
| 10807 | 79 for (j = 0; j < n; j++) { |
| 781 | 80 k = (i * j) & (n - 1); |
| 81 if (k >= n2) { | |
| 82 c = -exptab[k - n2].re; | |
| 83 s = -exptab[k - n2].im; | |
| 84 } else { | |
| 85 c = exptab[k].re; | |
| 86 s = exptab[k].im; | |
| 87 } | |
| 88 CMAC(tmp_re, tmp_im, c, s, q->re, q->im); | |
| 89 q++; | |
| 90 } | |
| 91 tabr[i].re = tmp_re; | |
| 92 tabr[i].im = tmp_im; | |
| 93 } | |
| 94 } | |
| 95 | |
|
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
96 static void imdct_ref(float *out, float *in, int nbits) |
| 781 | 97 { |
| 5442 | 98 int n = 1<<nbits; |
| 781 | 99 int k, i, a; |
|
5418
95234f2e0bdd
make the reference code use double instead of float where it is easy
michael
parents:
5417
diff
changeset
|
100 double sum, f; |
| 781 | 101 |
| 10807 | 102 for (i = 0; i < n; i++) { |
| 781 | 103 sum = 0; |
| 10807 | 104 for (k = 0; k < n/2; k++) { |
| 781 | 105 a = (2 * i + 1 + (n / 2)) * (2 * k + 1); |
| 106 f = cos(M_PI * a / (double)(2 * n)); | |
| 107 sum += f * in[k]; | |
| 108 } | |
| 109 out[i] = -sum; | |
| 110 } | |
| 111 } | |
| 112 | |
| 113 /* NOTE: no normalisation by 1 / N is done */ | |
|
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
114 static void mdct_ref(float *output, float *input, int nbits) |
| 781 | 115 { |
| 5442 | 116 int n = 1<<nbits; |
| 781 | 117 int k, i; |
|
5418
95234f2e0bdd
make the reference code use double instead of float where it is easy
michael
parents:
5417
diff
changeset
|
118 double a, s; |
| 781 | 119 |
| 120 /* do it by hand */ | |
| 10807 | 121 for (k = 0; k < n/2; k++) { |
| 781 | 122 s = 0; |
| 10807 | 123 for (i = 0; i < n; i++) { |
| 781 | 124 a = (2*M_PI*(2*i+1+n/2)*(2*k+1) / (4 * n)); |
| 125 s += input[i] * cos(a); | |
| 126 } | |
| 127 output[k] = s; | |
| 128 } | |
| 129 } | |
| 130 | |
| 10944 | 131 static void idct_ref(float *output, float *input, int nbits) |
| 132 { | |
| 133 int n = 1<<nbits; | |
| 134 int k, i; | |
| 135 double a, s; | |
| 136 | |
| 137 /* do it by hand */ | |
| 138 for (i = 0; i < n; i++) { | |
| 139 s = 0.5 * input[0]; | |
| 140 for (k = 1; k < n; k++) { | |
| 141 a = M_PI*k*(i+0.5) / n; | |
| 142 s += input[k] * cos(a); | |
| 143 } | |
| 144 output[i] = 2 * s / n; | |
| 145 } | |
| 146 } | |
| 147 static void dct_ref(float *output, float *input, int nbits) | |
| 148 { | |
| 149 int n = 1<<nbits; | |
| 150 int k, i; | |
| 151 double a, s; | |
| 152 | |
| 153 /* do it by hand */ | |
| 154 for (k = 0; k < n; k++) { | |
| 155 s = 0; | |
| 156 for (i = 0; i < n; i++) { | |
| 157 a = M_PI*k*(i+0.5) / n; | |
| 158 s += input[i] * cos(a); | |
| 159 } | |
| 160 output[k] = s; | |
| 161 } | |
| 162 } | |
| 163 | |
| 781 | 164 |
|
10074
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
165 static float frandom(AVLFG *prng) |
| 781 | 166 { |
|
10074
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
167 return (int16_t)av_lfg_get(prng) / 32768.0; |
| 781 | 168 } |
| 169 | |
|
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
170 static int64_t gettime(void) |
| 781 | 171 { |
| 172 struct timeval tv; | |
| 173 gettimeofday(&tv,NULL); | |
| 1064 | 174 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; |
| 781 | 175 } |
| 176 | |
|
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
177 static void check_diff(float *tab1, float *tab2, int n, double scale) |
| 781 | 178 { |
| 179 int i; | |
| 5417 | 180 double max= 0; |
| 181 double error= 0; | |
| 781 | 182 |
| 10807 | 183 for (i = 0; i < n; i++) { |
|
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
184 double e= fabsf(tab1[i] - (tab2[i] / scale)); |
| 5417 | 185 if (e >= 1e-3) { |
| 2967 | 186 av_log(NULL, AV_LOG_ERROR, "ERROR %d: %f %f\n", |
| 781 | 187 i, tab1[i], tab2[i]); |
| 188 } | |
| 5417 | 189 error+= e*e; |
| 190 if(e>max) max= e; | |
| 781 | 191 } |
| 5417 | 192 av_log(NULL, AV_LOG_INFO, "max:%f e:%g\n", max, sqrt(error)/n); |
| 781 | 193 } |
| 194 | |
| 195 | |
|
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9199
diff
changeset
|
196 static void help(void) |
| 781 | 197 { |
|
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
198 av_log(NULL, AV_LOG_INFO,"usage: fft-test [-h] [-s] [-i] [-n b]\n" |
| 781 | 199 "-h print this help\n" |
| 200 "-s speed test\n" | |
| 201 "-m (I)MDCT test\n" | |
| 10944 | 202 "-d (I)DCT test\n" |
| 781 | 203 "-i inverse transform test\n" |
| 204 "-n b set the transform size to 2^b\n" | |
|
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
205 "-f x set scale factor for output data of (I)MDCT to x\n" |
| 781 | 206 ); |
| 207 exit(1); | |
| 208 } | |
| 209 | |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
210 enum tf_transform { |
|
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
211 TRANSFORM_FFT, |
|
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
212 TRANSFORM_MDCT, |
| 10847 | 213 TRANSFORM_RDFT, |
| 10944 | 214 TRANSFORM_DCT, |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
215 }; |
| 781 | 216 |
| 217 int main(int argc, char **argv) | |
| 218 { | |
| 219 FFTComplex *tab, *tab1, *tab_ref; | |
| 7546 | 220 FFTSample *tab2; |
| 781 | 221 int it, i, c; |
| 222 int do_speed = 0; | |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
223 enum tf_transform transform = TRANSFORM_FFT; |
| 781 | 224 int do_inverse = 0; |
| 225 FFTContext s1, *s = &s1; | |
| 10199 | 226 FFTContext m1, *m = &m1; |
| 10847 | 227 RDFTContext r1, *r = &r1; |
| 10944 | 228 DCTContext d1, *d = &d1; |
| 10847 | 229 int fft_nbits, fft_size, fft_size_2; |
|
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
230 double scale = 1.0; |
|
10074
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
231 AVLFG prng; |
|
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
232 av_lfg_init(&prng, 1); |
| 781 | 233 |
| 234 fft_nbits = 9; | |
| 235 for(;;) { | |
| 10944 | 236 c = getopt(argc, argv, "hsimrdn:f:"); |
| 781 | 237 if (c == -1) |
| 238 break; | |
| 239 switch(c) { | |
| 240 case 'h': | |
| 241 help(); | |
| 242 break; | |
| 243 case 's': | |
| 244 do_speed = 1; | |
| 245 break; | |
| 246 case 'i': | |
| 247 do_inverse = 1; | |
| 248 break; | |
| 249 case 'm': | |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
250 transform = TRANSFORM_MDCT; |
| 781 | 251 break; |
| 10847 | 252 case 'r': |
| 253 transform = TRANSFORM_RDFT; | |
| 254 break; | |
| 10944 | 255 case 'd': |
| 256 transform = TRANSFORM_DCT; | |
| 257 break; | |
| 781 | 258 case 'n': |
| 259 fft_nbits = atoi(optarg); | |
| 260 break; | |
|
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
261 case 'f': |
|
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
262 scale = atof(optarg); |
|
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
263 break; |
| 781 | 264 } |
| 265 } | |
| 266 | |
| 267 fft_size = 1 << fft_nbits; | |
| 10847 | 268 fft_size_2 = fft_size >> 1; |
| 781 | 269 tab = av_malloc(fft_size * sizeof(FFTComplex)); |
| 270 tab1 = av_malloc(fft_size * sizeof(FFTComplex)); | |
| 271 tab_ref = av_malloc(fft_size * sizeof(FFTComplex)); | |
| 272 tab2 = av_malloc(fft_size * sizeof(FFTSample)); | |
| 273 | |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
274 switch (transform) { |
|
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
275 case TRANSFORM_MDCT: |
|
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
276 av_log(NULL, AV_LOG_INFO,"Scale factor is set to %f\n", scale); |
| 781 | 277 if (do_inverse) |
|
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
278 av_log(NULL, AV_LOG_INFO,"IMDCT"); |
| 781 | 279 else |
|
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
280 av_log(NULL, AV_LOG_INFO,"MDCT"); |
|
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
281 ff_mdct_init(m, fft_nbits, do_inverse, scale); |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
282 break; |
|
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
283 case TRANSFORM_FFT: |
| 781 | 284 if (do_inverse) |
|
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
285 av_log(NULL, AV_LOG_INFO,"IFFT"); |
| 781 | 286 else |
|
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
287 av_log(NULL, AV_LOG_INFO,"FFT"); |
|
1879
dd63cb7e5080
fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
1106
diff
changeset
|
288 ff_fft_init(s, fft_nbits, do_inverse); |
| 781 | 289 fft_ref_init(fft_nbits, do_inverse); |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
290 break; |
| 10847 | 291 case TRANSFORM_RDFT: |
| 292 if (do_inverse) | |
| 293 av_log(NULL, AV_LOG_INFO,"IRDFT"); | |
| 294 else | |
| 295 av_log(NULL, AV_LOG_INFO,"RDFT"); | |
| 296 ff_rdft_init(r, fft_nbits, do_inverse ? IRDFT : RDFT); | |
| 297 fft_ref_init(fft_nbits, do_inverse); | |
| 298 break; | |
| 10944 | 299 case TRANSFORM_DCT: |
| 300 if (do_inverse) | |
| 301 av_log(NULL, AV_LOG_INFO,"IDCT"); | |
| 302 else | |
| 303 av_log(NULL, AV_LOG_INFO,"DCT"); | |
| 304 ff_dct_init(d, fft_nbits, do_inverse); | |
| 305 break; | |
| 781 | 306 } |
|
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
307 av_log(NULL, AV_LOG_INFO," %d test\n", fft_size); |
| 781 | 308 |
| 309 /* generate random data */ | |
| 310 | |
| 10807 | 311 for (i = 0; i < fft_size; i++) { |
|
10074
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
312 tab1[i].re = frandom(&prng); |
|
c4a83f3a5c9f
bring back some randomness in fft-test. (regression in r18070)
lorenm
parents:
9674
diff
changeset
|
313 tab1[i].im = frandom(&prng); |
| 781 | 314 } |
| 315 | |
| 316 /* checking result */ | |
|
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
317 av_log(NULL, AV_LOG_INFO,"Checking...\n"); |
| 781 | 318 |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
319 switch (transform) { |
|
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
320 case TRANSFORM_MDCT: |
| 781 | 321 if (do_inverse) { |
| 5442 | 322 imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); |
| 7546 | 323 ff_imdct_calc(m, tab2, (float *)tab1); |
|
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
324 check_diff((float *)tab_ref, tab2, fft_size, scale); |
| 781 | 325 } else { |
| 5442 | 326 mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); |
| 2967 | 327 |
| 7546 | 328 ff_mdct_calc(m, tab2, (float *)tab1); |
| 781 | 329 |
|
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
330 check_diff((float *)tab_ref, tab2, fft_size / 2, scale); |
| 781 | 331 } |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
332 break; |
|
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
333 case TRANSFORM_FFT: |
| 781 | 334 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); |
|
1879
dd63cb7e5080
fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
1106
diff
changeset
|
335 ff_fft_permute(s, tab); |
|
dd63cb7e5080
fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
1106
diff
changeset
|
336 ff_fft_calc(s, tab); |
| 2967 | 337 |
| 781 | 338 fft_ref(tab_ref, tab1, fft_nbits); |
|
9674
dac20d8df581
Support for testing (i)MDCT output scale factor in fft-test tool.
serge
parents:
9658
diff
changeset
|
339 check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0); |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
340 break; |
| 10847 | 341 case TRANSFORM_RDFT: |
| 342 if (do_inverse) { | |
| 343 tab1[ 0].im = 0; | |
| 344 tab1[fft_size_2].im = 0; | |
| 345 for (i = 1; i < fft_size_2; i++) { | |
| 346 tab1[fft_size_2+i].re = tab1[fft_size_2-i].re; | |
| 347 tab1[fft_size_2+i].im = -tab1[fft_size_2-i].im; | |
| 348 } | |
| 349 | |
| 350 memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); | |
| 351 tab2[1] = tab1[fft_size_2].re; | |
| 352 | |
| 353 ff_rdft_calc(r, tab2); | |
| 354 fft_ref(tab_ref, tab1, fft_nbits); | |
| 355 for (i = 0; i < fft_size; i++) { | |
| 356 tab[i].re = tab2[i]; | |
| 357 tab[i].im = 0; | |
| 358 } | |
| 359 check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 0.5); | |
| 360 } else { | |
| 361 for (i = 0; i < fft_size; i++) { | |
| 362 tab2[i] = tab1[i].re; | |
| 363 tab1[i].im = 0; | |
| 364 } | |
| 365 ff_rdft_calc(r, tab2); | |
| 366 fft_ref(tab_ref, tab1, fft_nbits); | |
| 367 tab_ref[0].im = tab_ref[fft_size_2].re; | |
| 368 check_diff((float *)tab_ref, (float *)tab2, fft_size, 1.0); | |
| 369 } | |
| 10944 | 370 break; |
| 371 case TRANSFORM_DCT: | |
| 372 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); | |
| 373 ff_dct_calc(d, tab); | |
| 374 if (do_inverse) { | |
| 375 idct_ref(tab_ref, tab1, fft_nbits); | |
| 376 } else { | |
| 377 dct_ref(tab_ref, tab1, fft_nbits); | |
| 378 } | |
| 379 check_diff((float *)tab_ref, (float *)tab, fft_size, 1.0); | |
| 380 break; | |
| 781 | 381 } |
| 382 | |
| 383 /* do a speed test */ | |
| 384 | |
| 385 if (do_speed) { | |
| 1064 | 386 int64_t time_start, duration; |
| 781 | 387 int nb_its; |
| 388 | |
|
2593
786ccf72ccd5
printf -> av_log patch by (Benjamin Larsson <>banan student.ltu se)
michael
parents:
1879
diff
changeset
|
389 av_log(NULL, AV_LOG_INFO,"Speed test...\n"); |
| 781 | 390 /* we measure during about 1 seconds */ |
| 391 nb_its = 1; | |
| 392 for(;;) { | |
| 393 time_start = gettime(); | |
| 10807 | 394 for (it = 0; it < nb_its; it++) { |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
395 switch (transform) { |
|
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
396 case TRANSFORM_MDCT: |
| 781 | 397 if (do_inverse) { |
| 7546 | 398 ff_imdct_calc(m, (float *)tab, (float *)tab1); |
| 781 | 399 } else { |
| 7546 | 400 ff_mdct_calc(m, (float *)tab, (float *)tab1); |
| 781 | 401 } |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
402 break; |
|
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
403 case TRANSFORM_FFT: |
| 781 | 404 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); |
|
1879
dd63cb7e5080
fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
1106
diff
changeset
|
405 ff_fft_calc(s, tab); |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
406 break; |
| 10847 | 407 case TRANSFORM_RDFT: |
| 408 memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); | |
| 409 ff_rdft_calc(r, tab2); | |
| 410 break; | |
| 10944 | 411 case TRANSFORM_DCT: |
| 412 memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); | |
| 413 ff_dct_calc(d, tab2); | |
| 414 break; | |
| 781 | 415 } |
| 416 } | |
| 417 duration = gettime() - time_start; | |
| 418 if (duration >= 1000000) | |
| 419 break; | |
| 420 nb_its *= 2; | |
| 421 } | |
| 2967 | 422 av_log(NULL, AV_LOG_INFO,"time: %0.1f us/transform [total time=%0.2f s its=%d]\n", |
| 423 (double)duration / nb_its, | |
| 781 | 424 (double)duration / 1000000.0, |
| 425 nb_its); | |
| 426 } | |
| 2967 | 427 |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
428 switch (transform) { |
|
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
429 case TRANSFORM_MDCT: |
| 969 | 430 ff_mdct_end(m); |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
431 break; |
|
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
432 case TRANSFORM_FFT: |
|
1879
dd63cb7e5080
fft_*() renamed into ff_fft_*() patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
1106
diff
changeset
|
433 ff_fft_end(s); |
|
10846
8dbceaa5fa2f
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
alexc
parents:
10807
diff
changeset
|
434 break; |
| 10847 | 435 case TRANSFORM_RDFT: |
| 436 ff_rdft_end(r); | |
| 437 break; | |
| 10944 | 438 case TRANSFORM_DCT: |
| 439 ff_dct_end(d); | |
| 440 break; | |
| 781 | 441 } |
| 442 return 0; | |
| 443 } |
