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