001/* JOrbis 002 * Copyright (C) 2000 ymnk, JCraft,Inc. 003 * 004 * Written by: 2000 ymnk<ymnk@jcaft.com> 005 * 006 * Many thanks to 007 * Monty <monty@xiph.org> and 008 * The XIPHOPHORUS Company http://www.xiph.org/ . 009 * JOrbis has been based on their awesome works, Vorbis codec. 010 * 011 * This program is free software; you can redistribute it and/or 012 * modify it under the terms of the GNU Library General Public License 013 * as published by the Free Software Foundation; either version 2 of 014 * the License, or (at your option) any later version. 015 016 * This program is distributed in the hope that it will be useful, 017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 019 * GNU Library General Public License for more details. 020 * 021 * You should have received a copy of the GNU Library General Public 022 * License along with this program; if not, write to the Free Software 023 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 024 */ 025 026package com.jcraft.jorbis; 027 028class Lookup{ 029 static final int COS_LOOKUP_SZ=128; 030 static final float[] COS_LOOKUP={ 031 +1.0000000000000f,+0.9996988186962f,+0.9987954562052f,+0.9972904566787f, 032 +0.9951847266722f,+0.9924795345987f,+0.9891765099648f,+0.9852776423889f, 033 +0.9807852804032f,+0.9757021300385f,+0.9700312531945f,+0.9637760657954f, 034 +0.9569403357322f,+0.9495281805930f,+0.9415440651830f,+0.9329927988347f, 035 +0.9238795325113f,+0.9142097557035f,+0.9039892931234f,+0.8932243011955f, 036 +0.8819212643484f,+0.8700869911087f,+0.8577286100003f,+0.8448535652497f, 037 +0.8314696123025f,+0.8175848131516f,+0.8032075314806f,+0.7883464276266f, 038 +0.7730104533627f,+0.7572088465065f,+0.7409511253550f,+0.7242470829515f, 039 +0.7071067811865f,+0.6895405447371f,+0.6715589548470f,+0.6531728429538f, 040 +0.6343932841636f,+0.6152315905806f,+0.5956993044924f,+0.5758081914178f, 041 +0.5555702330196f,+0.5349976198871f,+0.5141027441932f,+0.4928981922298f, 042 +0.4713967368260f,+0.4496113296546f,+0.4275550934303f,+0.4052413140050f, 043 +0.3826834323651f,+0.3598950365350f,+0.3368898533922f,+0.3136817403989f, 044 +0.2902846772545f,+0.2667127574749f,+0.2429801799033f,+0.2191012401569f, 045 +0.1950903220161f,+0.1709618887603f,+0.1467304744554f,+0.1224106751992f, 046 +0.0980171403296f,+0.0735645635997f,+0.0490676743274f,+0.0245412285229f, 047 +0.0000000000000f,-0.0245412285229f,-0.0490676743274f,-0.0735645635997f, 048 -0.0980171403296f,-0.1224106751992f,-0.1467304744554f,-0.1709618887603f, 049 -0.1950903220161f,-0.2191012401569f,-0.2429801799033f,-0.2667127574749f, 050 -0.2902846772545f,-0.3136817403989f,-0.3368898533922f,-0.3598950365350f, 051 -0.3826834323651f,-0.4052413140050f,-0.4275550934303f,-0.4496113296546f, 052 -0.4713967368260f,-0.4928981922298f,-0.5141027441932f,-0.5349976198871f, 053 -0.5555702330196f,-0.5758081914178f,-0.5956993044924f,-0.6152315905806f, 054 -0.6343932841636f,-0.6531728429538f,-0.6715589548470f,-0.6895405447371f, 055 -0.7071067811865f,-0.7242470829515f,-0.7409511253550f,-0.7572088465065f, 056 -0.7730104533627f,-0.7883464276266f,-0.8032075314806f,-0.8175848131516f, 057 -0.8314696123025f,-0.8448535652497f,-0.8577286100003f,-0.8700869911087f, 058 -0.8819212643484f,-0.8932243011955f,-0.9039892931234f,-0.9142097557035f, 059 -0.9238795325113f,-0.9329927988347f,-0.9415440651830f,-0.9495281805930f, 060 -0.9569403357322f,-0.9637760657954f,-0.9700312531945f,-0.9757021300385f, 061 -0.9807852804032f,-0.9852776423889f,-0.9891765099648f,-0.9924795345987f, 062 -0.9951847266722f,-0.9972904566787f,-0.9987954562052f,-0.9996988186962f, 063 -1.0000000000000f, 064 }; 065 /* interpolated lookup based cos function, domain 0 to PI only */ 066 static float coslook(float a){ 067 double d=a*(.31830989*(float)COS_LOOKUP_SZ); 068 int i=(int)d; 069 return COS_LOOKUP[i]+ ((float)(d-i))*(COS_LOOKUP[i+1]-COS_LOOKUP[i]); 070 } 071 072 static final int INVSQ_LOOKUP_SZ=32; 073 static final float[] INVSQ_LOOKUP={ 074 1.414213562373f,1.392621247646f,1.371988681140f,1.352246807566f, 075 1.333333333333f,1.315191898443f,1.297771369046f,1.281025230441f, 076 1.264911064067f,1.249390095109f,1.234426799697f,1.219988562661f, 077 1.206045378311f,1.192569588000f,1.179535649239f,1.166919931983f, 078 1.154700538379f,1.142857142857f,1.131370849898f,1.120224067222f, 079 1.109400392450f,1.098884511590f,1.088662107904f,1.078719779941f, 080 1.069044967650f,1.059625885652f,1.050451462878f,1.041511287847f, 081 1.032795558989f,1.024295039463f,1.016001016002f,1.007905261358f, 082 1.000000000000f, 083 }; 084 /* interpolated 1./sqrt(p) where .5 <= p < 1. */ 085 static float invsqlook(float a){ 086// System.out.println(a); 087 double d=a*(2.f*(float)INVSQ_LOOKUP_SZ)-(float)INVSQ_LOOKUP_SZ; 088 int i=(int)d; 089 return INVSQ_LOOKUP[i]+ ((float)(d-i))*(INVSQ_LOOKUP[i+1]-INVSQ_LOOKUP[i]); 090 } 091 092 static final int INVSQ2EXP_LOOKUP_MIN=-32; 093 static final int INVSQ2EXP_LOOKUP_MAX=32; 094 static final float[] INVSQ2EXP_LOOKUP={ 095 65536.f, 46340.95001f, 32768.f, 23170.47501f, 096 16384.f, 11585.2375f, 8192.f, 5792.618751f, 097 4096.f, 2896.309376f, 2048.f, 1448.154688f, 098 1024.f, 724.0773439f, 512.f, 362.038672f, 099 256.f, 181.019336f, 128.f, 90.50966799f, 100 64.f, 45.254834f, 32.f, 22.627417f, 101 16.f, 11.3137085f, 8.f, 5.656854249f, 102 4.f, 2.828427125f, 2.f, 1.414213562f, 103 1.f, 0.7071067812f, 0.5f, 0.3535533906f, 104 0.25f, 0.1767766953f, 0.125f, 0.08838834765f, 105 0.0625f, 0.04419417382f, 0.03125f, 0.02209708691f, 106 0.015625f, 0.01104854346f, 0.0078125f, 0.005524271728f, 107 0.00390625f, 0.002762135864f, 0.001953125f, 0.001381067932f, 108 0.0009765625f, 0.000690533966f, 0.00048828125f, 0.000345266983f, 109 0.000244140625f,0.0001726334915f,0.0001220703125f,8.631674575e-05f, 110 6.103515625e-05f,4.315837288e-05f,3.051757812e-05f,2.157918644e-05f, 111 1.525878906e-05f, 112 }; 113 /* interpolated 1./sqrt(p) where .5 <= p < 1. */ 114 static float invsq2explook(int a){ 115 return INVSQ2EXP_LOOKUP[a-INVSQ2EXP_LOOKUP_MIN]; 116 } 117 118 static final int FROMdB_LOOKUP_SZ=35; 119 static final int FROMdB2_LOOKUP_SZ=32; 120 static final int FROMdB_SHIFT=5; 121 static final int FROMdB2_SHIFT=3; 122 static final int FROMdB2_MASK=31; 123 static final float[] FROMdB_LOOKUP={ 124 1.f, 0.6309573445f, 0.3981071706f, 0.2511886432f, 125 0.1584893192f, 0.1f, 0.06309573445f, 0.03981071706f, 126 0.02511886432f, 0.01584893192f, 0.01f, 0.006309573445f, 127 0.003981071706f, 0.002511886432f, 0.001584893192f, 0.001f, 128 0.0006309573445f,0.0003981071706f,0.0002511886432f,0.0001584893192f, 129 0.0001f,6.309573445e-05f,3.981071706e-05f,2.511886432e-05f, 130 1.584893192e-05f, 1e-05f,6.309573445e-06f,3.981071706e-06f, 131 2.511886432e-06f,1.584893192e-06f, 1e-06f,6.309573445e-07f, 132 3.981071706e-07f,2.511886432e-07f,1.584893192e-07f, 133 }; 134 static final float[] FROMdB2_LOOKUP={ 135 0.9928302478f, 0.9786445908f, 0.9646616199f, 0.9508784391f, 136 0.9372921937f, 0.92390007f, 0.9106992942f, 0.8976871324f, 137 0.8848608897f, 0.8722179097f, 0.8597555737f, 0.8474713009f, 138 0.835362547f, 0.8234268041f, 0.8116616003f, 0.8000644989f, 139 0.7886330981f, 0.7773650302f, 0.7662579617f, 0.755309592f, 140 0.7445176537f, 0.7338799116f, 0.7233941627f, 0.7130582353f, 141 0.7028699885f, 0.6928273125f, 0.6829281272f, 0.6731703824f, 142 0.6635520573f, 0.6540711597f, 0.6447257262f, 0.6355138211f, 143 }; 144 /* interpolated lookup based fromdB function, domain -140dB to 0dB only */ 145 static float fromdBlook(float a){ 146 int i=(int)(a*((float)(-(1<<FROMdB2_SHIFT)))); 147 return (i<0)?1.f: 148 ((i>=(FROMdB_LOOKUP_SZ<<FROMdB_SHIFT))?0.f: 149 FROMdB_LOOKUP[i>>>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); 150 } 151 152} 153 154