MDCT.h 958 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /*
  2. * Copyright (c) 2021, Arne Elster <arne@elster.li>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Array.h>
  8. #include <AK/Math.h>
  9. #include <AK/Span.h>
  10. namespace DSP {
  11. template<size_t N>
  12. requires(N % 2 == 0) class MDCT {
  13. public:
  14. constexpr MDCT()
  15. {
  16. for (size_t n = 0; n < N; n++) {
  17. for (size_t k = 0; k < N / 2; k++) {
  18. 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));
  19. }
  20. }
  21. }
  22. void transform(ReadonlySpan<float> data, Span<float> output)
  23. {
  24. VERIFY(N == 2 * data.size());
  25. VERIFY(N == output.size());
  26. for (size_t n = 0; n < N; n++) {
  27. output[n] = 0;
  28. for (size_t k = 0; k < N / 2; k++) {
  29. output[n] += data[k] * m_phi[n][k];
  30. }
  31. }
  32. }
  33. private:
  34. Array<Array<float, N / 2>, N> m_phi;
  35. };
  36. }