Files
harmonica/src/plugins/fft/fft.cpp
2026-03-20 10:42:25 +03:00

51 lines
1.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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<float>(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;
}
}