Mercurial > libavcodec.hg
comparison fft-test.c @ 10846:8dbceaa5fa2f libavcodec
fft-test: Replace do_mdct with a tf_transform enum and switch on it.
author | alexc |
---|---|
date | Mon, 11 Jan 2010 16:40:01 +0000 |
parents | 4578f774a775 |
children | 177ebc61c3d6 |
comparison
equal
deleted
inserted
replaced
10845:f17f2be8f61a | 10846:8dbceaa5fa2f |
---|---|
171 "-f x set scale factor for output data of (I)MDCT to x\n" | 171 "-f x set scale factor for output data of (I)MDCT to x\n" |
172 ); | 172 ); |
173 exit(1); | 173 exit(1); |
174 } | 174 } |
175 | 175 |
176 | 176 enum tf_transform { |
177 TRANSFORM_FFT, | |
178 TRANSFORM_MDCT, | |
179 }; | |
177 | 180 |
178 int main(int argc, char **argv) | 181 int main(int argc, char **argv) |
179 { | 182 { |
180 FFTComplex *tab, *tab1, *tab_ref; | 183 FFTComplex *tab, *tab1, *tab_ref; |
181 FFTSample *tab2; | 184 FFTSample *tab2; |
182 int it, i, c; | 185 int it, i, c; |
183 int do_speed = 0; | 186 int do_speed = 0; |
184 int do_mdct = 0; | 187 enum tf_transform transform = TRANSFORM_FFT; |
185 int do_inverse = 0; | 188 int do_inverse = 0; |
186 FFTContext s1, *s = &s1; | 189 FFTContext s1, *s = &s1; |
187 FFTContext m1, *m = &m1; | 190 FFTContext m1, *m = &m1; |
188 int fft_nbits, fft_size; | 191 int fft_nbits, fft_size; |
189 double scale = 1.0; | 192 double scale = 1.0; |
204 break; | 207 break; |
205 case 'i': | 208 case 'i': |
206 do_inverse = 1; | 209 do_inverse = 1; |
207 break; | 210 break; |
208 case 'm': | 211 case 'm': |
209 do_mdct = 1; | 212 transform = TRANSFORM_MDCT; |
210 break; | 213 break; |
211 case 'n': | 214 case 'n': |
212 fft_nbits = atoi(optarg); | 215 fft_nbits = atoi(optarg); |
213 break; | 216 break; |
214 case 'f': | 217 case 'f': |
221 tab = av_malloc(fft_size * sizeof(FFTComplex)); | 224 tab = av_malloc(fft_size * sizeof(FFTComplex)); |
222 tab1 = av_malloc(fft_size * sizeof(FFTComplex)); | 225 tab1 = av_malloc(fft_size * sizeof(FFTComplex)); |
223 tab_ref = av_malloc(fft_size * sizeof(FFTComplex)); | 226 tab_ref = av_malloc(fft_size * sizeof(FFTComplex)); |
224 tab2 = av_malloc(fft_size * sizeof(FFTSample)); | 227 tab2 = av_malloc(fft_size * sizeof(FFTSample)); |
225 | 228 |
226 if (do_mdct) { | 229 switch (transform) { |
230 case TRANSFORM_MDCT: | |
227 av_log(NULL, AV_LOG_INFO,"Scale factor is set to %f\n", scale); | 231 av_log(NULL, AV_LOG_INFO,"Scale factor is set to %f\n", scale); |
228 if (do_inverse) | 232 if (do_inverse) |
229 av_log(NULL, AV_LOG_INFO,"IMDCT"); | 233 av_log(NULL, AV_LOG_INFO,"IMDCT"); |
230 else | 234 else |
231 av_log(NULL, AV_LOG_INFO,"MDCT"); | 235 av_log(NULL, AV_LOG_INFO,"MDCT"); |
232 ff_mdct_init(m, fft_nbits, do_inverse, scale); | 236 ff_mdct_init(m, fft_nbits, do_inverse, scale); |
233 } else { | 237 break; |
238 case TRANSFORM_FFT: | |
234 if (do_inverse) | 239 if (do_inverse) |
235 av_log(NULL, AV_LOG_INFO,"IFFT"); | 240 av_log(NULL, AV_LOG_INFO,"IFFT"); |
236 else | 241 else |
237 av_log(NULL, AV_LOG_INFO,"FFT"); | 242 av_log(NULL, AV_LOG_INFO,"FFT"); |
238 ff_fft_init(s, fft_nbits, do_inverse); | 243 ff_fft_init(s, fft_nbits, do_inverse); |
239 fft_ref_init(fft_nbits, do_inverse); | 244 fft_ref_init(fft_nbits, do_inverse); |
245 break; | |
240 } | 246 } |
241 av_log(NULL, AV_LOG_INFO," %d test\n", fft_size); | 247 av_log(NULL, AV_LOG_INFO," %d test\n", fft_size); |
242 | 248 |
243 /* generate random data */ | 249 /* generate random data */ |
244 | 250 |
248 } | 254 } |
249 | 255 |
250 /* checking result */ | 256 /* checking result */ |
251 av_log(NULL, AV_LOG_INFO,"Checking...\n"); | 257 av_log(NULL, AV_LOG_INFO,"Checking...\n"); |
252 | 258 |
253 if (do_mdct) { | 259 switch (transform) { |
260 case TRANSFORM_MDCT: | |
254 if (do_inverse) { | 261 if (do_inverse) { |
255 imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); | 262 imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); |
256 ff_imdct_calc(m, tab2, (float *)tab1); | 263 ff_imdct_calc(m, tab2, (float *)tab1); |
257 check_diff((float *)tab_ref, tab2, fft_size, scale); | 264 check_diff((float *)tab_ref, tab2, fft_size, scale); |
258 } else { | 265 } else { |
260 | 267 |
261 ff_mdct_calc(m, tab2, (float *)tab1); | 268 ff_mdct_calc(m, tab2, (float *)tab1); |
262 | 269 |
263 check_diff((float *)tab_ref, tab2, fft_size / 2, scale); | 270 check_diff((float *)tab_ref, tab2, fft_size / 2, scale); |
264 } | 271 } |
265 } else { | 272 break; |
273 case TRANSFORM_FFT: | |
266 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); | 274 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); |
267 ff_fft_permute(s, tab); | 275 ff_fft_permute(s, tab); |
268 ff_fft_calc(s, tab); | 276 ff_fft_calc(s, tab); |
269 | 277 |
270 fft_ref(tab_ref, tab1, fft_nbits); | 278 fft_ref(tab_ref, tab1, fft_nbits); |
271 check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0); | 279 check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0); |
280 break; | |
272 } | 281 } |
273 | 282 |
274 /* do a speed test */ | 283 /* do a speed test */ |
275 | 284 |
276 if (do_speed) { | 285 if (do_speed) { |
281 /* we measure during about 1 seconds */ | 290 /* we measure during about 1 seconds */ |
282 nb_its = 1; | 291 nb_its = 1; |
283 for(;;) { | 292 for(;;) { |
284 time_start = gettime(); | 293 time_start = gettime(); |
285 for (it = 0; it < nb_its; it++) { | 294 for (it = 0; it < nb_its; it++) { |
286 if (do_mdct) { | 295 switch (transform) { |
296 case TRANSFORM_MDCT: | |
287 if (do_inverse) { | 297 if (do_inverse) { |
288 ff_imdct_calc(m, (float *)tab, (float *)tab1); | 298 ff_imdct_calc(m, (float *)tab, (float *)tab1); |
289 } else { | 299 } else { |
290 ff_mdct_calc(m, (float *)tab, (float *)tab1); | 300 ff_mdct_calc(m, (float *)tab, (float *)tab1); |
291 } | 301 } |
292 } else { | 302 break; |
303 case TRANSFORM_FFT: | |
293 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); | 304 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); |
294 ff_fft_calc(s, tab); | 305 ff_fft_calc(s, tab); |
306 break; | |
295 } | 307 } |
296 } | 308 } |
297 duration = gettime() - time_start; | 309 duration = gettime() - time_start; |
298 if (duration >= 1000000) | 310 if (duration >= 1000000) |
299 break; | 311 break; |
303 (double)duration / nb_its, | 315 (double)duration / nb_its, |
304 (double)duration / 1000000.0, | 316 (double)duration / 1000000.0, |
305 nb_its); | 317 nb_its); |
306 } | 318 } |
307 | 319 |
308 if (do_mdct) { | 320 switch (transform) { |
321 case TRANSFORM_MDCT: | |
309 ff_mdct_end(m); | 322 ff_mdct_end(m); |
310 } else { | 323 break; |
324 case TRANSFORM_FFT: | |
311 ff_fft_end(s); | 325 ff_fft_end(s); |
326 break; | |
312 } | 327 } |
313 return 0; | 328 return 0; |
314 } | 329 } |