add fft plugin
This commit is contained in:
50
src/plugins/fft/fft.cpp
Normal file
50
src/plugins/fft/fft.cpp
Normal file
@@ -0,0 +1,50 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user