]>
Commit | Line | Data |
---|---|---|
7b9cd28e | 1 | #include "loudness.h" |
7b9cd28e | 2 | #include "common.h" |
e513e533 | 3 | #include <math.h> |
7b9cd28e YP |
4 | |
5 | loudness_processor loudness_r; | |
6 | loudness_processor loudness_l; | |
7 | ||
e513e533 MB |
8 | void _loudness_set_volume(loudness_processor *p, float volume) { |
9 | float gain = -(volume - config.loudness_reference_volume_db) * 0.5; | |
7b9cd28e YP |
10 | if (gain < 0) |
11 | gain = 0; | |
e513e533 | 12 | |
7b9cd28e YP |
13 | float Fc = 10.0; |
14 | float Q = 0.5; | |
e513e533 | 15 | |
7b9cd28e YP |
16 | // Formula from http://www.earlevel.com/main/2011/01/02/biquad-formulas/ |
17 | float Fs = 44100.0; | |
e513e533 | 18 | |
7b9cd28e YP |
19 | float K = tan(M_PI * Fc / Fs); |
20 | float V = pow(10.0, gain / 20.0); | |
e513e533 MB |
21 | |
22 | float norm = 1 / (1 + 1 / Q * K + K * K); | |
23 | p->a0 = (1 + V / Q * K + K * K) * norm; | |
7b9cd28e | 24 | p->a1 = 2 * (K * K - 1) * norm; |
e513e533 | 25 | p->a2 = (1 - V / Q * K + K * K) * norm; |
7b9cd28e | 26 | p->b1 = p->a1; |
e513e533 | 27 | p->b2 = (1 - 1 / Q * K + K * K) * norm; |
7b9cd28e YP |
28 | } |
29 | ||
e513e533 MB |
30 | float loudness_process(loudness_processor *p, float i0) { |
31 | float o0 = p->a0 * i0 + p->a1 * p->i1 + p->a2 * p->i2 - p->b1 * p->o1 - p->b2 * p->o2; | |
32 | ||
7b9cd28e YP |
33 | p->o2 = p->o1; |
34 | p->o1 = o0; | |
e513e533 | 35 | |
7b9cd28e YP |
36 | p->i2 = p->i1; |
37 | p->i1 = i0; | |
e513e533 | 38 | |
7b9cd28e YP |
39 | return o0; |
40 | } | |
41 | ||
e513e533 MB |
42 | void loudness_set_volume(float volume) { |
43 | float gain = -(volume - config.loudness_reference_volume_db) * 0.5; | |
7b9cd28e YP |
44 | if (gain < 0) |
45 | gain = 0; | |
e513e533 | 46 | |
2f2442f4 | 47 | debug(2, "Volume: %.1f dB - Loudness gain @10Hz: %.1f dB", volume, gain); |
7b9cd28e YP |
48 | _loudness_set_volume(&loudness_l, volume); |
49 | _loudness_set_volume(&loudness_r, volume); | |
50 | } |