aboutsummaryrefslogtreecommitdiffstats
path: root/src/libsample
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2022-09-25 19:31:31 +0200
committerAndreas Eversberg <jolly@eversberg.eu>2022-10-23 16:56:32 +0200
commita756ba8fd97cb2040d3dd86bab7c7e92e57bc16f (patch)
tree9ca07bc261edde17b79aa911e3f93bb07dcca18f /src/libsample
parent486d6b3780972f82f951c9761d2c1e6f25077296 (diff)
libsample: Add another function for converting between int16_t and sample_t
Now we have speech level and 1mW (0 dBm) conversion functions
Diffstat (limited to 'src/libsample')
-rw-r--r--src/libsample/sample.c29
-rw-r--r--src/libsample/sample.h6
2 files changed, 31 insertions, 4 deletions
diff --git a/src/libsample/sample.c b/src/libsample/sample.c
index a084b66..607adc5 100644
--- a/src/libsample/sample.c
+++ b/src/libsample/sample.c
@@ -25,6 +25,7 @@
* 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 */
+static double int_16_1mw_level = 0.7079; /* dBm0, 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.
@@ -40,7 +41,8 @@ static double int_16_speech_level = SPEECH_LEVEL * 0.7079; /* 16 dBm below dBm0,
* envelope is network dependent.
*/
-void samples_to_int16(int16_t *spl, sample_t *samples, int length)
+/* sample conversion relative to SPEECH level */
+void samples_to_int16_speech(int16_t *spl, sample_t *samples, int length)
{
int32_t value;
@@ -55,10 +57,33 @@ void samples_to_int16(int16_t *spl, sample_t *samples, int length)
}
}
-void int16_to_samples(sample_t *samples, int16_t *spl, int length)
+void int16_to_samples_speech(sample_t *samples, int16_t *spl, int length)
{
while (length--) {
*samples++ = (double)(*spl++) / 32767.0 / int_16_speech_level;
}
}
+/* sample conversion relative to 1mW level */
+void samples_to_int16_1mw(int16_t *spl, sample_t *samples, int length)
+{
+ int32_t value;
+
+ while (length--) {
+ value = *samples++ * int_16_1mw_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_1mw(sample_t *samples, int16_t *spl, int length)
+{
+ while (length--) {
+ *samples++ = (double)(*spl++) / 32767.0 / int_16_1mw_level;
+ }
+}
+
diff --git a/src/libsample/sample.h b/src/libsample/sample.h
index 01a17df..333ff7e 100644
--- a/src/libsample/sample.h
+++ b/src/libsample/sample.h
@@ -3,6 +3,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);
+void samples_to_int16_speech(int16_t *spl, sample_t *samples, int length);
+void int16_to_samples_speech(sample_t *samples, int16_t *spl, int length);
+void samples_to_int16_1mw(int16_t *spl, sample_t *samples, int length);
+void int16_to_samples_1mw(sample_t *samples, int16_t *spl, int length);