From a18cefb671c4686532a3f15ad97f44a7d05efaa2 Mon Sep 17 00:00:00 2001 From: chatlanin Date: Fri, 20 Mar 2026 14:07:38 +0300 Subject: [PATCH] add size impl --- bin/{main.cpp => main.fft.cpp} | 0 bin/main.raw_data.cpp | 24 ++++++++++++++++++++++++ bin/meson.build | 2 +- src/plugins/fft/fft.cpp | 1 + src/plugins/magnitude/magnitude.cpp | 1 + src/plugins/raw_data/raw_data.cpp | 1 + src/utils/workers/result.hpp | 4 ++++ 7 files changed, 32 insertions(+), 1 deletion(-) rename bin/{main.cpp => main.fft.cpp} (100%) create mode 100644 bin/main.raw_data.cpp diff --git a/bin/main.cpp b/bin/main.fft.cpp similarity index 100% rename from bin/main.cpp rename to bin/main.fft.cpp diff --git a/bin/main.raw_data.cpp b/bin/main.raw_data.cpp new file mode 100644 index 0000000..1f8f223 --- /dev/null +++ b/bin/main.raw_data.cpp @@ -0,0 +1,24 @@ +#include +#include "harmonica.hpp" + +auto main() -> int +{ + // setup создается для каждого файла свой + // т.к. при чтении данных из файла уже должен быть определен размер блока + // данных для чтения m_block_size; см. установки по умолчанию. + // Передается по ссылке и заполняется необходимыми данными + hr::setup setup; + setup.m_domain = hr::DOMAIN_PLUGIN::TIME; + setup.m_file = "./sin.wav"; + + auto r = hr::run(setup); + hack::log()("grad:", r.m_grad); + hack::log()("min:", r.m_min, "max:", r.m_max); + hack::log()("size", r.m_size); + + if (!r.empty()) + { + for (auto& p : r.m_data) + hack::log()(p[0].m_value); + } +} diff --git a/bin/meson.build b/bin/meson.build index f6ed8ee..5cefe56 100644 --- a/bin/meson.build +++ b/bin/meson.build @@ -1,6 +1,6 @@ executable( meson.project_name(), - 'main.cpp', + 'main.raw_data.cpp', dependencies : deps, cpp_args: args, include_directories : inc diff --git a/src/plugins/fft/fft.cpp b/src/plugins/fft/fft.cpp index 6e48cd2..00eade1 100644 --- a/src/plugins/fft/fft.cpp +++ b/src/plugins/fft/fft.cpp @@ -18,6 +18,7 @@ namespace hr::plugins // т.к. реализация FFT (rdft) уже возвращает только уникальную часть спектра, а не полный симметричный массив из 1024 элементов. m_frames = m_setup.m_step_size + 1; m_result.m_grad.reserve(m_frames); + m_result.m_size = 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); } diff --git a/src/plugins/magnitude/magnitude.cpp b/src/plugins/magnitude/magnitude.cpp index 101427d..714b7bf 100644 --- a/src/plugins/magnitude/magnitude.cpp +++ b/src/plugins/magnitude/magnitude.cpp @@ -31,6 +31,7 @@ namespace hr::plugins b.m_value = v; b.m_duration = timestamp; + ++m_result.m_size; m_result.set_bit(0, b); m_result.set_min_max(v); } diff --git a/src/plugins/raw_data/raw_data.cpp b/src/plugins/raw_data/raw_data.cpp index 356798b..76017e0 100644 --- a/src/plugins/raw_data/raw_data.cpp +++ b/src/plugins/raw_data/raw_data.cpp @@ -27,6 +27,7 @@ namespace hr::plugins m_result.set_bit(0, b); m_result.set_min_max(v); } + m_result.m_size += base.size(); } void raw_data::process(cvec_t& fft, fvec_t& base, real_time timestamp) diff --git a/src/utils/workers/result.hpp b/src/utils/workers/result.hpp index 9fbf6d0..853be58 100644 --- a/src/utils/workers/result.hpp +++ b/src/utils/workers/result.hpp @@ -67,6 +67,10 @@ namespace hr m_min = hack::math::min(m_min, v); } + // в данном случае вы сами решаете, что для вас значит размер + // это может быть размер всего массива m_data или размер массива данных хранящихся в каждом бине + // или этот же массив но помноженный на размер m_data + std::size_t m_size = 0; // иногда нужна градуировка одна и тажа для всех бинов std::vector m_grad;