Numerous vorbisfile fixes:
[platform/upstream/libvorbis.git] / lib / scales.h
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-2001             *
9  * by the XIPHOPHORUS Company http://www.xiph.org/                  *
10  *                                                                  *
11  ********************************************************************
12
13  function: linear scale -> dB, Bark and Mel scales
14  last mod: $Id: scales.h,v 1.20 2002/03/07 03:41:03 xiphmont Exp $
15
16  ********************************************************************/
17
18 #ifndef _V_SCALES_H_
19 #define _V_SCALES_H_
20
21 #include <math.h>
22 #include "os.h"
23
24 /* 20log10(x) */
25 #ifdef VORBIS_IEEE_FLOAT32
26 static float unitnorm(float x){
27   ogg_uint32_t *ix=(ogg_uint32_t *)&x;
28   *ix=(*ix&0x80000000UL)|(0x3f800000UL);
29   return(x);
30 }
31
32 static float todB_LOOKUP[256]={
33         -140.277330f, -139.633636f, -139.034372f, -138.473797f, 
34         -137.450747f, -136.535597f, -135.707743f, -134.951972f, 
35         -134.256730f, -133.613036f, -133.013772f, -132.453198f, 
36         -131.430147f, -130.514997f, -129.687144f, -128.931372f, 
37         -128.236130f, -127.592437f, -126.993172f, -126.432598f, 
38         -125.409547f, -124.494397f, -123.666544f, -122.910772f, 
39         -122.215530f, -121.571837f, -120.972572f, -120.411998f, 
40         -119.388947f, -118.473797f, -117.645944f, -116.890173f, 
41         -116.194930f, -115.551237f, -114.951972f, -114.391398f, 
42         -113.368347f, -112.453198f, -111.625344f, -110.869573f, 
43         -110.174331f, -109.530637f, -108.931372f, -108.370798f, 
44         -107.347748f, -106.432598f, -105.604744f, -104.848973f, 
45         -104.153731f, -103.510037f, -102.910773f, -102.350198f, 
46         -101.327148f, -100.411998f,  -99.584144f,  -98.828373f, 
47          -98.133131f,  -97.489437f,  -96.890173f,  -96.329598f, 
48          -95.306548f,  -94.391398f,  -93.563544f,  -92.807773f, 
49          -92.112531f,  -91.468837f,  -90.869573f,  -90.308998f, 
50          -89.285948f,  -88.370798f,  -87.542944f,  -86.787173f, 
51          -86.091931f,  -85.448237f,  -84.848973f,  -84.288398f, 
52          -83.265348f,  -82.350198f,  -81.522344f,  -80.766573f, 
53          -80.071331f,  -79.427637f,  -78.828373f,  -78.267799f, 
54          -77.244748f,  -76.329598f,  -75.501745f,  -74.745973f, 
55          -74.050731f,  -73.407038f,  -72.807773f,  -72.247199f, 
56          -71.224148f,  -70.308998f,  -69.481145f,  -68.725373f, 
57          -68.030131f,  -67.386438f,  -66.787173f,  -66.226599f, 
58          -65.203548f,  -64.288399f,  -63.460545f,  -62.704774f, 
59          -62.009531f,  -61.365838f,  -60.766573f,  -60.205999f, 
60          -59.182948f,  -58.267799f,  -57.439945f,  -56.684174f, 
61          -55.988932f,  -55.345238f,  -54.745973f,  -54.185399f, 
62          -53.162349f,  -52.247199f,  -51.419345f,  -50.663574f, 
63          -49.968332f,  -49.324638f,  -48.725374f,  -48.164799f, 
64          -47.141749f,  -46.226599f,  -45.398745f,  -44.642974f, 
65          -43.947732f,  -43.304038f,  -42.704774f,  -42.144199f, 
66          -41.121149f,  -40.205999f,  -39.378145f,  -38.622374f, 
67          -37.927132f,  -37.283438f,  -36.684174f,  -36.123599f, 
68          -35.100549f,  -34.185399f,  -33.357545f,  -32.601774f, 
69          -31.906532f,  -31.262838f,  -30.663574f,  -30.102999f, 
70          -29.079949f,  -28.164799f,  -27.336945f,  -26.581174f, 
71          -25.885932f,  -25.242238f,  -24.642974f,  -24.082400f, 
72          -23.059349f,  -22.144199f,  -21.316346f,  -20.560574f, 
73          -19.865332f,  -19.221639f,  -18.622374f,  -18.061800f, 
74          -17.038749f,  -16.123599f,  -15.295746f,  -14.539974f, 
75          -13.844732f,  -13.201039f,  -12.601774f,  -12.041200f, 
76          -11.018149f,  -10.103000f,   -9.275146f,   -8.519375f, 
77           -7.824132f,   -7.180439f,   -6.581174f,   -6.020600f, 
78           -4.997549f,   -4.082400f,   -3.254546f,   -2.498775f, 
79           -1.803533f,   -1.159839f,   -0.560574f,    0.000000f, 
80            1.023050f,    1.938200f,    2.766054f,    3.521825f, 
81            4.217067f,    4.860761f,    5.460025f,    6.020600f, 
82            7.043650f,    7.958800f,    8.786654f,    9.542425f, 
83           10.237667f,   10.881361f,   11.480625f,   12.041200f, 
84           13.064250f,   13.979400f,   14.807254f,   15.563025f, 
85           16.258267f,   16.901961f,   17.501225f,   18.061800f, 
86           19.084850f,   20.000000f,   20.827854f,   21.583625f, 
87           22.278867f,   22.922561f,   23.521825f,   24.082400f, 
88           25.105450f,   26.020600f,   26.848453f,   27.604225f, 
89           28.299467f,   28.943161f,   29.542425f,   30.102999f, 
90           31.126050f,   32.041200f,   32.869053f,   33.624825f, 
91           34.320067f,   34.963760f,   35.563025f,   36.123599f, 
92           37.146650f,   38.061800f,   38.889653f,   39.645424f, 
93           40.340667f,   40.984360f,   41.583625f,   42.144199f, 
94           43.167250f,   44.082399f,   44.910253f,   45.666024f, 
95           46.361266f,   47.004960f,   47.604225f,   48.164799f, 
96           49.187850f,   50.102999f,   50.930853f,   51.686624f
97 };
98
99 static float todB(const float *x){
100   ogg_int32_t *i=(ogg_int32_t *)x;
101   ogg_int32_t temp=((*i&0x7fffffff)-0x33c7ffff)>>20;
102   if(temp<0)return -400.f;
103   return(todB_LOOKUP[temp]);
104 }
105
106 #define todB_nn(x) todB(x)
107
108 #else
109
110 static float unitnorm(float x){
111   if(x<0)return(-1.f);
112   return(1.f);
113 }
114
115 #define todB(x)   (*(x)==0?-400.f:log(*(x)**(x))*4.34294480f)
116 #define todB_nn(x)   (*(x)==0.f?-400.f:log(*(x))*8.6858896f)
117
118 #endif 
119
120 #define fromdB(x) (exp((x)*.11512925f))  
121
122 /* The bark scale equations are approximations, since the original
123    table was somewhat hand rolled.  The below are chosen to have the
124    best possible fit to the rolled tables, thus their somewhat odd
125    appearance (these are more accurate and over a longer range than
126    the oft-quoted bark equations found in the texts I have).  The
127    approximations are valid from 0 - 30kHz (nyquist) or so.
128
129    all f in Hz, z in Bark */
130
131 #define toBARK(n)   (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n))
132 #define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f)
133 #define toMEL(n)    (log(1.f+(n)*.001f)*1442.695f)
134 #define fromMEL(m)  (1000.f*exp((m)/1442.695f)-1000.f)
135
136 /* Frequency to octave.  We arbitrarily declare 63.5 Hz to be octave
137    0.0 */
138
139 #define toOC(n)     (log(n)*1.442695f-5.965784f)
140 #define fromOC(o)   (exp(((o)+5.965784f)*.693147f))
141
142 #endif
143