18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/********************************************************************
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009             *
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/                  *
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: linear scale -> dB, Bark and Mel scales
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: scales.h 16227 2009-07-08 06:58:46Z xiphmont $
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifndef _V_SCALES_H_
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define _V_SCALES_H_
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <math.h>
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "os.h"
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifdef _MSC_VER
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* MS Visual Studio doesn't have C99 inline keyword. */
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define inline __inline
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* 20log10(x) */
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define VORBIS_IEEE_FLOAT32 1
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifdef VORBIS_IEEE_FLOAT32
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic inline float unitnorm(float x){
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  union {
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    ogg_uint32_t i;
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float f;
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  } ix;
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ix.f = x;
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ix.i = (ix.i & 0x80000000U) | (0x3f800000U);
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return ix.f;
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* Segher was off (too high) by ~ .3 decibel.  Center the conversion correctly. */
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic inline float todB(const float *x){
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  union {
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    ogg_uint32_t i;
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float f;
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  } ix;
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ix.f = *x;
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ix.i = ix.i&0x7fffffff;
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return (float)(ix.i * 7.17711438e-7f -764.6161886f);
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define todB_nn(x) todB(x)
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#else
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic float unitnorm(float x){
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(x<0)return(-1.f);
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return(1.f);
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define todB(x)   (*(x)==0?-400.f:log(*(x)**(x))*4.34294480f)
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define todB_nn(x)   (*(x)==0.f?-400.f:log(*(x))*8.6858896f)
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define fromdB(x) (exp((x)*.11512925f))
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* The bark scale equations are approximations, since the original
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   table was somewhat hand rolled.  The below are chosen to have the
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   best possible fit to the rolled tables, thus their somewhat odd
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   appearance (these are more accurate and over a longer range than
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   the oft-quoted bark equations found in the texts I have).  The
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   approximations are valid from 0 - 30kHz (nyquist) or so.
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   all f in Hz, z in Bark */
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define toBARK(n)   (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n))
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f)
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define toMEL(n)    (log(1.f+(n)*.001f)*1442.695f)
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define fromMEL(m)  (1000.f*exp((m)/1442.695f)-1000.f)
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* Frequency to octave.  We arbitrarily declare 63.5 Hz to be octave
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   0.0 */
868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define toOC(n)     (log(n)*1.442695f-5.965784f)
888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define fromOC(o)   (exp(((o)+5.965784f)*.693147f))
898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
91