2 * Copyright (C) 2015-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
11 #if defined(TARGET_WINDOWS) && !defined(_USE_MATH_DEFINES)
12 #define _USE_MATH_DEFINES
16 RFFT::RFFT(int size
, bool windowed
) :
17 m_size(size
), m_windowed(windowed
)
19 m_cfg
= kiss_fftr_alloc(m_size
,0,nullptr,nullptr);
24 // we don' use kiss_fftr_free here because
25 // its hardcoded to free and doesn't pay attention
26 // to SIMD (which might be used during kiss_fftr_alloc
31 void RFFT::calc(const float* input
, float* output
)
34 std::vector
<kiss_fft_scalar
> linput(m_size
), rinput(m_size
);
35 std::vector
<kiss_fft_cpx
> loutput(m_size
), routput(m_size
);
37 for (size_t i
=0;i
<m_size
;++i
)
39 linput
[i
] = input
[2*i
];
40 rinput
[i
] = input
[2*i
+1];
50 kiss_fftr(m_cfg
, &linput
[0], &loutput
[0]);
51 kiss_fftr(m_cfg
, &rinput
[0], &routput
[0]);
53 auto&& filter
= [&](kiss_fft_cpx
& data
)
55 return static_cast<double>(sqrt(data
.r
* data
.r
+ data
.i
* data
.i
)) * 2.0 / m_size
*
56 (m_windowed
? sqrt(8.0 / 3.0) : 1.0);
59 // interleave while taking magnitudes and normalizing
60 for (size_t i
=0;i
<m_size
/2;++i
)
62 output
[2*i
] = filter(loutput
[i
]);
63 output
[2*i
+1] = filter(routput
[i
]);
69 void RFFT::hann(std::vector
<kiss_fft_scalar
>& data
)
71 for (size_t i
=0;i
<data
.size();++i
)
72 data
[i
] *= 0.5f
* (1.0f
- cos(2.0f
* static_cast<float>(M_PI
) * i
/ (data
.size() - 1)));