8namespace D = Kinesis::Discrete;
11 const std::vector<std::span<const double>>& channels,
12 double energy_threshold,
16 std::vector<std::vector<double>> result;
17 result.reserve(channels.size());
18 for (
const auto& ch : channels) {
20 result.emplace_back();
23 const uint32_t w = std::min(window_size,
static_cast<uint32_t
>(ch.size()));
24 const uint32_t h = std::max(1U, std::min(hop_size, w / 2));
26 std::vector<size_t> starts;
27 for (
size_t i = 0; i < energy.size(); ++i) {
28 if (energy[i] > energy_threshold)
29 starts.push_back(i * h);
38 const std::vector<std::span<const double>>& channels,
43 std::vector<std::vector<double>> result;
44 result.reserve(channels.size());
45 for (
const auto& ch : channels) {
47 result.emplace_back();
51 const auto [lo, hi] = std::ranges::minmax_element(ch);
52 if (*hi - *lo < std::numeric_limits<double>::epsilon()) {
53 result.emplace_back();
56 const auto pos =
D::peak_positions(ch, threshold,
static_cast<size_t>(min_distance));
65 const std::vector<std::span<const double>>& channels,
66 double std_dev_threshold,
70 std::vector<std::vector<double>> result;
71 result.reserve(channels.size());
72 for (
const auto& ch : channels) {
74 result.emplace_back();
77 const uint32_t w = std::min(window_size,
static_cast<uint32_t
>(ch.size()));
78 const uint32_t h = std::max(1U, std::min(hop_size, w / 2));
80 const auto means =
D::mean(ch, nw, h, w);
83 result.emplace_back();
88 for (
double v : means)
90 gm /=
static_cast<double>(means.size());
93 for (
double v : means)
94 var += (v - gm) * (v - gm);
95 const double gs = std::sqrt(var /
static_cast<double>(means.size()));
98 result.emplace_back();
102 std::vector<size_t> starts;
103 for (
size_t i = 0; i < means.size(); ++i) {
104 if (std::abs(means[i] - gm) > std_dev_threshold * gs)
105 starts.push_back(i * h);
116 const std::vector<std::span<const double>>& channels,
117 double spectral_threshold,
118 uint32_t window_size,
121 std::vector<std::vector<double>> result;
122 result.reserve(channels.size());
123 for (
const auto& ch : channels) {
125 result.emplace_back();
128 const uint32_t w = std::min(window_size,
static_cast<uint32_t
>(ch.size()));
129 const uint32_t h = std::max(1U, std::min(hop_size, w / 2));
132 std::vector<size_t> starts;
133 for (
size_t i = 0; i < energy.size(); ++i) {
134 if (energy[i] > spectral_threshold)
135 starts.push_back(i * h);
145 const std::vector<std::span<const double>>& channels,
146 double mean_multiplier,
147 uint32_t window_size,
150 std::vector<std::vector<double>> result;
151 result.reserve(channels.size());
152 for (
const auto& ch : channels) {
154 result.emplace_back();
157 const uint32_t w = std::min(window_size,
static_cast<uint32_t
>(ch.size()));
158 const uint32_t h = std::max(1U, std::min(hop_size, w / 2));
162 for (
double v : means)
166 gm /=
static_cast<double>(means.size());
168 const double thr = gm * mean_multiplier;
170 std::vector<size_t> starts;
171 for (
size_t i = 0; i < means.size(); ++i) {
173 starts.push_back(i * h);
183 const std::vector<std::span<const double>>& channels,
184 uint32_t window_size,
187 std::vector<std::vector<double>> result;
188 result.reserve(channels.size());
189 for (
const auto& ch : channels)
195 const std::vector<std::span<const double>>& channels,
198 uint32_t region_size)
200 std::vector<std::vector<double>> result;
201 result.reserve(channels.size());
202 for (
const auto& ch : channels) {
203 if (ch.empty() || region_size == 0) {
204 result.emplace_back();
208 std::vector<size_t> filtered;
210 for (
size_t p : all) {
211 if (filtered.empty() || (p - last) >=
static_cast<size_t>(min_distance)) {
212 filtered.push_back(p);
224 const std::vector<std::span<const double>>& channels,
225 double silence_threshold,
226 uint32_t min_duration,
227 uint32_t window_size,
230 std::vector<std::vector<double>> result;
231 result.reserve(channels.size());
232 for (
const auto& ch : channels) {
234 result.emplace_back();
237 const uint32_t w = std::min(window_size,
static_cast<uint32_t
>(ch.size()));
238 const uint32_t h = std::max(1U, std::min(hop_size, w / 2));
240 std::vector<size_t> starts;
241 for (
size_t i = 0; i < energy.size(); ++i) {
242 if (energy[i] <= silence_threshold && w >= min_duration) {
243 starts.push_back(i * h);
253 const std::vector<std::span<const double>>& channels,
255 uint32_t region_size,
256 uint32_t fft_window_size,
259 std::vector<std::vector<double>> result;
260 result.reserve(channels.size());
261 for (
const auto& ch : channels) {
263 result.emplace_back();
Discrete sequence analysis primitives for MayaFlux::Kinesis.
std::vector< double > overlapping_windows(std::span< const double > data, uint32_t window_size, double overlap)
Extract overlapping windows as a flat concatenated vector.
std::vector< double > mean(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Arithmetic mean per window.
std::vector< double > spectral_energy(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Spectral energy per window using Hann-windowed FFT.
std::vector< size_t > zero_crossing_positions(std::span< const double > data, double threshold)
Sample indices of zero crossings in the full span.
std::vector< std::pair< size_t, size_t > > merge_intervals(const std::vector< std::pair< size_t, size_t > > &intervals)
Merge overlapping or adjacent half-open intervals.
std::vector< size_t > peak_positions(std::span< const double > data, double threshold, size_t min_distance)
Sample indices of local peak maxima in the full span.
std::vector< size_t > onset_positions(std::span< const double > data, uint32_t window_size, uint32_t hop_size, double threshold)
Sample indices of onsets detected via spectral flux.
std::vector< std::pair< size_t, size_t > > intervals_from_window_starts(const std::vector< size_t > &window_starts, uint32_t window_size, size_t data_size)
Build [start, end) intervals from window start indices.
std::vector< double > slice_intervals(std::span< const double > data, const std::vector< std::pair< size_t, size_t > > &intervals)
Copy data from a set of half-open intervals into a flat vector.
size_t num_windows(size_t data_size, uint32_t window_size, uint32_t hop_size) noexcept
Compute the number of analysis windows for a given data size.
std::vector< std::pair< size_t, size_t > > regions_around_positions(const std::vector< size_t > &positions, size_t half_region, size_t data_size)
Build [start, end) intervals centred on a set of positions.
std::vector< double > rms(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
RMS energy per window.
std::vector< std::vector< double > > extract_outliers(const std::vector< std::span< const double > > &channels, double std_dev_threshold, uint32_t window_size, uint32_t hop_size)
std::vector< std::vector< double > > extract_onsets(const std::vector< std::span< const double > > &channels, double threshold, uint32_t region_size, uint32_t fft_window_size, uint32_t hop_size)
std::vector< std::vector< double > > extract_above_mean(const std::vector< std::span< const double > > &channels, double mean_multiplier, uint32_t window_size, uint32_t hop_size)
std::vector< std::vector< double > > extract_high_energy(const std::vector< std::span< const double > > &channels, double energy_threshold, uint32_t window_size, uint32_t hop_size)
std::vector< std::vector< double > > extract_zero_crossings(const std::vector< std::span< const double > > &channels, double threshold, double min_distance, uint32_t region_size)
std::vector< std::vector< double > > extract_peaks(const std::vector< std::span< const double > > &channels, double threshold, double min_distance, uint32_t region_size)
std::vector< std::vector< double > > extract_silence(const std::vector< std::span< const double > > &channels, double silence_threshold, uint32_t min_duration, uint32_t window_size, uint32_t hop_size)
std::vector< std::vector< double > > extract_overlapping_windows(const std::vector< std::span< const double > > &channels, uint32_t window_size, double overlap)
std::vector< std::vector< double > > extract_high_spectral(const std::vector< std::span< const double > > &channels, double spectral_threshold, uint32_t window_size, uint32_t hop_size)