~aleteoryx/muditaos

muditaos/module-audio/Audio/equalizer/Equalizer.hpp -rw-r--r-- 1.9 KiB
a405cad6Aleteoryx trim readme 7 days ago
                                                                                
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md

#pragma once

#include <cstdint>
#include <tuple>

namespace audio::equalizer
{
    /*
     * Currently we have 5 band EQ configured in the codec chip, although it is possible
     * to use up to 7 band EQ - it is configurable via internal chip registers.
     */
    constexpr inline auto bands = 5;
    struct QFilterCoefficients
    {
        float b0;
        float b1;
        float b2;
        float a1;
        float a2;
        inline bool operator==(const QFilterCoefficients &rhs) const
        {
            if (b0 != rhs.b0) {
                return false;
            }
            if (b1 != rhs.b1) {
                return false;
            }
            if (b2 != rhs.b2) {
                return false;
            }
            if (a1 != rhs.a1) {
                return false;
            }
            if (a2 != rhs.a2) {
                return false;
            }
            return true;
        }
        inline bool operator!=(const QFilterCoefficients &rhs) const
        {
            if (b0 != rhs.b0) {
                return true;
            }
            if (b1 != rhs.b1) {
                return true;
            }
            if (b2 != rhs.b2) {
                return true;
            }
            if (a1 != rhs.a1) {
                return true;
            }
            if (a2 != rhs.a2) {
                return true;
            }
            return false;
        }
    };

    using Equalizer = std::array<QFilterCoefficients, bands>;

    enum class FilterType
    {
        BandPass,
        HighPass,
        LowPass,
        Flat,
        Notch,
        LowShelf,
        HighShelf,
        Parametric,
        None
    };

    QFilterCoefficients qfilter_CalculateCoeffs(
        FilterType filter, float frequency, uint32_t samplerate, float Q, float gain);
} // namespace audio::equalizer