vrshoot
diff libs/vorbis/lookup.c @ 0:b2f14e535253
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 01 Feb 2014 19:58:19 +0200 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libs/vorbis/lookup.c Sat Feb 01 19:58:19 2014 +0200 1.3 @@ -0,0 +1,94 @@ 1.4 +/******************************************************************** 1.5 + * * 1.6 + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * 1.7 + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 1.8 + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 1.9 + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 1.10 + * * 1.11 + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * 1.12 + * by the Xiph.Org Foundation http://www.xiph.org/ * 1.13 + * * 1.14 + ******************************************************************** 1.15 + 1.16 + function: lookup based functions 1.17 + last mod: $Id: lookup.c 16227 2009-07-08 06:58:46Z xiphmont $ 1.18 + 1.19 + ********************************************************************/ 1.20 + 1.21 +#include <math.h> 1.22 +#include "lookup.h" 1.23 +#include "lookup_data.h" 1.24 +#include "os.h" 1.25 +#include "misc.h" 1.26 + 1.27 +#ifdef FLOAT_LOOKUP 1.28 + 1.29 +/* interpolated lookup based cos function, domain 0 to PI only */ 1.30 +float vorbis_coslook(float a){ 1.31 + double d=a*(.31830989*(float)COS_LOOKUP_SZ); 1.32 + int i=vorbis_ftoi(d-.5); 1.33 + 1.34 + return COS_LOOKUP[i]+ (d-i)*(COS_LOOKUP[i+1]-COS_LOOKUP[i]); 1.35 +} 1.36 + 1.37 +/* interpolated 1./sqrt(p) where .5 <= p < 1. */ 1.38 +float vorbis_invsqlook(float a){ 1.39 + double d=a*(2.f*(float)INVSQ_LOOKUP_SZ)-(float)INVSQ_LOOKUP_SZ; 1.40 + int i=vorbis_ftoi(d-.5f); 1.41 + return INVSQ_LOOKUP[i]+ (d-i)*(INVSQ_LOOKUP[i+1]-INVSQ_LOOKUP[i]); 1.42 +} 1.43 + 1.44 +/* interpolated 1./sqrt(p) where .5 <= p < 1. */ 1.45 +float vorbis_invsq2explook(int a){ 1.46 + return INVSQ2EXP_LOOKUP[a-INVSQ2EXP_LOOKUP_MIN]; 1.47 +} 1.48 + 1.49 +#include <stdio.h> 1.50 +/* interpolated lookup based fromdB function, domain -140dB to 0dB only */ 1.51 +float vorbis_fromdBlook(float a){ 1.52 + int i=vorbis_ftoi(a*((float)(-(1<<FROMdB2_SHIFT)))-.5f); 1.53 + return (i<0)?1.f: 1.54 + ((i>=(FROMdB_LOOKUP_SZ<<FROMdB_SHIFT))?0.f: 1.55 + FROMdB_LOOKUP[i>>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); 1.56 +} 1.57 + 1.58 +#endif 1.59 + 1.60 +#ifdef INT_LOOKUP 1.61 +/* interpolated 1./sqrt(p) where .5 <= a < 1. (.100000... to .111111...) in 1.62 + 16.16 format 1.63 + 1.64 + returns in m.8 format */ 1.65 +long vorbis_invsqlook_i(long a,long e){ 1.66 + long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1); 1.67 + long d=(a&INVSQ_LOOKUP_I_MASK)<<(16-INVSQ_LOOKUP_I_SHIFT); /* 0.16 */ 1.68 + long val=INVSQ_LOOKUP_I[i]- /* 1.16 */ 1.69 + (((INVSQ_LOOKUP_I[i]-INVSQ_LOOKUP_I[i+1])* /* 0.16 */ 1.70 + d)>>16); /* result 1.16 */ 1.71 + 1.72 + e+=32; 1.73 + if(e&1)val=(val*5792)>>13; /* multiply val by 1/sqrt(2) */ 1.74 + e=(e>>1)-8; 1.75 + 1.76 + return(val>>e); 1.77 +} 1.78 + 1.79 +/* interpolated lookup based fromdB function, domain -140dB to 0dB only */ 1.80 +/* a is in n.12 format */ 1.81 +float vorbis_fromdBlook_i(long a){ 1.82 + int i=(-a)>>(12-FROMdB2_SHIFT); 1.83 + return (i<0)?1.f: 1.84 + ((i>=(FROMdB_LOOKUP_SZ<<FROMdB_SHIFT))?0.f: 1.85 + FROMdB_LOOKUP[i>>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); 1.86 +} 1.87 + 1.88 +/* interpolated lookup based cos function, domain 0 to PI only */ 1.89 +/* a is in 0.16 format, where 0==0, 2^^16-1==PI, return 0.14 */ 1.90 +long vorbis_coslook_i(long a){ 1.91 + int i=a>>COS_LOOKUP_I_SHIFT; 1.92 + int d=a&COS_LOOKUP_I_MASK; 1.93 + return COS_LOOKUP_I[i]- ((d*(COS_LOOKUP_I[i]-COS_LOOKUP_I[i+1]))>> 1.94 + COS_LOOKUP_I_SHIFT); 1.95 +} 1.96 + 1.97 +#endif