00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <math.h>
00019 #include "lookup.h"
00020 #include "lookup_data.h"
00021 #include "os.h"
00022 #include "misc.h"
00023
00024 #ifdef FLOAT_LOOKUP
00025
00026
00027 float vorbis_coslook(float a){
00028 double d=a*(.31830989*(float)COS_LOOKUP_SZ);
00029 int i=vorbis_ftoi(d-.5);
00030
00031 return COS_LOOKUP[i]+ (d-i)*(COS_LOOKUP[i+1]-COS_LOOKUP[i]);
00032 }
00033
00034
00035 float vorbis_invsqlook(float a){
00036 double d=a*(2.f*(float)INVSQ_LOOKUP_SZ)-(float)INVSQ_LOOKUP_SZ;
00037 int i=vorbis_ftoi(d-.5f);
00038 return INVSQ_LOOKUP[i]+ (d-i)*(INVSQ_LOOKUP[i+1]-INVSQ_LOOKUP[i]);
00039 }
00040
00041
00042 float vorbis_invsq2explook(int a){
00043 return INVSQ2EXP_LOOKUP[a-INVSQ2EXP_LOOKUP_MIN];
00044 }
00045
00046 #include <stdio.h>
00047
00048 float vorbis_fromdBlook(float a){
00049 int i=vorbis_ftoi(a*((float)(-(1<<FROMdB2_SHIFT)))-.5f);
00050 return (i<0)?1.f:
00051 ((i>=(FROMdB_LOOKUP_SZ<<FROMdB_SHIFT))?0.f:
00052 FROMdB_LOOKUP[i>>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]);
00053 }
00054
00055 #endif
00056
00057 #ifdef INT_LOOKUP
00058
00059
00060
00061
00062 long vorbis_invsqlook_i(long a,long e){
00063 long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1);
00064 long d=(a&INVSQ_LOOKUP_I_MASK)<<(16-INVSQ_LOOKUP_I_SHIFT);
00065 long val=INVSQ_LOOKUP_I[i]-
00066 (((INVSQ_LOOKUP_I[i]-INVSQ_LOOKUP_I[i+1])*
00067 d)>>16);
00068
00069 e+=32;
00070 if(e&1)val=(val*5792)>>13;
00071 e=(e>>1)-8;
00072
00073 return(val>>e);
00074 }
00075
00076
00077
00078 float vorbis_fromdBlook_i(long a){
00079 int i=(-a)>>(12-FROMdB2_SHIFT);
00080 return (i<0)?1.f:
00081 ((i>=(FROMdB_LOOKUP_SZ<<FROMdB_SHIFT))?0.f:
00082 FROMdB_LOOKUP[i>>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]);
00083 }
00084
00085
00086
00087 long vorbis_coslook_i(long a){
00088 int i=a>>COS_LOOKUP_I_SHIFT;
00089 int d=a&COS_LOOKUP_I_MASK;
00090 return COS_LOOKUP_I[i]- ((d*(COS_LOOKUP_I[i]-COS_LOOKUP_I[i+1]))>>
00091 COS_LOOKUP_I_SHIFT);
00092 }
00093
00094 #endif