aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2020-02-06 14:25:01 +0100
committerlaforge <laforge@osmocom.org>2020-04-14 13:22:44 +0000
commit898c9c6af8f55f7c042812255c87223754c4a5ff (patch)
treefad28d0946c7968ddd8dced06d0082f7e90d66ae /tests
parent099c8340edbae163205461f0d8c775dd8c225c69 (diff)
dtx: add decoding for AMR-DTX frames
gsm0503_coding contains AMR decoder functions for HR and FR. Those can only decode AMR payload frames but not amr DTX frames. Lets add functionality to detect DTX frames. Also lets add decoding for SID_UPDATE frames as well as error checking for the SID frame recognition patterns. Related: OS#2978 Change-Id: I2bbdb39ea20461ca08b2e6f1a33532cb55cd5195
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am6
-rw-r--r--tests/dtx/dtx_gsm0503_test.c130
-rw-r--r--tests/dtx/dtx_gsm0503_test.ok11
-rw-r--r--tests/testsuite.at6
4 files changed, 153 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index bf7017b1..0d0327a3 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -34,6 +34,7 @@ check_PROGRAMS = timer/timer_test sms/sms_test ussd/ussd_test \
use_count/use_count_test \
context/context_test \
gsm0502/gsm0502_test \
+ dtx/dtx_gsm0503_test \
$(NULL)
if ENABLE_MSGFILE
@@ -114,6 +115,10 @@ conv_conv_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/libgsmint.la
gsm0502_gsm0502_test_SOURCES = gsm0502/gsm0502_test.c
gsm0502_gsm0502_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/libosmogsm.la
+dtx_dtx_gsm0503_test_SOURCES = dtx/dtx_gsm0503_test.c
+dtx_dtx_gsm0503_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/libosmogsm.la \
+ $(top_builddir)/src/coding/libosmocoding.la
+
conv_conv_gsm0503_test_SOURCES = conv/conv_gsm0503_test.c conv/conv.c conv/gsm0503_test_vectors.c
conv_conv_gsm0503_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/libgsmint.la
conv_conv_gsm0503_test_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/tests/conv
@@ -339,6 +344,7 @@ EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) \
use_count/use_count_test.ok use_count/use_count_test.err \
context/context_test.ok \
gsm0502/gsm0502_test.ok \
+ dtx/dtx_gsm0503_test.ok \
exec/exec_test.ok exec/exec_test.err \
$(NULL)
diff --git a/tests/dtx/dtx_gsm0503_test.c b/tests/dtx/dtx_gsm0503_test.c
new file mode 100644
index 00000000..f3003133
--- /dev/null
+++ b/tests/dtx/dtx_gsm0503_test.c
@@ -0,0 +1,130 @@
+/*
+ * (C) 2019 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
+ * Author: Philipp Maier <pmaier@sysmocom.de>
+ * All Rights Reserved
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/coding/gsm0503_amr_dtx.h>
+
+char sample_afs_sid_frame[] =
+ {
+"111111110000000011001100101010100100010011111111001000100111011110011001001100111100110010011001111011100100010011111111001000100111011110011001001100111100110010011001111011100100010011111111001000100111011110011001001100111100110010011001111011100100010011111111001000100111011110011001001100111100110010011001111011100100010011111111001000100111011110011001001100111100110010011001111011100100010011111111001000100111011110011001001100111100110010011001"
+};
+
+char sample_afs_sid_update_frame[] =
+ {
+"111111110000000011001100101010100000010000001111111100101011011110001001000000110111110000001001011111101111010011001111100000101000011111001001111100110111110011111001001111101100010001001111000000100100011100111001100000111000110000111001010011101111010011111111010000101100011100111001111100110111110011111001110011101000010010001111110000100000011111001001011100110011110010111001101111100011010001111111001100100100011111111001000000110000110000001001"
+};
+
+char sample_afs_onset_frame[] =
+ {
+"111111110000000011001100101010100000111100000000111111000100101000111111100000000111110010001010001111110100000011111100111110100100111111000000110011001011101001001111011100001011110000001010010011111100000000111100111110101000111110110000111111000000101011111111010000001100110000111010111111111000000010111100000010100100111100110000100011001000101000111111101100001011110000111010011111110011000010111100101110101100111111000000010011001111101000001111"
+};
+
+char sample_ahs_sid_update_frame[] =
+ {
+"111100001100101010110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110000110110100011001000011010000000000000001111010010000000000001000000000010110000000011001000000000000000100000101000000000000000001010100000010010000000000010000111110001110110110011001101000000000100100011001000001010000100100000000011"
+};
+
+char sample_ahs_sid_first_p1_frame[] =
+ {
+"111100001100101001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001111001001001011010110001101100101001110001111001110100110010000111101110110110000100100011111001001110000011110110001010010101100001010100000111101110110001010000111110001110110110011001101001111000011101001010011100011000111010110000011"
+};
+
+char sample_ahs_sid_first_p2_frame[] =
+ {
+"111110100100000010100000110111001110101100000100101001011101100011101010010000001010010010001100101010100100010111110101110011011110101000010100111000001001110111101110010101001110000010001101101011110000000011100100110110011111100011001000001101100101001110001111001110100110010000111101110110110000100100011111001001110000011110110001010010101100001010100000111101110110001010000111110001110110110011001101001111000011101001010011100011000111010110000011"
+};
+
+char sample_ahs_onset_frame[] =
+ {
+"111101011000101001010000111001000111011110000000011110001110010011011111100000101101101001101110011111010000000001010010110001101101110100000010011110101100010001011101101010000111100011101100111101011010100011110010110001001111100011001000011010000000000000001010010010000000000001000000000000100000000011001000000000000000100000101000000000000000010010000101010010000000000010101100111110101000110110011001000000000100100011001000001010000100100000001100"
+};
+
+char sample_sid_first_inh_frame[] =
+ {
+"xBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxBx1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0x0x0x0x1x1x0x1x1x0"
+};
+
+char sample_sid_update_inh_frame[] =
+ {
+"xBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxBx0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1x1x1x1x0x0x1x0x0x1"
+};
+
+unsigned int string_to_ubit(ubit_t * ubits, char *string)
+{
+ unsigned int len;
+ unsigned int i;
+
+ len = strlen(string);
+
+ for (i = 0; i < len; i++) {
+ ubits[i] = string[i] & 1;
+ }
+
+ return len;
+}
+
+void test_gsm0503_detect_afs_dtx_frame(char *string)
+{
+ ubit_t ubits[512];
+ uint8_t dtx_frame_type;
+ int n_errors;
+ int n_bits_total;
+
+ string_to_ubit(ubits, string);
+ dtx_frame_type = gsm0503_detect_afs_dtx_frame(&n_errors, &n_bits_total, ubits);
+ printf(" ==> %s, n_errors=%i, n_bits_total=%i\n", gsm0503_amr_dtx_frame_name(dtx_frame_type),
+ n_errors, n_bits_total);
+}
+
+void test_gsm0503_detect_ahs_dtx_frame(char *string)
+{
+ ubit_t ubits[512];
+ uint8_t dtx_frame_type;
+ int n_errors;
+ int n_bits_total;
+
+ string_to_ubit(ubits, string);
+ dtx_frame_type = gsm0503_detect_ahs_dtx_frame(&n_errors, &n_bits_total, ubits);
+ printf(" ==> %s, n_errors=%i, n_bits_total=%i\n", gsm0503_amr_dtx_frame_name(dtx_frame_type),
+ n_errors, n_bits_total);
+}
+
+int main(int argc, char **argv)
+{
+ printf("FR AMR DTX FRAMES:\n");
+ test_gsm0503_detect_afs_dtx_frame(sample_afs_sid_frame);
+ test_gsm0503_detect_afs_dtx_frame(sample_afs_sid_update_frame);
+ test_gsm0503_detect_afs_dtx_frame(sample_afs_onset_frame);
+ printf("HR AMR DTX FRAMES:\n");
+ test_gsm0503_detect_ahs_dtx_frame(sample_ahs_sid_update_frame);
+ test_gsm0503_detect_ahs_dtx_frame(sample_ahs_sid_first_p1_frame);
+ test_gsm0503_detect_ahs_dtx_frame(sample_ahs_sid_first_p2_frame);
+ test_gsm0503_detect_ahs_dtx_frame(sample_ahs_onset_frame);
+ test_gsm0503_detect_ahs_dtx_frame(sample_sid_first_inh_frame);
+ test_gsm0503_detect_ahs_dtx_frame(sample_sid_update_inh_frame);
+
+ return EXIT_SUCCESS;
+}
diff --git a/tests/dtx/dtx_gsm0503_test.ok b/tests/dtx/dtx_gsm0503_test.ok
new file mode 100644
index 00000000..a95a18bb
--- /dev/null
+++ b/tests/dtx/dtx_gsm0503_test.ok
@@ -0,0 +1,11 @@
+FR AMR DTX FRAMES:
+ ==> AFS_SID_FIRST, n_errors=0, n_bits_total=212
+ ==> AFS_SID_UPDATE, n_errors=0, n_bits_total=212
+ ==> AFS_ONSET, n_errors=0, n_bits_total=228
+HR AMR DTX FRAMES:
+ ==> AHS_SID_UPDATE, n_errors=0, n_bits_total=212
+ ==> AHS_SID_FIRST_P1, n_errors=0, n_bits_total=212
+ ==> AHS_SID_FIRST_P2, n_errors=0, n_bits_total=114
+ ==> AHS_ONSET, n_errors=0, n_bits_total=114
+ ==> AHS_SID_FIRST_INH, n_errors=0, n_bits_total=212
+ ==> AHS_SID_UPDATE_INH, n_errors=0, n_bits_total=212
diff --git a/tests/testsuite.at b/tests/testsuite.at
index cb83ab91..bab57309 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -132,6 +132,12 @@ cat $abs_srcdir/gsm0502/gsm0502_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/gsm0502/gsm0502_test], [0], [expout], [ignore])
AT_CLEANUP
+AT_SETUP([dtx])
+AT_KEYWORDS([dtx])
+cat $abs_srcdir/dtx/dtx_gsm0503_test.ok > expout
+AT_CHECK([$abs_top_builddir/tests/dtx/dtx_gsm0503_test], [0], [expout], [ignore])
+AT_CLEANUP
+
AT_SETUP([gsm0808])
AT_KEYWORDS([gsm0808])
cat $abs_srcdir/gsm0808/gsm0808_test.ok > expout