Index: src/mlp.c |
diff --git a/src/mlp.c b/src/mlp.c |
index 463860266747253621f1163d2c73f3b3fd9395d8..ff9e50df4729812c3da9084046bf2ed992983be5 100644 |
--- a/src/mlp.c |
+++ b/src/mlp.c |
@@ -41,77 +41,82 @@ |
#if 0 |
static OPUS_INLINE opus_val16 tansig_approx(opus_val32 _x) /* Q19 */ |
{ |
- int i; |
- opus_val16 xx; /* Q11 */ |
- /*double x, y;*/ |
- opus_val16 dy, yy; /* Q14 */ |
- /*x = 1.9073e-06*_x;*/ |
- if (_x>=QCONST32(8,19)) |
- return QCONST32(1.,14); |
- if (_x<=-QCONST32(8,19)) |
- return -QCONST32(1.,14); |
- xx = EXTRACT16(SHR32(_x, 8)); |
- /*i = lrint(25*x);*/ |
- i = SHR32(ADD32(1024,MULT16_16(25, xx)),11); |
- /*x -= .04*i;*/ |
- xx -= EXTRACT16(SHR32(MULT16_16(20972,i),8)); |
- /*x = xx*(1./2048);*/ |
- /*y = tansig_table[250+i];*/ |
- yy = tansig_table[250+i]; |
- /*y = yy*(1./16384);*/ |
- dy = 16384-MULT16_16_Q14(yy,yy); |
- yy = yy + MULT16_16_Q14(MULT16_16_Q11(xx,dy),(16384 - MULT16_16_Q11(yy,xx))); |
- return yy; |
+ int i; |
+ opus_val16 xx; /* Q11 */ |
+ /*double x, y;*/ |
+ opus_val16 dy, yy; /* Q14 */ |
+ /*x = 1.9073e-06*_x;*/ |
+ if (_x>=QCONST32(8,19)) |
+ return QCONST32(1.,14); |
+ if (_x<=-QCONST32(8,19)) |
+ return -QCONST32(1.,14); |
+ xx = EXTRACT16(SHR32(_x, 8)); |
+ /*i = lrint(25*x);*/ |
+ i = SHR32(ADD32(1024,MULT16_16(25, xx)),11); |
+ /*x -= .04*i;*/ |
+ xx -= EXTRACT16(SHR32(MULT16_16(20972,i),8)); |
+ /*x = xx*(1./2048);*/ |
+ /*y = tansig_table[250+i];*/ |
+ yy = tansig_table[250+i]; |
+ /*y = yy*(1./16384);*/ |
+ dy = 16384-MULT16_16_Q14(yy,yy); |
+ yy = yy + MULT16_16_Q14(MULT16_16_Q11(xx,dy),(16384 - MULT16_16_Q11(yy,xx))); |
+ return yy; |
} |
#else |
/*extern const float tansig_table[501];*/ |
static OPUS_INLINE float tansig_approx(float x) |
{ |
- int i; |
- float y, dy; |
- float sign=1; |
- /* Tests are reversed to catch NaNs */ |
+ int i; |
+ float y, dy; |
+ float sign=1; |
+ /* Tests are reversed to catch NaNs */ |
if (!(x<8)) |
return 1; |
if (!(x>-8)) |
return -1; |
- if (x<0) |
- { |
- x=-x; |
- sign=-1; |
- } |
- i = (int)floor(.5f+25*x); |
- x -= .04f*i; |
- y = tansig_table[i]; |
- dy = 1-y*y; |
- y = y + x*dy*(1 - y*x); |
- return sign*y; |
+#ifndef FIXED_POINT |
+ /* Another check in case of -ffast-math */ |
+ if (celt_isnan(x)) |
+ return 0; |
+#endif |
+ if (x<0) |
+ { |
+ x=-x; |
+ sign=-1; |
+ } |
+ i = (int)floor(.5f+25*x); |
+ x -= .04f*i; |
+ y = tansig_table[i]; |
+ dy = 1-y*y; |
+ y = y + x*dy*(1 - y*x); |
+ return sign*y; |
} |
#endif |
#if 0 |
void mlp_process(const MLP *m, const opus_val16 *in, opus_val16 *out) |
{ |
- int j; |
- opus_val16 hidden[MAX_NEURONS]; |
- const opus_val16 *W = m->weights; |
- /* Copy to tmp_in */ |
- for (j=0;j<m->topo[1];j++) |
- { |
- int k; |
- opus_val32 sum = SHL32(EXTEND32(*W++),8); |
- for (k=0;k<m->topo[0];k++) |
- sum = MAC16_16(sum, in[k],*W++); |
- hidden[j] = tansig_approx(sum); |
- } |
- for (j=0;j<m->topo[2];j++) |
- { |
- int k; |
- opus_val32 sum = SHL32(EXTEND32(*W++),14); |
- for (k=0;k<m->topo[1];k++) |
- sum = MAC16_16(sum, hidden[k], *W++); |
- out[j] = tansig_approx(EXTRACT16(PSHR32(sum,17))); |
- } |
+ int j; |
+ opus_val16 hidden[MAX_NEURONS]; |
+ const opus_val16 *W = m->weights; |
+ /* Copy to tmp_in */ |
+ for (j=0;j<m->topo[1];j++) |
+ { |
+ int k; |
+ opus_val32 sum = SHL32(EXTEND32(*W++),8); |
+ for (k=0;k<m->topo[0];k++) |
+ sum = MAC16_16(sum, in[k],*W++); |
+ hidden[j] = tansig_approx(sum); |
+ } |
+ for (j=0;j<m->topo[2];j++) |
+ { |
+ int k; |
+ opus_val32 sum = SHL32(EXTEND32(*W++),14); |
+ for (k=0;k<m->topo[1];k++) |
+ sum = MAC16_16(sum, hidden[k], *W++); |
+ out[j] = tansig_approx(EXTRACT16(PSHR32(sum,17))); |
+ } |
} |
#else |
void mlp_process(const MLP *m, const float *in, float *out) |