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 } |
