From 4a11447fbab4e00cfd207829a1e4d47c97f728db Mon Sep 17 00:00:00 2001 From: erdgeist Date: Mon, 6 Oct 2014 23:01:40 +0200 Subject: Replace rest of hex constants with Q26 macros, also replace algorithm for arguments of fixexp with negative parameter with a more aggressive one --- fixpow.c | 90 ++++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/fixpow.c b/fixpow.c index cb687b4..3dc4815 100644 --- a/fixpow.c +++ b/fixpow.c @@ -150,52 +150,52 @@ static uint32_t fixexp(int32_t x) { t=x-TO_Q26(0.000122062862526); if(t>=0) x=t,y+=y>>13; /* log(1+1/8192) */ /* from here the values in Q26 become approx 2^n, so lets check bits and fix the residual error below */ - if(x&0x0001000) y+=y>>14; - if(x&0x0000800) y+=y>>15; - if(x&0x0000400) y+=y>>16; - if(x&0x0000200) y+=y>>17; - if(x&0x0000100) y+=y>>18; - if(x&0x0000080) y+=y>>19; - if(x&0x0000040) y+=y>>20; - if(x&0x0000020) y+=y>>21; - if(x&0x0000010) y+=y>>22; - if(x&0x0000008) y+=y>>23; - if(x&0x0000004) y+=y>>24; - if(x&0x0000002) y+=y>>25; - if(x&0x0000001) y+=y>>26; + if(x&0x0001000) y+=y>>14; + if(x&0x0000800) y+=y>>15; + if(x&0x0000400) y+=y>>16; + if(x&0x0000200) y+=y>>17; + if(x&0x0000100) y+=y>>18; + if(x&0x0000080) y+=y>>19; + if(x&0x0000040) y+=y>>20; + if(x&0x0000020) y+=y>>21; + if(x&0x0000010) y+=y>>22; + if(x&0x0000008) y+=y>>23; + if(x&0x0000004) y+=y>>24; + if(x&0x0000002) y+=y>>25; + if(x&0x0000001) y+=y>>26; } else { x=-x; - t=x-0x162E42FE; if(t>=0) x=t,y>>=8; - t=x-0x0B17217F; if(t>=0) x=t,y>>=4; - t=x-0x058B90BF; if(t>=0) x=t,y>>=2; - t=x-0x02C5C85F; if(t>=0) x=t,y>>=1; - t=x-0x017FAFA3; if(t>=0) x=t,y-=(y>>2) + (y>>4); - t=x-0x00D49F69; if(t>=0) x=t,y-=(y>>2) - (y>>4); - t=x-0x00769C9D; if(t>=0) x=t,y-=(y>>3) - (y>>6); - t=x-0x003DD463; if(t>=0) x=t,y-=(y>>4) - (y>>8); - t=x-0x002082BB; if(t>=0) x=t,y-=y>>5; - t=x-0x0010615C; if(t>=0) x=t,y-=(y>>6) + (y>>12); - t=x-0x0008488D; if(t>=0) x=t,y-=(y>>7) + (y>>12); - t=x-0x00044243; if(t>=0) x=t,y-=(y>>8) + (y>>12); - t=x-0x00038188; if(t>=0) x=t,y-=(y>>8) - (y>>11); - t=x-0x0001E070; if(t>=0) x=t,y-=(y>>9) - (y>>13); - t=x-0x0000FC1F; if(t>=0) x=t,y-=(y>>10)- (y>>16); - t=x-0x00007F07; if(t>=0) x=t,y-=(y>>11)- (y>>18); - t=x-0x00003FC1; if(t>=0) x=t,y-=(y>>12)- (y>>20); - if(x&0x0002000) y-=y>>13; - if(x&0x0001000) y-=y>>14; - if(x&0x0000800) y-=y>>15; - if(x&0x0000400) y-=y>>16; - if(x&0x0000200) y-=y>>17; - if(x&0x0000100) y-=y>>18; - if(x&0x0000080) y-=y>>19; - if(x&0x0000040) y-=y>>20; - if(x&0x0000020) y-=y>>21; - if(x&0x0000010) y-=y>>22; - if(x&0x0000008) y-=y>>23; - if(x&0x0000004) y-=y>>24; - if(x&0x0000002) y-=y>>25; - if(x&0x0000001) y-=y>>26; + t=x-TO_Q26(5.545177444479562); if(t>=0) x=t,y>>=8; + t=x-TO_Q26(2.772588722239781); if(t>=0) x=t,y>>=4; + t=x-TO_Q26(1.386294361119891); if(t>=0) x=t,y>>=2; + t=x-TO_Q26(0.693147180559945); if(t>=0) x=t,y>>=1; + t=x-TO_Q26(0.374693449441411); if(t>=0) x=t,y-=(y>>4) + (y>>2); + t=x-TO_Q26(0.207639364778244); if(t>=0) x=t,y-=(y>>2) - (y>>4); + t=x-TO_Q26(0.124642445207276); if(t>=0) x=t,y-=(y>>3) - (y>>7); + t=x-TO_Q26(0.062457354933746); if(t>=0) x=t,y-=(y>>4) - (y>>9); + t=x-TO_Q26(0.031244793038107); if(t>=0) x=t,y-=(y>>5) - (x>>11); + t=x-TO_Q26(0.015748356968139); if(t>=0) x=t,y-=(y>>6); + t=x-TO_Q26(0.007966216526084); if(t>=0) x=t,y-=(y>>7) + (y>>13); + t=x-TO_Q26(0.004036455850488); if(t>=0) x=t,y-=(y>>8) + (y>>13); + t=x-TO_Q26(0.002077351513834); if(t>=0) x=t,y-=(y>>9) + (y>>13); + t=x-TO_Q26(0.001099236751907); if(t>=0) x=t,y-=(y>>10)+ (y>>13); + t=x-TO_Q26(0.000610537902840); if(t>=0) x=t,y-=(y>>11)+ (y>>13); + t=x-TO_Q26(0.000366278009100); if(t>=0) x=t,y-=(y>>12)+ (y>>13); + t=x-TO_Q26(0.000213645867528); if(t>=0) x=t,y-=(y>>12)- (y>>15); + if(x&0x0002000) y-=y>>13; + if(x&0x0001000) y-=y>>14; + if(x&0x0000800) y-=y>>15; + if(x&0x0000400) y-=y>>16; + if(x&0x0000200) y-=y>>17; + if(x&0x0000100) y-=y>>18; + if(x&0x0000080) y-=y>>19; + if(x&0x0000040) y-=y>>20; + if(x&0x0000020) y-=y>>21; + if(x&0x0000010) y-=y>>22; + if(x&0x0000008) y-=y>>23; + if(x&0x0000004) y-=y>>24; + if(x&0x0000002) y-=y>>25; + if(x&0x0000001) y-=y>>26; } return y; @@ -229,7 +229,7 @@ int fixpow(int32_t *pow, int32_t base, int32_t exponent ) #endif /* In Q16, fixexp overflows for values > 10,39720770839918 */ - if( log_base_times_exponent > TO_Q26(10,39720770839918) ) + if( log_base_times_exponent > TO_Q26(10.39720770839918) ) return -2; res = (int32_t)log_base_times_exponent; -- cgit v1.2.3