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