From 5f48e1590f16049aaaf916ad72d6016a4e7ffa5c Mon Sep 17 00:00:00 2001 From: Thom Johansen Date: Mon, 5 Feb 2007 01:01:15 +0000 Subject: Optimise EQ coef calculation routines for both speed and size. Move now unneeded fsqrt function to plugin fixed point library in case it'll be needed. Move all fixed point helper macros to dsp.h. Added FRACMUL_SHL macro to facilitate high-precision shifting of 64 bit multiplies and remove rounding from macsr in main thread to make this work as intended. Tested quite thorougly, but as always, be careful with your ears. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12203 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/lib/fixedpoint.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'apps/plugins/lib/fixedpoint.c') diff --git a/apps/plugins/lib/fixedpoint.c b/apps/plugins/lib/fixedpoint.c index 914bc8c..9c34c2a 100644 --- a/apps/plugins/lib/fixedpoint.c +++ b/apps/plugins/lib/fixedpoint.c @@ -117,3 +117,22 @@ long fsincos(unsigned long phase, long *cos) return y; } + +/** + * Fixed point square root via Newton-Raphson. + * @param a square root argument. + * @param fracbits specifies number of fractional bits in argument. + * @return Square root of argument in same fixed point format as input. + */ +long fsqrt(long a, unsigned int fracbits) +{ + long b = a/2 + (1 << fracbits); /* initial approximation */ + unsigned n; + const unsigned iterations = 4; + + for (n = 0; n < iterations; ++n) + b = (b + DIV64(a, b, fracbits))/2; + + return b; +} + -- cgit v1.1