maked return result from signal generator

This commit is contained in:
2026-02-18 19:46:53 +03:00
parent b3151cad76
commit 0b9c830f58
4 changed files with 33 additions and 20 deletions

View File

@@ -18,6 +18,6 @@ auto main() -> int
{ {
std::vector<float> s; std::vector<float> s;
for (auto p : r.m_data) s.push_back(p.m_value[0]); for (auto p : r.m_data) s.push_back(p.m_value[0]);
// hack::log()(s); hack::log()(s);
} }
} }

View File

@@ -9,5 +9,8 @@ auto main() -> int
auto s = generator.generate(st); auto s = generator.generate(st);
hack::log()(st.get_name()); hack::log()(st.get_name());
hack::log()(s);
std::vector<float> ss;
for (auto p : s.m_data) ss.push_back(p.m_value[0]);
hack::log()(ss);
} }

View File

@@ -4,41 +4,49 @@
namespace hr namespace hr
{ {
std::vector<float> signal_generator::generate(signal_type st, NOISE noise) result signal_generator::generate(signal_type st, NOISE noise)
{ {
std::vector<float> res; std::vector<float> tmp;
switch (st.m_type) switch (st.m_type)
{ {
case signal_type::type::SIN: case signal_type::type::SIN:
res = sin(noise); tmp = sin(noise);
break; break;
case signal_type::type::SQUARE: case signal_type::type::SQUARE:
res = square(noise); tmp = square(noise);
break; break;
case signal_type::type::TRIANGLE: case signal_type::type::TRIANGLE:
res = triangle(noise); tmp = triangle(noise);
break; break;
case signal_type::type::SAW: case signal_type::type::SAW:
res = saw(noise); tmp = saw(noise);
break; break;
case signal_type::type::SPEECH_LIKE: case signal_type::type::SPEECH_LIKE:
res = speech_like(noise); tmp = speech_like(noise);
break; break;
case signal_type::type::NOISE_ONLY: case signal_type::type::NOISE_ONLY:
res = noise_only(); tmp = noise_only();
break; break;
case signal_type::type::THREE_SINES: case signal_type::type::THREE_SINES:
res = three_sines(noise); tmp = three_sines(noise);
break; break;
} }
result res;
for (auto t : tmp)
{
result::bit b;
b.m_value.push_back(t);
res.set_bit(b);
}
return res; return res;
} }
std::vector<float> signal_generator::sin(NOISE noise) std::vector<float> signal_generator::sin(NOISE noise)
{ {
std::vector<float> signal(m_params.m_samples); std::vector<float> signal(m_params.m_samples);
for (int i = 0; i < m_params.m_samples; ++i) for (std::size_t i = 0; i < m_params.m_samples; ++i)
{ {
float t = i * 0.02f; float t = i * 0.02f;
signal[i] = m_params.m_amplitude * std::sin(m_params.m_frequency * t * 2 * M_PI); signal[i] = m_params.m_amplitude * std::sin(m_params.m_frequency * t * 2 * M_PI);
@@ -57,7 +65,7 @@ namespace hr
std::vector<float> signal_generator::square(NOISE noise) std::vector<float> signal_generator::square(NOISE noise)
{ {
std::vector<float> signal(m_params.m_samples); std::vector<float> signal(m_params.m_samples);
for (int i = 0; i < m_params.m_samples; ++i) for (std::size_t i = 0; i < m_params.m_samples; ++i)
{ {
float t = i * 0.02f; float t = i * 0.02f;
float phase = m_params.m_frequency * t * 2 * M_PI; float phase = m_params.m_frequency * t * 2 * M_PI;
@@ -77,7 +85,7 @@ namespace hr
std::vector<float> signal_generator::triangle(NOISE noise) std::vector<float> signal_generator::triangle(NOISE noise)
{ {
std::vector<float> signal(m_params.m_samples); std::vector<float> signal(m_params.m_samples);
for (int i = 0; i < m_params.m_samples; ++i) for (std::size_t i = 0; i < m_params.m_samples; ++i)
{ {
float t = i * 0.02f; float t = i * 0.02f;
float phase = fmod(m_params.m_frequency * t, 1.0f); // 0..1 float phase = fmod(m_params.m_frequency * t, 1.0f); // 0..1
@@ -100,7 +108,7 @@ namespace hr
std::vector<float> signal_generator::saw(NOISE noise) std::vector<float> signal_generator::saw(NOISE noise)
{ {
std::vector<float> signal(m_params.m_samples); std::vector<float> signal(m_params.m_samples);
for (int i = 0; i < m_params.m_samples; ++i) for (std::size_t i = 0; i < m_params.m_samples; ++i)
{ {
float t = i * 0.02f; float t = i * 0.02f;
float phase = fmod(m_params.m_frequency * t, 1.0f); // 0..1 float phase = fmod(m_params.m_frequency * t, 1.0f); // 0..1
@@ -123,7 +131,7 @@ namespace hr
std::vector<float> signal(m_params.m_samples); std::vector<float> signal(m_params.m_samples);
std::uniform_real_distribution<> dist(-m_params.m_amplitude, m_params.m_amplitude); std::uniform_real_distribution<> dist(-m_params.m_amplitude, m_params.m_amplitude);
for (int i = 0; i < m_params.m_samples; ++i) for (std::size_t i = 0; i < m_params.m_samples; ++i)
signal[i] = dist(m_gen); signal[i] = dist(m_gen);
return signal; return signal;
@@ -147,7 +155,7 @@ namespace hr
// Модуляция амплитуды (как при произношении слогов) // Модуляция амплитуды (как при произношении слогов)
float envelope_freq = 2.0f; // частота слогов float envelope_freq = 2.0f; // частота слогов
for (int i = 0; i < m_params.m_samples; ++i) for (std::size_t i = 0; i < m_params.m_samples; ++i)
{ {
float t = i * 0.02f; float t = i * 0.02f;
float value = 0.0f; float value = 0.0f;
@@ -201,7 +209,7 @@ namespace hr
float a1 = m_params.m_amplitude; float a1 = m_params.m_amplitude;
float a2 = m_params.m_amplitude * 0.5f; float a2 = m_params.m_amplitude * 0.5f;
for (int i = 0; i < m_params.m_samples; ++i) for (std::size_t i = 0; i < m_params.m_samples; ++i)
{ {
float t = i * 0.02f; float t = i * 0.02f;
signal[i] = a1 * std::sin(2 * M_PI * f1 * t) + signal[i] = a1 * std::sin(2 * M_PI * f1 * t) +

View File

@@ -2,6 +2,7 @@
#include <random> #include <random>
#include "utils/workers/signal_type.hpp" #include "utils/workers/signal_type.hpp"
#include "utils/workers/result.hpp"
// Генерирует простую синусоиду и др. полезности см. workers/signal_type.hpp // Генерирует простую синусоиду и др. полезности см. workers/signal_type.hpp
namespace hr namespace hr
@@ -24,7 +25,8 @@ namespace hr
public: public:
signal_generator() : m_gen(12345) {} signal_generator() : m_gen(12345) {}
std::vector<float> generate(signal_type st, NOISE noise = NOISE::NO); public:
result generate(signal_type st, NOISE noise = NOISE::NO);
public: public:
struct signal_params struct signal_params
@@ -32,7 +34,7 @@ namespace hr
float m_amplitude = 1.0f; // A float m_amplitude = 1.0f; // A
float m_frequency = 1.0f; // 1/T float m_frequency = 1.0f; // 1/T
float m_noise_level = 0.7f; float m_noise_level = 0.7f;
int m_samples = 1200; std::size_t m_samples = 1200;
} m_params; } m_params;
private: private: