MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ dynamic_range()

std::vector< double > MayaFlux::Kinesis::Discrete::dynamic_range ( std::span< const double >  data,
size_t  n_windows,
uint32_t  hop_size,
uint32_t  window_size 
)

Dynamic range in dB per window.

Computes 20*log10(max_abs / max(min_abs, 1e-10)) per window.

Parameters
dataInput span
n_windowsPre-computed window count from num_windows()
hop_sizeSamples between window starts
window_sizeSamples per window
Returns
Per-window dynamic range values in dB

Definition at line 89 of file Analysis.cpp.

90{
91 std::vector<double> out(n_windows);
92 std::vector<size_t> idx(n_windows);
93 std::iota(idx.begin(), idx.end(), 0);
94
95 Parallel::for_each(Parallel::par_unseq, idx.begin(), idx.end(),
96 [&](size_t i) {
97 const size_t start = i * hop_size;
98 auto w = data.subspan(start, std::min<size_t>(window_size, data.size() - start));
99 double mn = std::numeric_limits<double>::max();
100 double mx = std::numeric_limits<double>::lowest();
101 for (double s : w) {
102 double a = std::abs(s);
103 mn = std::min(mn, a);
104 mx = std::max(mx, a);
105 }
106 out[i] = 20.0 * std::log10(mx / std::max(mn, k_epsilon));
107 });
108
109 return out;
110}