Mercurial > libavcodec.hg
comparison fft-test.c @ 9674:dac20d8df581 libavcodec
Support for testing (i)MDCT output scale factor in fft-test tool.
author | serge |
---|---|
date | Wed, 20 May 2009 07:23:09 +0000 |
parents | 67a20f0eb42c |
children | c4a83f3a5c9f |
comparison
equal
deleted
inserted
replaced
9673:3e1a08ba8481 | 9674:dac20d8df581 |
---|---|
141 struct timeval tv; | 141 struct timeval tv; |
142 gettimeofday(&tv,NULL); | 142 gettimeofday(&tv,NULL); |
143 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; | 143 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; |
144 } | 144 } |
145 | 145 |
146 static void check_diff(float *tab1, float *tab2, int n) | 146 static void check_diff(float *tab1, float *tab2, int n, double scale) |
147 { | 147 { |
148 int i; | 148 int i; |
149 double max= 0; | 149 double max= 0; |
150 double error= 0; | 150 double error= 0; |
151 | 151 |
152 for(i=0;i<n;i++) { | 152 for(i=0;i<n;i++) { |
153 double e= fabsf(tab1[i] - tab2[i]); | 153 double e= fabsf(tab1[i] - (tab2[i] / scale)); |
154 if (e >= 1e-3) { | 154 if (e >= 1e-3) { |
155 av_log(NULL, AV_LOG_ERROR, "ERROR %d: %f %f\n", | 155 av_log(NULL, AV_LOG_ERROR, "ERROR %d: %f %f\n", |
156 i, tab1[i], tab2[i]); | 156 i, tab1[i], tab2[i]); |
157 } | 157 } |
158 error+= e*e; | 158 error+= e*e; |
168 "-h print this help\n" | 168 "-h print this help\n" |
169 "-s speed test\n" | 169 "-s speed test\n" |
170 "-m (I)MDCT test\n" | 170 "-m (I)MDCT test\n" |
171 "-i inverse transform test\n" | 171 "-i inverse transform test\n" |
172 "-n b set the transform size to 2^b\n" | 172 "-n b set the transform size to 2^b\n" |
173 "-f x set scale factor for output data of (I)MDCT to x\n" | |
173 ); | 174 ); |
174 exit(1); | 175 exit(1); |
175 } | 176 } |
176 | 177 |
177 | 178 |
185 int do_mdct = 0; | 186 int do_mdct = 0; |
186 int do_inverse = 0; | 187 int do_inverse = 0; |
187 FFTContext s1, *s = &s1; | 188 FFTContext s1, *s = &s1; |
188 MDCTContext m1, *m = &m1; | 189 MDCTContext m1, *m = &m1; |
189 int fft_nbits, fft_size; | 190 int fft_nbits, fft_size; |
191 double scale = 1.0; | |
190 | 192 |
191 fft_nbits = 9; | 193 fft_nbits = 9; |
192 for(;;) { | 194 for(;;) { |
193 c = getopt(argc, argv, "hsimn:"); | 195 c = getopt(argc, argv, "hsimn:f:"); |
194 if (c == -1) | 196 if (c == -1) |
195 break; | 197 break; |
196 switch(c) { | 198 switch(c) { |
197 case 'h': | 199 case 'h': |
198 help(); | 200 help(); |
206 case 'm': | 208 case 'm': |
207 do_mdct = 1; | 209 do_mdct = 1; |
208 break; | 210 break; |
209 case 'n': | 211 case 'n': |
210 fft_nbits = atoi(optarg); | 212 fft_nbits = atoi(optarg); |
213 break; | |
214 case 'f': | |
215 scale = atof(optarg); | |
211 break; | 216 break; |
212 } | 217 } |
213 } | 218 } |
214 | 219 |
215 fft_size = 1 << fft_nbits; | 220 fft_size = 1 << fft_nbits; |
217 tab1 = av_malloc(fft_size * sizeof(FFTComplex)); | 222 tab1 = av_malloc(fft_size * sizeof(FFTComplex)); |
218 tab_ref = av_malloc(fft_size * sizeof(FFTComplex)); | 223 tab_ref = av_malloc(fft_size * sizeof(FFTComplex)); |
219 tab2 = av_malloc(fft_size * sizeof(FFTSample)); | 224 tab2 = av_malloc(fft_size * sizeof(FFTSample)); |
220 | 225 |
221 if (do_mdct) { | 226 if (do_mdct) { |
227 av_log(NULL, AV_LOG_INFO,"Scale factor is set to %f\n", scale); | |
222 if (do_inverse) | 228 if (do_inverse) |
223 av_log(NULL, AV_LOG_INFO,"IMDCT"); | 229 av_log(NULL, AV_LOG_INFO,"IMDCT"); |
224 else | 230 else |
225 av_log(NULL, AV_LOG_INFO,"MDCT"); | 231 av_log(NULL, AV_LOG_INFO,"MDCT"); |
226 ff_mdct_init(m, fft_nbits, do_inverse, 1.0); | 232 ff_mdct_init(m, fft_nbits, do_inverse, scale); |
227 } else { | 233 } else { |
228 if (do_inverse) | 234 if (do_inverse) |
229 av_log(NULL, AV_LOG_INFO,"IFFT"); | 235 av_log(NULL, AV_LOG_INFO,"IFFT"); |
230 else | 236 else |
231 av_log(NULL, AV_LOG_INFO,"FFT"); | 237 av_log(NULL, AV_LOG_INFO,"FFT"); |
246 | 252 |
247 if (do_mdct) { | 253 if (do_mdct) { |
248 if (do_inverse) { | 254 if (do_inverse) { |
249 imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); | 255 imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); |
250 ff_imdct_calc(m, tab2, (float *)tab1); | 256 ff_imdct_calc(m, tab2, (float *)tab1); |
251 check_diff((float *)tab_ref, tab2, fft_size); | 257 check_diff((float *)tab_ref, tab2, fft_size, scale); |
252 } else { | 258 } else { |
253 mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); | 259 mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); |
254 | 260 |
255 ff_mdct_calc(m, tab2, (float *)tab1); | 261 ff_mdct_calc(m, tab2, (float *)tab1); |
256 | 262 |
257 check_diff((float *)tab_ref, tab2, fft_size / 2); | 263 check_diff((float *)tab_ref, tab2, fft_size / 2, scale); |
258 } | 264 } |
259 } else { | 265 } else { |
260 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); | 266 memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); |
261 ff_fft_permute(s, tab); | 267 ff_fft_permute(s, tab); |
262 ff_fft_calc(s, tab); | 268 ff_fft_calc(s, tab); |
263 | 269 |
264 fft_ref(tab_ref, tab1, fft_nbits); | 270 fft_ref(tab_ref, tab1, fft_nbits); |
265 check_diff((float *)tab_ref, (float *)tab, fft_size * 2); | 271 check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0); |
266 } | 272 } |
267 | 273 |
268 /* do a speed test */ | 274 /* do a speed test */ |
269 | 275 |
270 if (do_speed) { | 276 if (do_speed) { |