2008-07-29 23:34:34 -07:00
|
|
|
/********************************************************************
|
|
|
|
* *
|
|
|
|
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
|
|
|
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
|
|
|
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
|
|
|
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
|
|
|
* *
|
2009-07-30 22:24:16 -07:00
|
|
|
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
2008-07-29 23:34:34 -07:00
|
|
|
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
|
|
|
* *
|
|
|
|
********************************************************************
|
|
|
|
|
|
|
|
function: linear scale -> dB, Bark and Mel scales
|
2009-07-30 22:24:16 -07:00
|
|
|
last mod: $Id: scales.h 16227 2009-07-08 06:58:46Z xiphmont $
|
2008-07-29 23:34:34 -07:00
|
|
|
|
|
|
|
********************************************************************/
|
|
|
|
|
|
|
|
#ifndef _V_SCALES_H_
|
|
|
|
#define _V_SCALES_H_
|
|
|
|
|
|
|
|
#include <math.h>
|
|
|
|
#include "os.h"
|
|
|
|
|
2009-07-06 15:10:04 -07:00
|
|
|
#ifdef _MSC_VER
|
|
|
|
/* MS Visual Studio doesn't have C99 inline keyword. */
|
|
|
|
#define inline __inline
|
|
|
|
#endif
|
|
|
|
|
2008-07-29 23:34:34 -07:00
|
|
|
/* 20log10(x) */
|
|
|
|
#define VORBIS_IEEE_FLOAT32 1
|
|
|
|
#ifdef VORBIS_IEEE_FLOAT32
|
|
|
|
|
2009-07-06 15:10:04 -07:00
|
|
|
static inline float unitnorm(float x){
|
2008-07-29 23:34:34 -07:00
|
|
|
union {
|
|
|
|
ogg_uint32_t i;
|
|
|
|
float f;
|
|
|
|
} ix;
|
|
|
|
ix.f = x;
|
|
|
|
ix.i = (ix.i & 0x80000000U) | (0x3f800000U);
|
|
|
|
return ix.f;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Segher was off (too high) by ~ .3 decibel. Center the conversion correctly. */
|
2009-07-06 15:10:04 -07:00
|
|
|
static inline float todB(const float *x){
|
2008-07-29 23:34:34 -07:00
|
|
|
union {
|
|
|
|
ogg_uint32_t i;
|
|
|
|
float f;
|
|
|
|
} ix;
|
|
|
|
ix.f = *x;
|
|
|
|
ix.i = ix.i&0x7fffffff;
|
|
|
|
return (float)(ix.i * 7.17711438e-7f -764.6161886f);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define todB_nn(x) todB(x)
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
static float unitnorm(float x){
|
|
|
|
if(x<0)return(-1.f);
|
|
|
|
return(1.f);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define todB(x) (*(x)==0?-400.f:log(*(x)**(x))*4.34294480f)
|
|
|
|
#define todB_nn(x) (*(x)==0.f?-400.f:log(*(x))*8.6858896f)
|
|
|
|
|
2009-07-30 22:24:16 -07:00
|
|
|
#endif
|
2008-07-29 23:34:34 -07:00
|
|
|
|
2009-07-30 22:24:16 -07:00
|
|
|
#define fromdB(x) (exp((x)*.11512925f))
|
2008-07-29 23:34:34 -07:00
|
|
|
|
|
|
|
/* The bark scale equations are approximations, since the original
|
|
|
|
table was somewhat hand rolled. The below are chosen to have the
|
|
|
|
best possible fit to the rolled tables, thus their somewhat odd
|
|
|
|
appearance (these are more accurate and over a longer range than
|
|
|
|
the oft-quoted bark equations found in the texts I have). The
|
|
|
|
approximations are valid from 0 - 30kHz (nyquist) or so.
|
|
|
|
|
|
|
|
all f in Hz, z in Bark */
|
|
|
|
|
|
|
|
#define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n))
|
|
|
|
#define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f)
|
|
|
|
#define toMEL(n) (log(1.f+(n)*.001f)*1442.695f)
|
|
|
|
#define fromMEL(m) (1000.f*exp((m)/1442.695f)-1000.f)
|
|
|
|
|
|
|
|
/* Frequency to octave. We arbitrarily declare 63.5 Hz to be octave
|
|
|
|
0.0 */
|
|
|
|
|
|
|
|
#define toOC(n) (log(n)*1.442695f-5.965784f)
|
|
|
|
#define fromOC(o) (exp(((o)+5.965784f)*.693147f))
|
|
|
|
|
|
|
|
#endif
|