Coverage Report

Created: 2025-08-28 06:26

/src/serenity/Userland/Libraries/LibDSP/MDCT.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2021, Arne Elster <arne@elster.li>
3
 *
4
 * SPDX-License-Identifier: BSD-2-Clause
5
 */
6
7
#pragma once
8
9
#include <AK/Array.h>
10
#include <AK/Math.h>
11
#include <AK/Span.h>
12
13
namespace DSP {
14
15
template<size_t N>
16
requires(N % 2 == 0) class MDCT {
17
public:
18
    constexpr MDCT()
19
16
    {
20
400
        for (size_t n = 0; n < N; n++) {
21
6.14k
            for (size_t k = 0; k < N / 2; k++) {
22
5.76k
                m_phi[n][k] = AK::cos<float>(AK::Pi<float> / (2 * N) * (2 * static_cast<float>(n) + 1 + N / 2.0f) * static_cast<float>(2 * k + 1));
23
5.76k
            }
24
384
        }
25
16
    }
DSP::MDCT<12ul>::MDCT()
Line
Count
Source
19
8
    {
20
104
        for (size_t n = 0; n < N; n++) {
21
672
            for (size_t k = 0; k < N / 2; k++) {
22
576
                m_phi[n][k] = AK::cos<float>(AK::Pi<float> / (2 * N) * (2 * static_cast<float>(n) + 1 + N / 2.0f) * static_cast<float>(2 * k + 1));
23
576
            }
24
96
        }
25
8
    }
DSP::MDCT<36ul>::MDCT()
Line
Count
Source
19
8
    {
20
296
        for (size_t n = 0; n < N; n++) {
21
5.47k
            for (size_t k = 0; k < N / 2; k++) {
22
5.18k
                m_phi[n][k] = AK::cos<float>(AK::Pi<float> / (2 * N) * (2 * static_cast<float>(n) + 1 + N / 2.0f) * static_cast<float>(2 * k + 1));
23
5.18k
            }
24
288
        }
25
8
    }
26
27
    void transform(ReadonlySpan<float> data, Span<float> output)
28
4.21M
    {
29
4.21M
        VERIFY(N == 2 * data.size());
30
4.21M
        VERIFY(N == output.size());
31
134M
        for (size_t n = 0; n < N; n++) {
32
130M
            output[n] = 0;
33
2.33G
            for (size_t k = 0; k < N / 2; k++) {
34
2.20G
                output[n] += data[k] * m_phi[n][k];
35
2.20G
            }
36
130M
        }
37
4.21M
    }
DSP::MDCT<12ul>::transform(AK::Span<float const>, AK::Span<float>)
Line
Count
Source
28
907k
    {
29
907k
        VERIFY(N == 2 * data.size());
30
907k
        VERIFY(N == output.size());
31
11.8M
        for (size_t n = 0; n < N; n++) {
32
10.8M
            output[n] = 0;
33
76.2M
            for (size_t k = 0; k < N / 2; k++) {
34
65.3M
                output[n] += data[k] * m_phi[n][k];
35
65.3M
            }
36
10.8M
        }
37
907k
    }
DSP::MDCT<36ul>::transform(AK::Span<float const>, AK::Span<float>)
Line
Count
Source
28
3.30M
    {
29
3.30M
        VERIFY(N == 2 * data.size());
30
3.30M
        VERIFY(N == output.size());
31
122M
        for (size_t n = 0; n < N; n++) {
32
119M
            output[n] = 0;
33
2.26G
            for (size_t k = 0; k < N / 2; k++) {
34
2.14G
                output[n] += data[k] * m_phi[n][k];
35
2.14G
            }
36
119M
        }
37
3.30M
    }
38
39
private:
40
    Array<Array<float, N / 2>, N> m_phi;
41
};
42
43
}