Avoids symbol clashes with Speex (pitch_xcorr) and libm (y1)
[opus.git] / src / mlp.c
index 200f1cb..90e94a5 100644 (file)
--- a/src/mlp.c
+++ b/src/mlp.c
@@ -25,6 +25,9 @@
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
 
 #include <math.h>
 #include "mlp.h"
@@ -33,7 +36,6 @@
 #define MAX_NEURONS 100
 
 #ifdef FIXED_POINT
-extern const opus_val16 tansig_table[501];
 static inline opus_val16 tansig_approx(opus_val32 _x) /* Q19 */
 {
        int i;
@@ -60,20 +62,26 @@ static inline opus_val16 tansig_approx(opus_val32 _x) /* Q19 */
 }
 #else
 /*extern const float tansig_table[501];*/
-static inline double tansig_approx(double x)
+static inline opus_val16 tansig_approx(opus_val16 x)
 {
        int i;
-       double y, dy;
-       if (x>=10)
-               return 1;
-       if (x<=-10)
-               return -1;
-       i = lrint(25*x);
-       x -= .04*i;
-       y = tansig_table[250+i];
+       opus_val16 y, dy;
+       opus_val16 sign=1;
+    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 y;
+       return sign*y;
 }
 #endif