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) {