295{
296 auto analyzer = std::make_shared<Yantra::StandardEnergyAnalyzer>();
297 analyzer->set_energy_method(Yantra::EnergyMethod::ZERO_CROSSING);
298
299 auto result = analyzer->analyze_energy({ data });
300
301 if (result.channels.empty()) {
302 return {};
303 }
304
305 const auto& positions = result.channels[0].event_positions;
306
307 if (threshold <= 0.0) {
308 return positions;
309 }
310
311 auto double_data = std::get<std::vector<double>>(data);
312 std::vector<size_t> filtered;
313 for (size_t pos : positions) {
314 if (pos < double_data.size() && std::abs(double_data[pos]) >= threshold) {
315 filtered.push_back(pos);
316 }
317 }
318 return filtered;
319}