diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2022-09-25 19:31:31 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2022-10-23 16:56:32 +0200 |
commit | a756ba8fd97cb2040d3dd86bab7c7e92e57bc16f (patch) | |
tree | 9ca07bc261edde17b79aa911e3f93bb07dcca18f /src/libsample | |
parent | 486d6b3780972f82f951c9761d2c1e6f25077296 (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.c | 29 | ||||
-rw-r--r-- | src/libsample/sample.h | 6 |
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); |