From ed31a26ebabcd28678aff679093b6e6fba55b67f Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Sat, 18 Nov 2017 08:06:06 +0100 Subject: Restructure: Move sample from common code to 'libsample' --- src/libsample/Makefile.am | 6 +++++ src/libsample/sample.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++ src/libsample/sample.h | 8 ++++++ 3 files changed, 78 insertions(+) create mode 100644 src/libsample/Makefile.am create mode 100644 src/libsample/sample.c create mode 100644 src/libsample/sample.h (limited to 'src/libsample') diff --git a/src/libsample/Makefile.am b/src/libsample/Makefile.am new file mode 100644 index 0000000..5ae865c --- /dev/null +++ b/src/libsample/Makefile.am @@ -0,0 +1,6 @@ +AM_CPPFLAGS = -Wall -Wextra -g $(all_includes) + +noinst_LIBRARIES = libsample.a + +libsample_a_SOURCES = \ + sample.c diff --git a/src/libsample/sample.c b/src/libsample/sample.c new file mode 100644 index 0000000..72ba941 --- /dev/null +++ b/src/libsample/sample.c @@ -0,0 +1,64 @@ +/* Sample definition + * + * (C) 2017 by Andreas Eversberg + * 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 as published by + * the Free Software Foundation, either version 3 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, see . + */ + +#include +#include "sample.h" + +/* + * A regular voice conversation takes place at this factor below the full range + * of 16 bits signed value: + */ +static double int_16_speech_level = SPEECH_LEVEL * 0.7079; /* 16 dBm below dBm0, which is about 3dBm below full 16 bit range */ + +/* A sample_t is a value that has virtually infinite precision but will also + * support high numbers. 'double' or 'float' types are sufficient. + * + * When using sample_t inside signal processing of each base station, the + * level of +- 1 is relative to the normal speach evenlope. + * + * When converting sample_t to int16_t, the level of +- 1 is reduced by factor. + * This way the speech may be louder before clipping happens. + * + * When using sample_t to modulate (SDR or sound card), the level is changed, + * so it represents the frequency deviation in Hz. The deviation of speech + * envelope is network dependant. + */ + +void samples_to_int16(int16_t *spl, sample_t *samples, int length) +{ + int32_t value; + + while (length--) { + value = *samples++ * int_16_speech_level * 32768.0; + if (value > 32767.0) + *spl++ = 32767; + else if (value < -32767.0) + *spl++ = -32767; + else + *spl++ = (uint16_t)value; + } +} + +void int16_to_samples(sample_t *samples, int16_t *spl, int length) +{ + while (length--) { + *samples++ = (double)(*spl++) / 32767.0 / int_16_speech_level; + } +} + diff --git a/src/libsample/sample.h b/src/libsample/sample.h new file mode 100644 index 0000000..01a17df --- /dev/null +++ b/src/libsample/sample.h @@ -0,0 +1,8 @@ + +typedef double sample_t; + +#define SPEECH_LEVEL 0.1585 + +void samples_to_int16(int16_t *spl, sample_t *samples, int length); +void int16_to_samples(sample_t *samples, int16_t *spl, int length); + -- cgit v1.2.3