add signal type as own struc

This commit is contained in:
2026-02-18 19:09:55 +03:00
parent 90ddfe06a6
commit b3151cad76
6 changed files with 90 additions and 63 deletions

View File

@@ -4,7 +4,10 @@
auto main() -> int auto main() -> int
{ {
hr::signal_generator generator; hr::signal_generator generator;
auto s = generator.generate(hr::SIGNAL_TYPE::SIN); hr::signal_type st;
hack::log()(hr::get_signal_name(hr::SIGNAL_TYPE::SIN)); st.m_type = hr::signal_type::type::SIN;
auto s = generator.generate(st);
hack::log()(st.get_name());
hack::log()(s); hack::log()(s);
} }

View File

@@ -4,30 +4,30 @@
namespace hr namespace hr
{ {
std::vector<float> signal_generator::generate(SIGNAL_TYPE type, NOISE noise) std::vector<float> signal_generator::generate(signal_type st, NOISE noise)
{ {
std::vector<float> res; std::vector<float> res;
switch (type) switch (st.m_type)
{ {
case SIGNAL_TYPE::SIN: case signal_type::type::SIN:
res = sin(noise); res = sin(noise);
break; break;
case SIGNAL_TYPE::SQUARE: case signal_type::type::SQUARE:
res = square(noise); res = square(noise);
break; break;
case SIGNAL_TYPE::TRIANGLE: case signal_type::type::TRIANGLE:
res = triangle(noise); res = triangle(noise);
break; break;
case SIGNAL_TYPE::SAW: case signal_type::type::SAW:
res = saw(noise); res = saw(noise);
break; break;
case SIGNAL_TYPE::SPEECH_LIKE: case signal_type::type::SPEECH_LIKE:
res = speech_like(noise); res = speech_like(noise);
break; break;
case SIGNAL_TYPE::NOISE_ONLY: case signal_type::type::NOISE_ONLY:
res = noise_only(); res = noise_only();
break; break;
case SIGNAL_TYPE::THREE_SINES: case signal_type::type::THREE_SINES:
res = three_sines(noise); res = three_sines(noise);
break; break;
} }

View File

@@ -1,41 +1,11 @@
#pragma once #pragma once
#include <random> #include <random>
#include "utils/var.hpp" #include "utils/workers/signal_type.hpp"
// Генерирует простую синусоиду и др. полезности см. SIGNAL_TYPE // Генерирует простую синусоиду и др. полезности см. workers/signal_type.hpp
namespace hr namespace hr
{ {
std::string inline get_signal_name(SIGNAL_TYPE t)
{
std::string name;
switch (t)
{
case SIGNAL_TYPE::SIN:
name = "SIN";
break;
case SIGNAL_TYPE::SQUARE:
name = "SQUARE";
break;
case SIGNAL_TYPE::TRIANGLE:
name = "TRIANGLE";
break;
case SIGNAL_TYPE::SAW:
name = "SAW";
break;
case SIGNAL_TYPE::NOISE_ONLY:
name = "NOISE_ONLY";
break;
case SIGNAL_TYPE::SPEECH_LIKE:
name = "SPEECH_LIKE";
break;
case SIGNAL_TYPE::THREE_SINES:
name = "THREE_SINES";
break;
}
return name;
};
enum class NOISE enum class NOISE
{ {
NO, NO,
@@ -54,7 +24,7 @@ namespace hr
public: public:
signal_generator() : m_gen(12345) {} signal_generator() : m_gen(12345) {}
std::vector<float> generate(SIGNAL_TYPE type, NOISE noise = NOISE::NO); std::vector<float> generate(signal_type st, NOISE noise = NOISE::NO);
public: public:
struct signal_params struct signal_params

View File

@@ -1,20 +1,4 @@
#pragma once #pragma once
#include "noincl.hpp" // IWYU pragma: keep #include "noincl.hpp" // IWYU pragma: keep
namespace hr { }
namespace hr
{
enum class SIGNAL_TYPE
{
FILE, // Из файла
SIN, // Синусоида
SQUARE, // Прямоугольный
TRIANGLE, // Треугольный
SAW, // Пилообразный
NOISE_ONLY, // Только шум
SPEECH_LIKE, // Типа речь
THREE_SINES // Три частоты
};
}

View File

@@ -1,7 +1,7 @@
#pragma once #pragma once
#include "utils/workers/signal_type.hpp"
#include <filesystem> #include <filesystem>
#include "utils/var.hpp"
namespace hr namespace hr
{ {
@@ -18,10 +18,11 @@ namespace hr
int m_frames; int m_frames;
int m_channels; int m_channels;
SIGNAL_TYPE m_signal_type = SIGNAL_TYPE::FILE;
std::filesystem::path m_file; std::filesystem::path m_file;
std::size_t m_block_size = 1'024; std::size_t m_block_size = 1'024;
std::size_t m_step_size = 512; std::size_t m_step_size = 512;
signal_type m_signal_type;
DOMAIN_PLUGIN m_domain = DOMAIN_PLUGIN::FREQUENSY; DOMAIN_PLUGIN m_domain = DOMAIN_PLUGIN::FREQUENSY;
}; };
} }

View File

@@ -0,0 +1,69 @@
#pragma once
#include <vector>
#include <string>
namespace hr
{
// Некая структура описывающая базоввые типы сигналов
struct signal_type
{
enum class type
{
FILE, // Из файла
SIN, // Синусоида
SQUARE, // Прямоугольный
TRIANGLE, // Треугольный
SAW, // Пилообразный
NOISE_ONLY, // Только шум
SPEECH_LIKE, // Типа речь
THREE_SINES // Три частоты
} m_type = type::FILE;
signal_type() = default;
explicit signal_type(type t) : m_type(t) {}
// Получить имя типа
std::string get_name() const
{
switch (m_type)
{
case type::FILE: return "FILE";
case type::SIN: return "SIN";
case type::SQUARE: return "SQUARE";
case type::TRIANGLE: return "TRIANGLE";
case type::SAW: return "SAW";
case type::NOISE_ONLY: return "NOISE_ONLY";
case type::SPEECH_LIKE: return "SPEECH_LIKE";
case type::THREE_SINES: return "THREE_SINES";
default: return "UNKNOWN";
}
}
bool operator<(const signal_type& other) const
{
return m_type < other.m_type;
}
bool operator==(const signal_type& other) const
{
return m_type == other.m_type;
}
};
// просто для итерации в графическом интерфейсе
inline const std::vector<signal_type>& all_types()
{
static const std::vector<signal_type> signals = {
signal_type(signal_type::type::FILE),
signal_type(signal_type::type::SIN),
signal_type(signal_type::type::SQUARE),
signal_type(signal_type::type::TRIANGLE),
signal_type(signal_type::type::SAW),
signal_type(signal_type::type::NOISE_ONLY),
signal_type(signal_type::type::SPEECH_LIKE),
signal_type(signal_type::type::THREE_SINES)
};
return signals;
}
}