r125: This commit was manufactured by cvs2svn to create tag 'r1_1_7-last'.
[cinelerra_cv/mob.git] / hvirtual / toolame-02l / ath.c
blob730610eff10eaf336864ab51ba4af59d4d132634
1 #include <stdio.h>
2 #include <math.h>
3 #include "common.h"
4 #include "ath.h"
6 /* freq in hz */
7 FLOAT8 ATH_dB(FLOAT8 f, FLOAT8 value)
9 /* from Painter & Spanias
10 modified by Gabriel Bouvigne to better fit the reality
11 ath = 3.640 * pow(f,-0.8)
12 - 6.800 * exp(-0.6*pow(f-3.4,2.0))
13 + 6.000 * exp(-0.15*pow(f-8.7,2.0))
14 + 0.6* 0.001 * pow(f,4.0);
17 In the past LAME was using the Painter &Spanias formula.
18 But we had some recurrent problems with HF content.
19 We measured real ATH values, and found the older formula
20 to be inacurate in the higher part. So we made this new
21 formula and this solved most of HF problematic testcases.
22 The tradeoff is that in VBR mode it increases a lot the
23 bitrate.*/
26 /*this curve can be udjusted according to the VBR scale:
27 it adjusts from something close to Painter & Spanias
28 on V9 up to Bouvigne's formula for V0. This way the VBR
29 bitrate is more balanced according to the -V value.*/
31 FLOAT8 ath;
32 FLOAT8 valueold = 0.0;
34 if (f < -.3)
35 f=3410;
37 f /= 1000; // convert to khz
38 f = MAX(0.01, f);
39 f = MIN(18.0, f);
41 ath = 3.640 * pow(f,-0.8)
42 - 6.800 * exp(-0.6*pow(f-3.4,2.0))
43 + 6.000 * exp(-0.15*pow(f-8.7,2.0))
44 + (0.6+0.04*valueold)* 0.001 * pow(f,4.0);
46 /* MFC Feb 2003
47 I've changed the fudge technique on the code.
48 The "-l [float]" value raises/lowers the ATH by this many dB */
49 return (ath + value);
53 /* Convert ATH values from dB into energy values as required by the psycho model */
54 float ATH_energy(float freq, float value) {
55 float db;
56 db = ATH_dB(freq, 0) + value; // Originally: ATH_dB(freq,value)
57 /* The values in the standard, and from the ATH formula are in dB.
58 In the psycho model we are working in the energy domain. Hence the values that
59 are in the absthr_X tables are not in dB. This function converts from dB into the energy domain.
60 As noted on the LAME mailing list from years ago (MFC FIX find the reference), the
61 absolute threhsold of hearing values in the tables in the standard are dodgy - the
62 ATH in the tables do not correspond to any previously known values of the ATH.
63 From ISO 11172 Tables D.4.x
64 "A value of 0dB represents a level in the absolute threshold calculation of
65 96dB below the energy of a sine wave of amplitude 32760."
66 But I still don't know why the factor of 41.837375 is the value that it is. MFC Feb 2003 */
67 return(pow(10.0, (db+41.837375)*0.1));
71 /* Convert a frequency (in Hz) to a bark value
72 Taken from LAME. MFC Feb 2003
73 see for example "Zwicker: Psychoakustik, 1982; ISBN 3-540-11401-7 */
74 FLOAT8 toolame_freq2bark(FLOAT8 freq)
76 if (freq<0) freq=0;
77 freq = freq * 0.001;
78 return 13.0*atan(.76*freq) + 3.5*atan(freq*freq/(7.5*7.5));