aboutsummaryrefslogtreecommitdiffstats
path: root/aweight.h
blob: 2f4df71e6975f98a949249d4cc1b650e9f7c11bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
 * aweight.h - Efficient A-weighting algorithm
 * Copyright (C) 2024  Clyne Sullivan <clyne@bitgloo.com>
 *
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation, either version 3 of the License, or (at your option) any
 * later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Lesser General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#ifndef AWEIGHT_H
#define AWEIGHT_H

/**
 * Applies A-weighting to the given audio sample.
 * @param in_div4 The audio sample divided by four
 * @return The filtered (A-weighted) sample
 */
inline float process(float in_div4)
{
    static float z1 = 0, z2 = 0, z3 = 0, z5 = 0;

    float out1 = in_div4 + z1;
    z1 = 1.062f * out1 + z2;
    z2 = -0.14f * out1 - in_div4;

    float out2 = out1 + z3;
    z3 = out1;

    float out3 = out2 + z5;
    z5 = 0.985f * out3 - out2;

    return out3;
}

#endif // AWEIGHT_H