Krotos Modules 3
Loading...
Searching...
No Matches
DiscreteCosineTransform.cpp
Go to the documentation of this file.
2
3//=====================================================================================
8
9void krotos::DiscreteCosineTransform::setInputOutputSize(const std::size_t& inputSize, const std::size_t& outputSize)
10{
11 buildDctMatrix(inputSize, outputSize);
12}
13
14//=====================================================================================
15std::vector<float> krotos::DiscreteCosineTransform::calculateDCT(const std::vector<float>& input)
16{
17
18 if (input.size() != m_inputSize)
19 {
20 buildDctMatrix(input.size(), m_outputSize);
21 }
22
23 std::vector<float> result(m_outputSize, 0.f);
24 for (int i = 0; i < m_outputSize; ++i)
25 {
26 for (int j = 0; j < m_inputSize; ++j)
27 {
28 result[i] += input[j] * m_dctMatrix[i][j];
29 }
30 }
31
32 return result;
33}
34
35void krotos::DiscreteCosineTransform::buildDctMatrix(const std::size_t& inputSize, const std::size_t& outputSize)
36{
37 m_inputSize = inputSize;
38 m_outputSize = outputSize;
39
40 m_dctMatrix.resize(m_outputSize, std::vector<float>(m_inputSize, 0.f));
41
42 // scale for index = 0
43 auto scale0 = 1.0f / std::sqrt(m_inputSize);
44
45 // scale for index != 0
46 auto scale1 = std::sqrt(2.0f / m_inputSize);
47
48 for (int i = 0; i < m_outputSize; ++i)
49 {
50 auto scale = (i == 0) ? scale0 : scale1;
51 auto k = m_pi / m_inputSize * i;
52 for (int j = 0; j < m_inputSize; ++j)
53 {
54 m_dctMatrix[i][j] = static_cast<float>(scale * std::cos(k * (j + 0.5)));
55 }
56 }
57}
void buildDctMatrix(const std::size_t &inputSize, const std::size_t &outputSize)
Definition DiscreteCosineTransform.cpp:35
void setInputOutputSize(const std::size_t &inputSize, const std::size_t &outputSize)
Definition DiscreteCosineTransform.cpp:9
std::size_t m_outputSize
Definition DiscreteCosineTransform.h:26
DiscreteCosineTransform()
Definition DiscreteCosineTransform.cpp:4
std::vector< float > calculateDCT(const std::vector< float > &input)
Definition DiscreteCosineTransform.cpp:15
std::size_t m_inputSize
Definition DiscreteCosineTransform.h:25