/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 | } 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 | } |
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 | | } |