Mercurial > hg > audiostuff
comparison spandsp-0.0.6pre17/tests/bert_tests.c @ 4:26cd8f1ef0b1
import spandsp-0.0.6pre17
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 15:50:58 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
3:c6c5a16ce2f2 | 4:26cd8f1ef0b1 |
---|---|
1 /* | |
2 * SpanDSP - a series of DSP components for telephony | |
3 * | |
4 * bert_tests.c - Tests for the BER tester. | |
5 * | |
6 * Written by Steve Underwood <steveu@coppice.org> | |
7 * | |
8 * Copyright (C) 2004 Steve Underwood | |
9 * | |
10 * All rights reserved. | |
11 * | |
12 * This program is free software; you can redistribute it and/or modify | |
13 * it under the terms of the GNU General Public License version 2, as | |
14 * published by the Free Software Foundation. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
24 * | |
25 * $Id: bert_tests.c,v 1.28 2009/05/30 15:23:13 steveu Exp $ | |
26 */ | |
27 | |
28 /*! \file */ | |
29 | |
30 /*! \page bert_tests_page BERT tests | |
31 \section bert_tests_page_sec_1 What does it do? | |
32 These tests exercise each of the BERT standards supported by the BERT module. | |
33 */ | |
34 | |
35 #if defined(HAVE_CONFIG_H) | |
36 #include "config.h" | |
37 #endif | |
38 | |
39 #include <stdlib.h> | |
40 #include <stdio.h> | |
41 #include <string.h> | |
42 #include <assert.h> | |
43 #include <sndfile.h> | |
44 | |
45 //#if defined(WITH_SPANDSP_INTERNALS) | |
46 #define SPANDSP_EXPOSE_INTERNAL_STRUCTURES | |
47 //#endif | |
48 | |
49 #include "spandsp.h" | |
50 | |
51 /* Use a local random generator, so the results are consistent across platforms */ | |
52 static int my_rand(void) | |
53 { | |
54 static int rndnum = 1234567; | |
55 | |
56 return (rndnum = 1664525U*rndnum + 1013904223U); | |
57 } | |
58 /*- End of function --------------------------------------------------------*/ | |
59 | |
60 static void reporter(void *user_data, int reason, bert_results_t *results) | |
61 { | |
62 int channel; | |
63 | |
64 channel = (int) (intptr_t) user_data; | |
65 printf("BERT report '%s' ", bert_event_to_str(reason)); | |
66 switch (reason) | |
67 { | |
68 case BERT_REPORT_REGULAR: | |
69 printf("%d bits, %d bad bits, %d resyncs", results->total_bits, results->bad_bits, results->resyncs); | |
70 break; | |
71 } | |
72 printf("\r"); | |
73 } | |
74 /*- End of function --------------------------------------------------------*/ | |
75 | |
76 int8_t test[0x800000]; | |
77 | |
78 int main(int argc, char *argv[]) | |
79 { | |
80 bert_state_t tx_bert; | |
81 bert_state_t rx_bert; | |
82 bert_state_t bert; | |
83 bert_results_t bert_results; | |
84 int i; | |
85 int bit; | |
86 int zeros; | |
87 int max_zeros; | |
88 int failed; | |
89 | |
90 bert_init(&tx_bert, 0, BERT_PATTERN_ZEROS, 300, 20); | |
91 bert_init(&rx_bert, 0, BERT_PATTERN_ZEROS, 300, 20); | |
92 for (i = 0; i < 511*2; i++) | |
93 { | |
94 bit = bert_get_bit(&tx_bert); | |
95 bert_put_bit(&rx_bert, bit); | |
96 } | |
97 bert_result(&rx_bert, &bert_results); | |
98 printf("Zeros: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); | |
99 if (bert_results.bad_bits || bert_results.total_bits != 950) | |
100 { | |
101 printf("Test failed.\n"); | |
102 exit(2); | |
103 } | |
104 | |
105 bert_init(&tx_bert, 0, BERT_PATTERN_ONES, 300, 20); | |
106 bert_init(&rx_bert, 0, BERT_PATTERN_ONES, 300, 20); | |
107 for (i = 0; i < 511*2; i++) | |
108 { | |
109 bit = bert_get_bit(&tx_bert); | |
110 bert_put_bit(&rx_bert, bit); | |
111 } | |
112 bert_result(&rx_bert, &bert_results); | |
113 printf("Ones: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); | |
114 if (bert_results.bad_bits || bert_results.total_bits != 950) | |
115 { | |
116 printf("Test failed.\n"); | |
117 exit(2); | |
118 } | |
119 | |
120 bert_init(&tx_bert, 0, BERT_PATTERN_1_TO_7, 300, 20); | |
121 bert_init(&rx_bert, 0, BERT_PATTERN_1_TO_7, 300, 20); | |
122 for (i = 0; i < 511*2; i++) | |
123 { | |
124 bit = bert_get_bit(&tx_bert); | |
125 bert_put_bit(&rx_bert, bit); | |
126 } | |
127 bert_result(&rx_bert, &bert_results); | |
128 printf("1 to 7: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); | |
129 if (bert_results.bad_bits || bert_results.total_bits != 950) | |
130 { | |
131 printf("Test failed.\n"); | |
132 exit(2); | |
133 } | |
134 | |
135 bert_init(&tx_bert, 0, BERT_PATTERN_1_TO_3, 300, 20); | |
136 bert_init(&rx_bert, 0, BERT_PATTERN_1_TO_3, 300, 20); | |
137 for (i = 0; i < 511*2; i++) | |
138 { | |
139 bit = bert_get_bit(&tx_bert); | |
140 bert_put_bit(&rx_bert, bit); | |
141 } | |
142 bert_result(&rx_bert, &bert_results); | |
143 printf("1 to 3: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); | |
144 if (bert_results.bad_bits || bert_results.total_bits != 950) | |
145 { | |
146 printf("Test failed.\n"); | |
147 exit(2); | |
148 } | |
149 | |
150 bert_init(&tx_bert, 0, BERT_PATTERN_1_TO_1, 300, 20); | |
151 bert_init(&rx_bert, 0, BERT_PATTERN_1_TO_1, 300, 20); | |
152 for (i = 0; i < 511*2; i++) | |
153 { | |
154 bit = bert_get_bit(&tx_bert); | |
155 bert_put_bit(&rx_bert, bit); | |
156 } | |
157 bert_result(&rx_bert, &bert_results); | |
158 printf("1 to 1: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); | |
159 if (bert_results.bad_bits || bert_results.total_bits != 950) | |
160 { | |
161 printf("Test failed.\n"); | |
162 exit(2); | |
163 } | |
164 | |
165 bert_init(&tx_bert, 0, BERT_PATTERN_3_TO_1, 300, 20); | |
166 bert_init(&rx_bert, 0, BERT_PATTERN_3_TO_1, 300, 20); | |
167 for (i = 0; i < 511*2; i++) | |
168 { | |
169 bit = bert_get_bit(&tx_bert); | |
170 bert_put_bit(&rx_bert, bit); | |
171 } | |
172 bert_result(&rx_bert, &bert_results); | |
173 printf("3 to 1: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); | |
174 if (bert_results.bad_bits || bert_results.total_bits != 950) | |
175 { | |
176 printf("Test failed.\n"); | |
177 exit(2); | |
178 } | |
179 | |
180 bert_init(&tx_bert, 0, BERT_PATTERN_7_TO_1, 300, 20); | |
181 bert_init(&rx_bert, 0, BERT_PATTERN_7_TO_1, 300, 20); | |
182 for (i = 0; i < 511*2; i++) | |
183 { | |
184 bit = bert_get_bit(&tx_bert); | |
185 bert_put_bit(&rx_bert, bit); | |
186 } | |
187 bert_result(&rx_bert, &bert_results); | |
188 printf("7 to 1: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); | |
189 if (bert_results.bad_bits || bert_results.total_bits != 950) | |
190 { | |
191 printf("Test failed.\n"); | |
192 exit(2); | |
193 } | |
194 | |
195 bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O153_9, 300, 20); | |
196 bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O153_9, 300, 20); | |
197 for (i = 0; i < 0x200; i++) | |
198 test[i] = 0; | |
199 max_zeros = 0; | |
200 zeros = 0; | |
201 for (i = 0; i < 511*2; i++) | |
202 { | |
203 bit = bert_get_bit(&tx_bert); | |
204 if (bit) | |
205 { | |
206 if (zeros > max_zeros) | |
207 max_zeros = zeros; | |
208 zeros = 0; | |
209 } | |
210 else | |
211 { | |
212 zeros++; | |
213 } | |
214 bert_put_bit(&rx_bert, bit); | |
215 test[tx_bert.tx.reg]++; | |
216 } | |
217 failed = FALSE; | |
218 if (test[0] != 0) | |
219 { | |
220 printf("XXX %d %d\n", 0, test[0]); | |
221 failed = TRUE; | |
222 } | |
223 for (i = 1; i < 0x200; i++) | |
224 { | |
225 if (test[i] != 2) | |
226 { | |
227 printf("XXX %d %d\n", i, test[i]); | |
228 failed = TRUE; | |
229 } | |
230 } | |
231 bert_result(&rx_bert, &bert_results); | |
232 printf("O.153(9): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); | |
233 if (bert_results.bad_bits || bert_results.total_bits != 986 || failed) | |
234 { | |
235 printf("Test failed.\n"); | |
236 exit(2); | |
237 } | |
238 | |
239 bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O152_11, 300, 20); | |
240 bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O152_11, 300, 20); | |
241 for (i = 0; i < 0x800; i++) | |
242 test[i] = 0; | |
243 max_zeros = 0; | |
244 zeros = 0; | |
245 for (i = 0; i < 2047*2; i++) | |
246 { | |
247 bit = bert_get_bit(&tx_bert); | |
248 if (bit) | |
249 { | |
250 if (zeros > max_zeros) | |
251 max_zeros = zeros; | |
252 zeros = 0; | |
253 } | |
254 else | |
255 { | |
256 zeros++; | |
257 } | |
258 bert_put_bit(&rx_bert, bit); | |
259 test[tx_bert.tx.reg]++; | |
260 } | |
261 failed = FALSE; | |
262 if (test[0] != 0) | |
263 { | |
264 printf("XXX %d %d\n", 0, test[0]); | |
265 failed = TRUE; | |
266 } | |
267 for (i = 1; i < 0x800; i++) | |
268 { | |
269 if (test[i] != 2) | |
270 { | |
271 printf("XXX %d %d\n", i, test[i]); | |
272 failed = TRUE; | |
273 } | |
274 } | |
275 bert_result(&rx_bert, &bert_results); | |
276 printf("O.152(11): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); | |
277 if (bert_results.bad_bits || bert_results.total_bits != 4052 || failed) | |
278 { | |
279 printf("Test failed.\n"); | |
280 exit(2); | |
281 } | |
282 | |
283 bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O151_15, 300, 20); | |
284 bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O151_15, 300, 20); | |
285 for (i = 0; i < 0x8000; i++) | |
286 test[i] = 0; | |
287 max_zeros = 0; | |
288 zeros = 0; | |
289 for (i = 0; i < 32767*2; i++) | |
290 { | |
291 bit = bert_get_bit(&tx_bert); | |
292 if (bit) | |
293 { | |
294 if (zeros > max_zeros) | |
295 max_zeros = zeros; | |
296 zeros = 0; | |
297 } | |
298 else | |
299 { | |
300 zeros++; | |
301 } | |
302 bert_put_bit(&rx_bert, bit); | |
303 test[tx_bert.tx.reg]++; | |
304 } | |
305 failed = FALSE; | |
306 if (test[0] != 0) | |
307 { | |
308 printf("XXX %d %d\n", 0, test[0]); | |
309 failed = TRUE; | |
310 } | |
311 for (i = 1; i < 0x8000; i++) | |
312 { | |
313 if (test[i] != 2) | |
314 { | |
315 printf("XXX %d %d\n", i, test[i]); | |
316 failed = TRUE; | |
317 } | |
318 } | |
319 bert_result(&rx_bert, &bert_results); | |
320 printf("O.151(15): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); | |
321 if (bert_results.bad_bits || bert_results.total_bits != 65480 || failed) | |
322 { | |
323 printf("Test failed.\n"); | |
324 exit(2); | |
325 } | |
326 | |
327 bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O151_20, 300, 20); | |
328 bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O151_20, 300, 20); | |
329 for (i = 0; i < 0x100000; i++) | |
330 test[i] = 0; | |
331 max_zeros = 0; | |
332 zeros = 0; | |
333 for (i = 0; i < 1048575*2; i++) | |
334 { | |
335 bit = bert_get_bit(&tx_bert); | |
336 if (bit) | |
337 { | |
338 if (zeros > max_zeros) | |
339 max_zeros = zeros; | |
340 zeros = 0; | |
341 } | |
342 else | |
343 { | |
344 zeros++; | |
345 } | |
346 bert_put_bit(&rx_bert, bit); | |
347 test[tx_bert.tx.reg]++; | |
348 } | |
349 failed = FALSE; | |
350 if (test[0] != 0) | |
351 { | |
352 printf("XXX %d %d\n", 0, test[0]); | |
353 failed = TRUE; | |
354 } | |
355 for (i = 1; i < 0x100000; i++) | |
356 { | |
357 if (test[i] != 2) | |
358 printf("XXX %d %d\n", i, test[i]); | |
359 } | |
360 bert_result(&rx_bert, &bert_results); | |
361 printf("O.151(20): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); | |
362 if (bert_results.bad_bits || bert_results.total_bits != 2097066 || failed) | |
363 { | |
364 printf("Test failed.\n"); | |
365 exit(2); | |
366 } | |
367 | |
368 bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O151_23, 300, 20); | |
369 bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O151_23, 300, 20); | |
370 for (i = 0; i < 0x800000; i++) | |
371 test[i] = 0; | |
372 max_zeros = 0; | |
373 zeros = 0; | |
374 for (i = 0; i < 8388607*2; i++) | |
375 { | |
376 bit = bert_get_bit(&tx_bert); | |
377 if (bit) | |
378 { | |
379 if (zeros > max_zeros) | |
380 max_zeros = zeros; | |
381 zeros = 0; | |
382 } | |
383 else | |
384 { | |
385 zeros++; | |
386 } | |
387 bert_put_bit(&rx_bert, bit); | |
388 test[tx_bert.tx.reg]++; | |
389 } | |
390 failed = FALSE; | |
391 if (test[0] != 0) | |
392 { | |
393 printf("XXX %d %d\n", 0, test[0]); | |
394 failed = TRUE; | |
395 } | |
396 for (i = 1; i < 0x800000; i++) | |
397 { | |
398 if (test[i] != 2) | |
399 printf("XXX %d %d\n", i, test[i]); | |
400 } | |
401 bert_result(&rx_bert, &bert_results); | |
402 printf("O.151(23): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); | |
403 if (bert_results.bad_bits || bert_results.total_bits != 16777136 || failed) | |
404 { | |
405 printf("Test failed.\n"); | |
406 exit(2); | |
407 } | |
408 | |
409 bert_init(&tx_bert, 0, BERT_PATTERN_QBF, 300, 20); | |
410 bert_init(&rx_bert, 0, BERT_PATTERN_QBF, 300, 20); | |
411 for (i = 0; i < 100000; i++) | |
412 { | |
413 bit = bert_get_bit(&tx_bert); | |
414 bert_put_bit(&rx_bert, bit); | |
415 } | |
416 bert_result(&rx_bert, &bert_results); | |
417 printf("QBF: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); | |
418 if (bert_results.bad_bits || bert_results.total_bits != 100000) | |
419 { | |
420 printf("Test failed.\n"); | |
421 exit(2); | |
422 } | |
423 | |
424 /* Test the mechanism for categorising the error rate into <10^x bands */ | |
425 /* TODO: The result of this test is not checked automatically */ | |
426 bert_init(&bert, 15000000, BERT_PATTERN_ITU_O152_11, 300, 20); | |
427 bert_set_report(&bert, 100000, reporter, (intptr_t) 0); | |
428 for (;;) | |
429 { | |
430 if ((bit = bert_get_bit(&bert)) == SIG_STATUS_END_OF_DATA) | |
431 { | |
432 bert_result(&bert, &bert_results); | |
433 printf("Rate test: %d bits, %d bad bits, %d resyncs\n", bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); | |
434 if (bert_results.total_bits != 15000000 - 42 | |
435 || | |
436 bert_results.bad_bits != 58 | |
437 || | |
438 bert_results.resyncs != 0) | |
439 { | |
440 printf("Tests failed\n"); | |
441 exit(2); | |
442 } | |
443 break; | |
444 //bert_init(&bert, 15000000, BERT_PATTERN_ITU_O152_11, 300, 20); | |
445 //bert_set_report(&bert, 100000, reporter, (intptr_t) 0); | |
446 //continue; | |
447 } | |
448 if ((my_rand() & 0x3FFFF) == 0) | |
449 bit ^= 1; | |
450 //if ((my_rand() & 0xFFF) == 0) | |
451 // bert_put_bit(&bert, bit); | |
452 bert_put_bit(&bert, bit); | |
453 } | |
454 | |
455 printf("Tests passed.\n"); | |
456 return 0; | |
457 } | |
458 /*- End of function --------------------------------------------------------*/ | |
459 /*- End of file ------------------------------------------------------------*/ |