diff --git a/libs/spandsp/src/dds_float.c b/libs/spandsp/src/dds_float.c index 4acaa1eaf9..45e5411f9c 100644 --- a/libs/spandsp/src/dds_float.c +++ b/libs/spandsp/src/dds_float.c @@ -2100,6 +2100,12 @@ static const float sine_table[SINELEN] = -0.00306796f }; +SPAN_DECLARE(float) dds_phase_to_radians(uint32_t phase) +{ + return phase*2.0f*3.1415926f/(65536.0f*65536.0f); +} +/*- End of function --------------------------------------------------------*/ + SPAN_DECLARE(int32_t) dds_phase_ratef(float frequency) { return (int32_t) (frequency*65536.0f*65536.0f/SAMPLE_RATE); @@ -2124,6 +2130,24 @@ SPAN_DECLARE(float) dds_scaling_dbovf(float level) } /*- End of function --------------------------------------------------------*/ +static __inline__ float dds_lookupx(uint32_t phase) +{ + return sine_table[phase >> (32 - SLENK)]; +} +/*- End of function --------------------------------------------------------*/ + +SPAN_DECLARE(float) dds_lookupf(uint32_t phase) +{ + return dds_lookupx(phase); +} +/*- End of function --------------------------------------------------------*/ + +SPAN_DECLARE(float) dds_offsetf(uint32_t phase_acc, int32_t phase_offset) +{ + return dds_lookupx(phase_acc + phase_offset); +} +/*- End of function --------------------------------------------------------*/ + SPAN_DECLARE(void) dds_advancef(uint32_t *phase_acc, int32_t phase_rate) { *phase_acc += phase_rate; @@ -2134,34 +2158,17 @@ SPAN_DECLARE(float) ddsf(uint32_t *phase_acc, int32_t phase_rate) { float amp; - amp = sine_table[*phase_acc >> (32 - SLENK)]; + amp = dds_lookupx(*phase_acc); *phase_acc += phase_rate; return amp; } /*- End of function --------------------------------------------------------*/ -SPAN_DECLARE(float) dds_lookupf(uint32_t phase) -{ - return sine_table[phase >> (32 - SLENK)]; -} -/*- End of function --------------------------------------------------------*/ - SPAN_DECLARE(float) dds_modf(uint32_t *phase_acc, int32_t phase_rate, float scale, int32_t phase) { float amp; - amp = sine_table[*(phase_acc + phase) >> (32 - SLENK)]*scale; - *phase_acc += phase_rate; - return amp; -} -/*- End of function --------------------------------------------------------*/ - -SPAN_DECLARE(complexf_t) dds_complexf(uint32_t *phase_acc, int32_t phase_rate) -{ - complexf_t amp; - - amp = complex_setf(sine_table[(*phase_acc + (1 << 30)) >> (32 - SLENK)], - sine_table[*phase_acc >> (32 - SLENK)]); + amp = dds_lookupx(*phase_acc + phase)*scale; *phase_acc += phase_rate; return amp; } @@ -2169,8 +2176,17 @@ SPAN_DECLARE(complexf_t) dds_complexf(uint32_t *phase_acc, int32_t phase_rate) SPAN_DECLARE(complexf_t) dds_lookup_complexf(uint32_t phase) { - return complex_setf(sine_table[(phase + (1 << 30)) >> (32 - SLENK)], - sine_table[phase >> (32 - SLENK)]); + return complex_setf(dds_lookupx(phase + (1 << 30)), dds_lookupx(phase)); +} +/*- End of function --------------------------------------------------------*/ + +SPAN_DECLARE(complexf_t) dds_complexf(uint32_t *phase_acc, int32_t phase_rate) +{ + complexf_t amp; + + amp = complex_setf(dds_lookupx(*phase_acc + (1 << 30)), dds_lookupx(*phase_acc)); + *phase_acc += phase_rate; + return amp; } /*- End of function --------------------------------------------------------*/ @@ -2178,8 +2194,8 @@ SPAN_DECLARE(complexf_t) dds_complex_modf(uint32_t *phase_acc, int32_t phase_rat { complexf_t amp; - amp = complex_setf(sine_table[(*phase_acc + phase + (1 << 30)) >> (32 - SLENK)]*scale, - sine_table[(*phase_acc + phase) >> (32 - SLENK)]*scale); + amp = complex_setf(dds_lookupx(*phase_acc + phase + (1 << 30))*scale, + dds_lookupx(*phase_acc + phase)*scale); *phase_acc += phase_rate; return amp; } diff --git a/libs/spandsp/src/spandsp/dds.h b/libs/spandsp/src/spandsp/dds.h index c4b8b6bb13..2364f7ce01 100644 --- a/libs/spandsp/src/spandsp/dds.h +++ b/libs/spandsp/src/spandsp/dds.h @@ -36,6 +36,12 @@ extern "C" { #endif +/*! \brief Convert a 32 bit phase angle to an angle in radians, between 0 and 2*PI + \param phase The angle to convert. + \return The angle in radians. +*/ +SPAN_DECLARE(float) dds_phase_to_radians(uint32_t phase); + /*! \brief Find the phase rate value to achieve a particular frequency. \param frequency The desired frequency, in Hz. \return The phase rate which while achieve the desired frequency. @@ -221,6 +227,13 @@ SPAN_DECLARE(float) ddsf(uint32_t *phase_acc, int32_t phase_rate); */ SPAN_DECLARE(float) dds_lookupf(uint32_t phase); +/*! \brief Lookup the floating point value of a particular phase offset from an accumulated phase. + \param phase_acc The accumulated phase. + \param phase_offset The phase offset. + \return The signal amplitude. +*/ +SPAN_DECLARE(float) dds_offsetf(uint32_t phase_acc, int32_t phase_offset); + /*! \brief Generate a floating point tone sample, with modulation. \param phase_acc A pointer to a phase accumulator value. \param phase_rate The phase increment to be applied. diff --git a/libs/spandsp/src/spandsp/g711.h b/libs/spandsp/src/spandsp/g711.h index 438861651e..f722c6067c 100644 --- a/libs/spandsp/src/spandsp/g711.h +++ b/libs/spandsp/src/spandsp/g711.h @@ -137,15 +137,15 @@ static __inline__ uint8_t linear_to_ulaw(int linear) } seg = top_bit(linear | 0xFF) - 7; - - /* - * Combine the sign, segment, quantization bits, - * and complement the code word. - */ if (seg >= 8) + { u_val = (uint8_t) (0x7F ^ mask); + } else + { + /* Combine the sign, segment, quantization bits, and complement the code word. */ u_val = (uint8_t) (((seg << 4) | ((linear >> (seg + 3)) & 0xF)) ^ mask); + } #if defined(G711_ULAW_ZEROTRAP) /* Optional ITU trap */ if (u_val == 0) @@ -201,13 +201,14 @@ static __inline__ int16_t ulaw_to_linear(uint8_t ulaw) */ static __inline__ uint8_t linear_to_alaw(int linear) { + uint8_t a_val; int mask; int seg; if (linear >= 0) { /* Sign (bit 7) bit = 1 */ - mask = G711_ALAW_AMI_MASK | 0x80; + mask = 0x80 | G711_ALAW_AMI_MASK; } else { @@ -220,16 +221,14 @@ static __inline__ uint8_t linear_to_alaw(int linear) seg = top_bit(linear | 0xFF) - 7; if (seg >= 8) { - if (linear >= 0) - { - /* Out of range. Return maximum value. */ - return (uint8_t) (0x7F ^ mask); - } - /* We must be just a tiny step below zero */ - return (uint8_t) mask; + a_val = (uint8_t) (0x7F ^ mask); } - /* Combine the sign, segment, and quantization bits. */ - return (uint8_t) (((seg << 4) | ((linear >> ((seg) ? (seg + 3) : 4)) & 0x0F)) ^ mask); + else + { + /* Combine the sign, segment, and quantization bits. */ + a_val = (uint8_t) (((seg << 4) | ((linear >> ((seg) ? (seg + 3) : 4)) & 0x0F)) ^ mask); + } + return a_val; } /*- End of function --------------------------------------------------------*/