MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Extract.hpp
Go to the documentation of this file.
1#pragma once
2
3/**
4 * @file Extract.hpp
5 * @brief Discrete sequence extraction primitives for MayaFlux::Kinesis
6 *
7 * Pure numerical functions operating on contiguous double-precision spans.
8 * No MayaFlux type dependencies. Domain-agnostic — the same primitives
9 * serve audio, visual, control, and any other sampled sequence.
10 *
11 * Analysis answers "which windows qualify?" Extract answers "give me the data."
12 * Callers loop over channels; no multichannel wrappers are provided.
13 */
14
16
17// ============================================================================
18// Window parameter validation
19// ============================================================================
20
21/**
22 * @brief Validate window/hop parameters for windowed processing
23 * @param window_size Samples per window
24 * @param hop_size Samples between window starts
25 * @param data_size Number of input samples (0 = accept unconditionally)
26 * @return true if parameters permit at least one processing pass
27 */
28[[nodiscard]] bool validate_window_parameters(
29 uint32_t window_size,
30 uint32_t hop_size,
31 size_t data_size) noexcept;
32
33// ============================================================================
34// Interval utilities
35// ============================================================================
36
37/**
38 * @brief Merge overlapping or adjacent half-open intervals
39 * @param intervals Unsorted [start, end) pairs
40 * @return Sorted, non-overlapping merged intervals
41 */
42[[nodiscard]] std::vector<std::pair<size_t, size_t>> merge_intervals(
43 const std::vector<std::pair<size_t, size_t>>& intervals);
44
45/**
46 * @brief Copy data from a set of half-open intervals into a flat vector
47 * @param data Source span
48 * @param intervals Sorted, non-overlapping [start, end) pairs
49 * @return Concatenated data from all intervals
50 */
51[[nodiscard]] std::vector<double> slice_intervals(
52 std::span<const double> data,
53 const std::vector<std::pair<size_t, size_t>>& intervals);
54
55/**
56 * @brief Build [start, end) intervals centred on a set of positions
57 * @param positions Sample indices of region centres
58 * @param half_region Radius in samples on each side
59 * @param data_size Total span length for clamping
60 * @return One [start, end) pair per position
61 */
62[[nodiscard]] std::vector<std::pair<size_t, size_t>> regions_around_positions(
63 const std::vector<size_t>& positions,
64 size_t half_region,
65 size_t data_size);
66
67/**
68 * @brief Build [start, end) intervals from window start indices
69 * @param window_starts Starting sample indices of qualifying windows
70 * @param window_size Samples per window
71 * @param data_size Total span length for clamping
72 * @return One [start, end) pair per window start
73 */
74[[nodiscard]] std::vector<std::pair<size_t, size_t>> intervals_from_window_starts(
75 const std::vector<size_t>& window_starts,
76 uint32_t window_size,
77 size_t data_size);
78
79// ============================================================================
80// Windowing
81// ============================================================================
82
83/**
84 * @brief Extract overlapping windows as a flat concatenated vector
85 * @param data Source span
86 * @param window_size Samples per window
87 * @param overlap Overlap ratio in [0, 1)
88 * @return Concatenated window data; empty if window_size == 0 or overlap >= 1
89 */
90[[nodiscard]] std::vector<double> overlapping_windows(
91 std::span<const double> data,
92 uint32_t window_size,
93 double overlap);
94
95/**
96 * @brief Extract windows at specific starting indices as a flat concatenated vector
97 * @param data Source span
98 * @param window_starts Starting sample indices
99 * @param window_size Samples per window
100 * @return Concatenated window data
101 */
102[[nodiscard]] std::vector<double> windowed_by_indices(
103 std::span<const double> data,
104 const std::vector<size_t>& window_starts,
105 uint32_t window_size);
106
107} // namespace MayaFlux::Kinesis::Discrete
Eigen::Index overlap
std::vector< double > overlapping_windows(std::span< const double > data, uint32_t window_size, double overlap)
Extract overlapping windows as a flat concatenated vector.
Definition Extract.cpp:83
std::vector< double > windowed_by_indices(std::span< const double > data, const std::vector< size_t > &window_starts, uint32_t window_size)
Extract windows at specific starting indices as a flat concatenated vector.
Definition Extract.cpp:101
bool validate_window_parameters(uint32_t window_size, uint32_t hop_size, size_t data_size) noexcept
Validate window/hop parameters for windowed processing.
Definition Extract.cpp:5
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.
Definition Extract.cpp:14
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.
Definition Extract.cpp:68
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.
Definition Extract.cpp:39
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.
Definition Extract.cpp:52