Mercurial > hg > audiostuff
diff spandsp-0.0.3/spandsp-0.0.3/tests/bert_tests.c @ 5:f762bf195c4b
import spandsp-0.0.3
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 16:00:21 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spandsp-0.0.3/spandsp-0.0.3/tests/bert_tests.c Fri Jun 25 16:00:21 2010 +0200 @@ -0,0 +1,491 @@ +/* + * SpanDSP - a series of DSP components for telephony + * + * bert_tests.c - Tests for the BER tester. + * + * Written by Steve Underwood <steveu@coppice.org> + * + * Copyright (C) 2004 Steve Underwood + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $Id: bert_tests.c,v 1.18 2006/11/19 14:07:26 steveu Exp $ + */ + +/*! \file */ + +/*! \page bert_tests_page BERT tests +\section bert_tests_page_sec_1 What does it do? +These tests exercise each of the BERT standards supported by the BERT module. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <inttypes.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#if defined(HAVE_TGMATH_H) +#include <tgmath.h> +#endif +#if defined(HAVE_MATH_H) +#include <math.h> +#endif +#include <assert.h> +#include <audiofile.h> +#include <tiffio.h> + +#include "spandsp.h" + +/* Use a local random generator, so the results are consistent across platforms */ +static int my_rand(void) +{ + static int rndnum = 1234567; + + return (rndnum = 1664525U*rndnum + 1013904223U); +} +/*- End of function --------------------------------------------------------*/ + +static void reporter(void *user_data, int reason, bert_results_t *results) +{ + int channel; + + channel = (int) (intptr_t) user_data; + switch (reason) + { + case BERT_REPORT_SYNCED: + printf("BERT report synced\n"); + break; + case BERT_REPORT_UNSYNCED: + printf("BERT report unsync'ed\n"); + break; + case BERT_REPORT_REGULAR: + printf("BERT report regular - %d bits, %d bad bits, %d resyncs\r", results->total_bits, results->bad_bits, results->resyncs); + break; + case BERT_REPORT_GT_10_2: + printf("BERT report > 1 in 10^2\n"); + break; + case BERT_REPORT_LT_10_2: + printf("BERT report < 1 in 10^2\n"); + break; + case BERT_REPORT_LT_10_3: + printf("BERT report < 1 in 10^3\n"); + break; + case BERT_REPORT_LT_10_4: + printf("BERT report < 1 in 10^4\n"); + break; + case BERT_REPORT_LT_10_5: + printf("BERT report < 1 in 10^5\n"); + break; + case BERT_REPORT_LT_10_6: + printf("BERT report < 1 in 10^6\n"); + break; + case BERT_REPORT_LT_10_7: + printf("BERT report < 1 in 10^7\n"); + break; + default: + printf("BERT report reason %d\n", reason); + break; + } +} +/*- End of function --------------------------------------------------------*/ + +int8_t test[0x800000]; + +int main(int argc, char *argv[]) +{ + bert_state_t tx_bert; + bert_state_t rx_bert; + bert_state_t bert; + bert_results_t bert_results; + int i; + int bit; + int zeros; + int max_zeros; + int failed; + + bert_init(&tx_bert, 0, BERT_PATTERN_ZEROS, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_ZEROS, 300, 20); + for (i = 0; i < 511*2; i++) + { + bit = bert_get_bit(&tx_bert); + bert_put_bit(&rx_bert, bit); + } + bert_result(&rx_bert, &bert_results); + printf("Zeros: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); + if (bert_results.bad_bits || bert_results.total_bits != 950) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_ONES, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_ONES, 300, 20); + for (i = 0; i < 511*2; i++) + { + bit = bert_get_bit(&tx_bert); + bert_put_bit(&rx_bert, bit); + } + bert_result(&rx_bert, &bert_results); + printf("Ones: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); + if (bert_results.bad_bits || bert_results.total_bits != 950) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_1_TO_7, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_1_TO_7, 300, 20); + for (i = 0; i < 511*2; i++) + { + bit = bert_get_bit(&tx_bert); + bert_put_bit(&rx_bert, bit); + } + bert_result(&rx_bert, &bert_results); + printf("1 to 7: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); + if (bert_results.bad_bits || bert_results.total_bits != 950) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_1_TO_3, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_1_TO_3, 300, 20); + for (i = 0; i < 511*2; i++) + { + bit = bert_get_bit(&tx_bert); + bert_put_bit(&rx_bert, bit); + } + bert_result(&rx_bert, &bert_results); + printf("1 to 3: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); + if (bert_results.bad_bits || bert_results.total_bits != 950) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_1_TO_1, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_1_TO_1, 300, 20); + for (i = 0; i < 511*2; i++) + { + bit = bert_get_bit(&tx_bert); + bert_put_bit(&rx_bert, bit); + } + bert_result(&rx_bert, &bert_results); + printf("1 to 1: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); + if (bert_results.bad_bits || bert_results.total_bits != 950) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_3_TO_1, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_3_TO_1, 300, 20); + for (i = 0; i < 511*2; i++) + { + bit = bert_get_bit(&tx_bert); + bert_put_bit(&rx_bert, bit); + } + bert_result(&rx_bert, &bert_results); + printf("3 to 1: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); + if (bert_results.bad_bits || bert_results.total_bits != 950) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_7_TO_1, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_7_TO_1, 300, 20); + for (i = 0; i < 511*2; i++) + { + bit = bert_get_bit(&tx_bert); + bert_put_bit(&rx_bert, bit); + } + bert_result(&rx_bert, &bert_results); + printf("7 to 1: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); + if (bert_results.bad_bits || bert_results.total_bits != 950) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O153_9, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O153_9, 300, 20); + for (i = 0; i < 0x200; i++) + test[i] = 0; + max_zeros = 0; + zeros = 0; + for (i = 0; i < 511*2; i++) + { + bit = bert_get_bit(&tx_bert); + if (bit) + { + if (zeros > max_zeros) + max_zeros = zeros; + zeros = 0; + } + else + { + zeros++; + } + bert_put_bit(&rx_bert, bit); + test[tx_bert.tx_reg]++; + } + failed = FALSE; + if (test[0] != 0) + { + printf("XXX %d %d\n", 0, test[0]); + failed = TRUE; + } + for (i = 1; i < 0x200; i++) + { + if (test[i] != 2) + { + printf("XXX %d %d\n", i, test[i]); + failed = TRUE; + } + } + bert_result(&rx_bert, &bert_results); + printf("O.153(9): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); + if (bert_results.bad_bits || bert_results.total_bits != 986 || failed) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O152_11, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O152_11, 300, 20); + for (i = 0; i < 0x800; i++) + test[i] = 0; + max_zeros = 0; + zeros = 0; + for (i = 0; i < 2047*2; i++) + { + bit = bert_get_bit(&tx_bert); + if (bit) + { + if (zeros > max_zeros) + max_zeros = zeros; + zeros = 0; + } + else + { + zeros++; + } + bert_put_bit(&rx_bert, bit); + test[tx_bert.tx_reg]++; + } + failed = FALSE; + if (test[0] != 0) + { + printf("XXX %d %d\n", 0, test[0]); + failed = TRUE; + } + for (i = 1; i < 0x800; i++) + { + if (test[i] != 2) + { + printf("XXX %d %d\n", i, test[i]); + failed = TRUE; + } + } + bert_result(&rx_bert, &bert_results); + printf("O.152(11): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); + if (bert_results.bad_bits || bert_results.total_bits != 4052 || failed) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O151_15, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O151_15, 300, 20); + for (i = 0; i < 0x8000; i++) + test[i] = 0; + max_zeros = 0; + zeros = 0; + for (i = 0; i < 32767*2; i++) + { + bit = bert_get_bit(&tx_bert); + if (bit) + { + if (zeros > max_zeros) + max_zeros = zeros; + zeros = 0; + } + else + { + zeros++; + } + bert_put_bit(&rx_bert, bit); + test[tx_bert.tx_reg]++; + } + failed = FALSE; + if (test[0] != 0) + { + printf("XXX %d %d\n", 0, test[0]); + failed = TRUE; + } + for (i = 1; i < 0x8000; i++) + { + if (test[i] != 2) + { + printf("XXX %d %d\n", i, test[i]); + failed = TRUE; + } + } + bert_result(&rx_bert, &bert_results); + printf("O.151(15): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); + if (bert_results.bad_bits || bert_results.total_bits != 65480 || failed) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O151_20, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O151_20, 300, 20); + for (i = 0; i < 0x100000; i++) + test[i] = 0; + max_zeros = 0; + zeros = 0; + for (i = 0; i < 1048575*2; i++) + { + bit = bert_get_bit(&tx_bert); + if (bit) + { + if (zeros > max_zeros) + max_zeros = zeros; + zeros = 0; + } + else + { + zeros++; + } + bert_put_bit(&rx_bert, bit); + test[tx_bert.tx_reg]++; + } + failed = FALSE; + if (test[0] != 0) + { + printf("XXX %d %d\n", 0, test[0]); + failed = TRUE; + } + for (i = 1; i < 0x100000; i++) + { + if (test[i] != 2) + printf("XXX %d %d\n", i, test[i]); + } + bert_result(&rx_bert, &bert_results); + printf("O.151(20): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); + if (bert_results.bad_bits || bert_results.total_bits != 2097066 || failed) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_ITU_O151_23, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_ITU_O151_23, 300, 20); + for (i = 0; i < 0x800000; i++) + test[i] = 0; + max_zeros = 0; + zeros = 0; + for (i = 0; i < 8388607*2; i++) + { + bit = bert_get_bit(&tx_bert); + if (bit) + { + if (zeros > max_zeros) + max_zeros = zeros; + zeros = 0; + } + else + { + zeros++; + } + bert_put_bit(&rx_bert, bit); + test[tx_bert.tx_reg]++; + } + failed = FALSE; + if (test[0] != 0) + { + printf("XXX %d %d\n", 0, test[0]); + failed = TRUE; + } + for (i = 1; i < 0x800000; i++) + { + if (test[i] != 2) + printf("XXX %d %d\n", i, test[i]); + } + bert_result(&rx_bert, &bert_results); + printf("O.151(23): Bad bits %d/%d, max zeros %d\n", bert_results.bad_bits, bert_results.total_bits, max_zeros); + if (bert_results.bad_bits || bert_results.total_bits != 16777136 || failed) + { + printf("Test failed.\n"); + exit(2); + } + + bert_init(&tx_bert, 0, BERT_PATTERN_QBF, 300, 20); + bert_init(&rx_bert, 0, BERT_PATTERN_QBF, 300, 20); + for (i = 0; i < 100000; i++) + { + bit = bert_get_bit(&tx_bert); + bert_put_bit(&rx_bert, bit); + } + bert_result(&rx_bert, &bert_results); + printf("QBF: Bad bits %d/%d\n", bert_results.bad_bits, bert_results.total_bits); + if (bert_results.bad_bits || bert_results.total_bits != 100000) + { + printf("Test failed.\n"); + exit(2); + } + + /* Test the mechanism for categorising the error rate into <10^x bands */ + /* TODO: The result of this test is not checked automatically */ + bert_init(&bert, 15000000, BERT_PATTERN_ITU_O152_11, 300, 20); + bert_set_report(&bert, 100000, reporter, (intptr_t) 0); + for (;;) + { + if ((bit = bert_get_bit(&bert)) == PUTBIT_END_OF_DATA) + { + bert_result(&bert, &bert_results); + printf("Rate test: %d bits, %d bad bits, %d resyncs\n", bert_results.total_bits, bert_results.bad_bits, bert_results.resyncs); + if (bert_results.total_bits != 15000000 - 42 + || + bert_results.bad_bits != 58 + || + bert_results.resyncs != 0) + { + printf("Tests failed\n"); + exit(2); + } + break; + //bert_init(&bert, 15000000, BERT_PATTERN_ITU_O152_11, 300, 20); + //bert_set_report(&bert, 100000, reporter, (intptr_t) 0); + //continue; + } + if ((my_rand() & 0x3FFFF) == 0) + bit ^= 1; + //if ((my_rand() & 0xFFF) == 0) + // bert_put_bit(&bert, bit); + bert_put_bit(&bert, bit); + } + + printf("Tests passed.\n"); + return 0; +} +/*- End of function --------------------------------------------------------*/ +/*- End of file ------------------------------------------------------------*/