xref: /aosp_15_r20/external/libopus/dnn/common.h (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
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 Li static 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 Li static 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 Li static 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