[PVR][Estuary] Timer settings dialog: Show client name in timer type selection dialog...
[xbmc.git] / xbmc / utils / rfft.cpp
blobe0ae3837252daa511f330eba3aad1e28c92ba1a3
1 /*
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.
7 */
9 #include "rfft.h"
11 #if defined(TARGET_WINDOWS) && !defined(_USE_MATH_DEFINES)
12 #define _USE_MATH_DEFINES
13 #endif
14 #include <math.h>
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);
22 RFFT::~RFFT()
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
27 //in the C'tor).
28 KISS_FFT_FREE(m_cfg);
31 void RFFT::calc(const float* input, float* output)
33 // temporary buffers
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];
43 if (m_windowed)
45 hann(linput);
46 hann(rinput);
49 // transform channels
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]);
67 #include <iostream>
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)));