Line data Source code
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: linear scale -> dB, Bark and Mel scales
14 : last mod: $Id$
15 :
16 : ********************************************************************/
17 :
18 : #ifndef _V_SCALES_H_
19 : #define _V_SCALES_H_
20 :
21 : #include <math.h>
22 : #include "os.h"
23 :
24 : #ifdef _MSC_VER
25 : /* MS Visual Studio doesn't have C99 inline keyword. */
26 : #define inline __inline
27 : #endif
28 :
29 : /* 20log10(x) */
30 : #define VORBIS_IEEE_FLOAT32 1
31 : #ifdef VORBIS_IEEE_FLOAT32
32 :
33 0 : static inline float unitnorm(float x){
34 : union {
35 : ogg_uint32_t i;
36 : float f;
37 : } ix;
38 0 : ix.f = x;
39 0 : ix.i = (ix.i & 0x80000000U) | (0x3f800000U);
40 0 : return ix.f;
41 : }
42 :
43 : /* Segher was off (too high) by ~ .3 decibel. Center the conversion correctly. */
44 0 : static inline float todB(const float *x){
45 : union {
46 : ogg_uint32_t i;
47 : float f;
48 : } ix;
49 0 : ix.f = *x;
50 0 : ix.i = ix.i&0x7fffffff;
51 0 : return (float)(ix.i * 7.17711438e-7f -764.6161886f);
52 : }
53 :
54 : #define todB_nn(x) todB(x)
55 :
56 : #else
57 :
58 : static float unitnorm(float x){
59 : if(x<0)return(-1.f);
60 : return(1.f);
61 : }
62 :
63 : #define todB(x) (*(x)==0?-400.f:log(*(x)**(x))*4.34294480f)
64 : #define todB_nn(x) (*(x)==0.f?-400.f:log(*(x))*8.6858896f)
65 :
66 : #endif
67 :
68 : #define fromdB(x) (exp((x)*.11512925f))
69 :
70 : /* The bark scale equations are approximations, since the original
71 : table was somewhat hand rolled. The below are chosen to have the
72 : best possible fit to the rolled tables, thus their somewhat odd
73 : appearance (these are more accurate and over a longer range than
74 : the oft-quoted bark equations found in the texts I have). The
75 : approximations are valid from 0 - 30kHz (nyquist) or so.
76 :
77 : all f in Hz, z in Bark */
78 :
79 : #define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n))
80 : #define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f)
81 : #define toMEL(n) (log(1.f+(n)*.001f)*1442.695f)
82 : #define fromMEL(m) (1000.f*exp((m)/1442.695f)-1000.f)
83 :
84 : /* Frequency to octave. We arbitrarily declare 63.5 Hz to be octave
85 : 0.0 */
86 :
87 : #define toOC(n) (log(n)*1.442695f-5.965784f)
88 : #define fromOC(o) (exp(((o)+5.965784f)*.693147f))
89 :
90 : #endif
|