#include "fft.hpp" #include "utils/var.hpp" #include "utils/math.hpp" namespace hr::plugins { fft::fft(const setup& st) : plugin{ st } { m_setup.m_plugin_name = "FFT"; m_setup.m_plugin_description = "Вычисляет FFT и прокидывает данные дальше в вашу программу."; GUARD_DOMAIN(FREQUENSY); // Данные - амплитуда частот m_result.init(1); // заполняем градацию по частотам // тут не нужно делить на 2. получаем = 513 исходя из базового m_setup // т.к. реализация FFT (rdft) уже возвращает только уникальную часть спектра, а не полный симметричный массив из 1024 элементов. m_frames = m_setup.m_step_size + 1; m_result.m_grad.reserve(m_frames); for (size_t i = 0; i < m_frames; ++i) m_result.m_grad.push_back(static_cast(i) * m_setup.m_sample_rate / m_setup.m_block_size); } void fft::process(fvec_t& base, real_time timestamp) { } void fft::process(cvec_t& fft, fvec_t& base, real_time timestamp) { result::bit b; b.m_name = "Amplitudes"; b.m_duration = timestamp; b.m_values.reserve(m_frames); for (size_t i = 0; i < m_frames; ++i) { // Конвертация в децибелы auto a = fft.m_norm[i]; if (a > 0.000001f) a = 20.0f * log10(a); else a = -120.0f; // Минимальное значение для логарифмической шкалы b.m_values.push_back(a); } m_result.set_bit(0, b); } result fft::get_result() { return m_result; } }