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-2007 * |
---|
9 | * by the Xiph.Org Foundation http://www.xiph.org/ * |
---|
10 | * * |
---|
11 | ******************************************************************** |
---|
12 | |
---|
13 | function: lookup based functions |
---|
14 | last mod: $Id: lookup.c 13293 2007-07-24 00:09:47Z 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 |
---|