18 if (input.size() != m_inputSize)
20 buildDctMatrix(input.size(), m_outputSize);
23 std::vector<float> result(m_outputSize, 0.f);
24 for (
int i = 0; i < m_outputSize; ++i)
26 for (
int j = 0; j < m_inputSize; ++j)
28 result[i] += input[j] * m_dctMatrix[i][j];
37 m_inputSize = inputSize;
38 m_outputSize = outputSize;
40 m_dctMatrix.resize(m_outputSize, std::vector<float>(m_inputSize, 0.f));
43 auto scale0 = 1.0f / std::sqrt(m_inputSize);
46 auto scale1 = std::sqrt(2.0f / m_inputSize);
48 for (
int i = 0; i < m_outputSize; ++i)
50 auto scale = (i == 0) ? scale0 : scale1;
51 auto k = m_pi / m_inputSize * i;
52 for (
int j = 0; j < m_inputSize; ++j)
54 m_dctMatrix[i][j] =
static_cast<float>(scale * std::cos(k * (j + 0.5)));