1*a58d3d2aSXin Li 2*a58d3d2aSXin Li 3*a58d3d2aSXin Li #ifndef COMMON_H 4*a58d3d2aSXin Li #define COMMON_H 5*a58d3d2aSXin Li 6*a58d3d2aSXin Li #include <stdlib.h> 7*a58d3d2aSXin Li #include <string.h> 8*a58d3d2aSXin Li #include <math.h> 9*a58d3d2aSXin Li #include "opus_defines.h" 10*a58d3d2aSXin Li 11*a58d3d2aSXin Li #define LOG256 5.5451774445f log2_approx(float x)12*a58d3d2aSXin Listatic OPUS_INLINE float log2_approx(float x) 13*a58d3d2aSXin Li { 14*a58d3d2aSXin Li int integer; 15*a58d3d2aSXin Li float frac; 16*a58d3d2aSXin Li union { 17*a58d3d2aSXin Li float f; 18*a58d3d2aSXin Li int i; 19*a58d3d2aSXin Li } in; 20*a58d3d2aSXin Li in.f = x; 21*a58d3d2aSXin Li integer = (in.i>>23)-127; 22*a58d3d2aSXin Li in.i -= integer<<23; 23*a58d3d2aSXin Li frac = in.f - 1.5f; 24*a58d3d2aSXin Li frac = -0.41445418f + frac*(0.95909232f 25*a58d3d2aSXin Li + frac*(-0.33951290f + frac*0.16541097f)); 26*a58d3d2aSXin Li return 1+integer+frac; 27*a58d3d2aSXin Li } 28*a58d3d2aSXin Li 29*a58d3d2aSXin Li #define log_approx(x) (0.69315f*log2_approx(x)) 30*a58d3d2aSXin Li ulaw2lin(float u)31*a58d3d2aSXin Listatic OPUS_INLINE float ulaw2lin(float u) 32*a58d3d2aSXin Li { 33*a58d3d2aSXin Li float s; 34*a58d3d2aSXin Li float scale_1 = 32768.f/255.f; 35*a58d3d2aSXin Li u = u - 128.f; 36*a58d3d2aSXin Li s = u >= 0.f ? 1.f : -1.f; 37*a58d3d2aSXin Li u = fabs(u); 38*a58d3d2aSXin Li return s*scale_1*(exp(u/128.*LOG256)-1); 39*a58d3d2aSXin Li } 40*a58d3d2aSXin Li lin2ulaw(float x)41*a58d3d2aSXin Listatic OPUS_INLINE int lin2ulaw(float x) 42*a58d3d2aSXin Li { 43*a58d3d2aSXin Li float u; 44*a58d3d2aSXin Li float scale = 255.f/32768.f; 45*a58d3d2aSXin Li int s = x >= 0 ? 1 : -1; 46*a58d3d2aSXin Li x = fabs(x); 47*a58d3d2aSXin Li u = (s*(128*log_approx(1+scale*x)/LOG256)); 48*a58d3d2aSXin Li u = 128 + u; 49*a58d3d2aSXin Li if (u < 0) u = 0; 50*a58d3d2aSXin Li if (u > 255) u = 255; 51*a58d3d2aSXin Li return (int)floor(.5 + u); 52*a58d3d2aSXin Li } 53*a58d3d2aSXin Li 54*a58d3d2aSXin Li 55*a58d3d2aSXin Li 56*a58d3d2aSXin Li #endif 57