|
1 /******************************************************************** |
|
2 * * |
|
3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * |
|
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * |
|
5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * |
|
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * |
|
7 * * |
|
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * |
|
9 * by the Xiph.Org Foundation http://www.xiph.org/ * |
|
10 * * |
|
11 ******************************************************************** |
|
12 |
|
13 function: lookup based functions |
|
14 last mod: $Id: lookup.c 16227 2009-07-08 06:58:46Z xiphmont $ |
|
15 |
|
16 ********************************************************************/ |
|
17 |
|
18 #include <math.h> |
|
19 #include "lookup.h" |
|
20 #include "lookup_data.h" |
|
21 #include "os.h" |
|
22 #include "misc.h" |
|
23 |
|
24 #ifdef FLOAT_LOOKUP |
|
25 |
|
26 /* interpolated lookup based cos function, domain 0 to PI only */ |
|
27 float vorbis_coslook(float a){ |
|
28 double d=a*(.31830989*(float)COS_LOOKUP_SZ); |
|
29 int i=vorbis_ftoi(d-.5); |
|
30 |
|
31 return COS_LOOKUP[i]+ (d-i)*(COS_LOOKUP[i+1]-COS_LOOKUP[i]); |
|
32 } |
|
33 |
|
34 /* interpolated 1./sqrt(p) where .5 <= p < 1. */ |
|
35 float vorbis_invsqlook(float a){ |
|
36 double d=a*(2.f*(float)INVSQ_LOOKUP_SZ)-(float)INVSQ_LOOKUP_SZ; |
|
37 int i=vorbis_ftoi(d-.5f); |
|
38 return INVSQ_LOOKUP[i]+ (d-i)*(INVSQ_LOOKUP[i+1]-INVSQ_LOOKUP[i]); |
|
39 } |
|
40 |
|
41 /* interpolated 1./sqrt(p) where .5 <= p < 1. */ |
|
42 float vorbis_invsq2explook(int a){ |
|
43 return INVSQ2EXP_LOOKUP[a-INVSQ2EXP_LOOKUP_MIN]; |
|
44 } |
|
45 |
|
46 #include <stdio.h> |
|
47 /* interpolated lookup based fromdB function, domain -140dB to 0dB only */ |
|
48 float vorbis_fromdBlook(float a){ |
|
49 int i=vorbis_ftoi(a*((float)(-(1<<FROMdB2_SHIFT)))-.5f); |
|
50 return (i<0)?1.f: |
|
51 ((i>=(FROMdB_LOOKUP_SZ<<FROMdB_SHIFT))?0.f: |
|
52 FROMdB_LOOKUP[i>>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); |
|
53 } |
|
54 |
|
55 #endif |
|
56 |
|
57 #ifdef INT_LOOKUP |
|
58 /* interpolated 1./sqrt(p) where .5 <= a < 1. (.100000... to .111111...) in |
|
59 16.16 format |
|
60 |
|
61 returns in m.8 format */ |
|
62 long vorbis_invsqlook_i(long a,long e){ |
|
63 long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1); |
|
64 long d=(a&INVSQ_LOOKUP_I_MASK)<<(16-INVSQ_LOOKUP_I_SHIFT); /* 0.16 */ |
|
65 long val=INVSQ_LOOKUP_I[i]- /* 1.16 */ |
|
66 (((INVSQ_LOOKUP_I[i]-INVSQ_LOOKUP_I[i+1])* /* 0.16 */ |
|
67 d)>>16); /* result 1.16 */ |
|
68 |
|
69 e+=32; |
|
70 if(e&1)val=(val*5792)>>13; /* multiply val by 1/sqrt(2) */ |
|
71 e=(e>>1)-8; |
|
72 |
|
73 return(val>>e); |
|
74 } |
|
75 |
|
76 /* interpolated lookup based fromdB function, domain -140dB to 0dB only */ |
|
77 /* a is in n.12 format */ |
|
78 float vorbis_fromdBlook_i(long a){ |
|
79 int i=(-a)>>(12-FROMdB2_SHIFT); |
|
80 return (i<0)?1.f: |
|
81 ((i>=(FROMdB_LOOKUP_SZ<<FROMdB_SHIFT))?0.f: |
|
82 FROMdB_LOOKUP[i>>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); |
|
83 } |
|
84 |
|
85 /* interpolated lookup based cos function, domain 0 to PI only */ |
|
86 /* a is in 0.16 format, where 0==0, 2^^16-1==PI, return 0.14 */ |
|
87 long vorbis_coslook_i(long a){ |
|
88 int i=a>>COS_LOOKUP_I_SHIFT; |
|
89 int d=a&COS_LOOKUP_I_MASK; |
|
90 return COS_LOOKUP_I[i]- ((d*(COS_LOOKUP_I[i]-COS_LOOKUP_I[i+1]))>> |
|
91 COS_LOOKUP_I_SHIFT); |
|
92 } |
|
93 |
|
94 #endif |