From 6a64aabce86fb9d24ef468ff764a4a340afad3de Mon Sep 17 00:00:00 2001 From: Arne Elster Date: Thu, 9 Dec 2021 22:19:17 +0100 Subject: [PATCH] LibDSP: Add IMDCT This implements a generic IMDCT to be used by the MP3 decoder. --- Userland/Libraries/LibDSP/MDCT.h | 43 ++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 Userland/Libraries/LibDSP/MDCT.h diff --git a/Userland/Libraries/LibDSP/MDCT.h b/Userland/Libraries/LibDSP/MDCT.h new file mode 100644 index 0000000000..940013498b --- /dev/null +++ b/Userland/Libraries/LibDSP/MDCT.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021, Arne Elster + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace LibDSP { + +template +requires(N % 2 == 0) class MDCT { +public: + constexpr MDCT() + { + for (size_t n = 0; n < N; n++) { + for (size_t k = 0; k < N / 2; k++) { + m_phi[n][k] = AK::cos(AK::Pi / (2 * N) * (2 * n + 1 + N / 2.0) * (2 * k + 1)); + } + } + } + + void transform(Span data, Span output) + { + assert(N == 2 * data.size()); + assert(N == output.size()); + for (size_t n = 0; n < N; n++) { + output[n] = 0; + for (size_t k = 0; k < N / 2; k++) { + output[n] += data[k] * m_phi[n][k]; + } + } + } + +private: + Array, N> m_phi; +}; + +}