diff options
Diffstat (limited to 'lib/fixedpoint')
| -rw-r--r-- | lib/fixedpoint/fixedpoint.c | 29 | ||||
| -rw-r--r-- | lib/fixedpoint/fixedpoint.h | 2 | ||||
| -rw-r--r-- | lib/fixedpoint/fixedpoint.make | 3 |
3 files changed, 31 insertions, 3 deletions
diff --git a/lib/fixedpoint/fixedpoint.c b/lib/fixedpoint/fixedpoint.c index 645419d..d1307bb 100644 --- a/lib/fixedpoint/fixedpoint.c +++ b/lib/fixedpoint/fixedpoint.c @@ -211,6 +211,35 @@ long fp_sqrt(long x, unsigned int fracbits) return g; } +/* raise an integer to an integer power */ +long ipow(long x, long y) +{ + /* y[k] = bit k of y, 0 or 1; k=0...n; n=|_ lg(y) _| + * + * x^y = x^(y[0]*2^0 + y[1]*2^1 + ... + y[n]*2^n) + * = x^(y[0]*2^0) * x^(y[1]*2^1) * ... * x^(y[n]*2^n) + */ + long a = 1; + + if (y < 0 && x != -1) + { + a = 0; /* would be < 1 or +inf if x == 0 */ + } + else + { + while (y) + { + if (y & 1) + a *= x; + + y /= 2; + x *= x; + } + } + + return a; +} + /** * Fixed point sinus using a lookup table * don't forget to divide the result by 16384 to get the actual sinus value diff --git a/lib/fixedpoint/fixedpoint.h b/lib/fixedpoint/fixedpoint.h index bc50ff6..dcd7c82 100644 --- a/lib/fixedpoint/fixedpoint.h +++ b/lib/fixedpoint/fixedpoint.h @@ -85,6 +85,8 @@ long fp14_sin(int val); long fp16_log(int x); long fp16_exp(int x); +long ipow(long x, long y); + /* fast unsigned multiplication (16x16bit->32bit or 32x32bit->32bit, * whichever is faster for the architecture) */ #ifdef CPU_ARM diff --git a/lib/fixedpoint/fixedpoint.make b/lib/fixedpoint/fixedpoint.make index 0233e94..5be0e38 100644 --- a/lib/fixedpoint/fixedpoint.make +++ b/lib/fixedpoint/fixedpoint.make @@ -13,11 +13,8 @@ FIXEDPOINTLIB_OBJ := $(call c2obj, $(FIXEDPOINTLIB_SRC)) INCLUDES += -I$(FIXEDPOINTLIB_DIR) OTHER_SRC += $(FIXEDPOINTLIB_SRC) -# If not SOFTWARECODECS, then only plugins depend upon us -ifdef SOFTWARECODECS CORE_LIBS += $(FIXEDPOINTLIB) CORE_GCSECTIONS := yes -endif FIXEDPOINTLIB_FLAGS := $(CFLAGS) $(SHARED_CFLAGS) |