625{
626 auto energy_analyzer = std::make_shared<StandardEnergyAnalyzer>(window_size, hop_size);
627 energy_analyzer->set_energy_method(EnergyMethod::RMS);
628 auto energy_result = energy_analyzer->analyze_energy(input);
629
630 std::vector<Kakshya::Region> regions;
631
632 if (energy_result.channels.empty()) {
633 return regions;
634 }
635
636 const auto& first_channel = energy_result.channels[0];
637 std::optional<uint64_t> region_start;
638
639 for (size_t i = 0; i < first_channel.energy_values.size(); ++i) {
640 bool above_threshold = first_channel.energy_values[i] > energy_threshold;
641
642 if (above_threshold && !region_start.has_value()) {
643 if (i < first_channel.window_positions.size()) {
644 region_start = first_channel.window_positions[i].first;
645 }
646 } else if (!above_threshold && region_start.has_value()) {
647 if (i < first_channel.window_positions.size()) {
648 uint64_t region_end = first_channel.window_positions[i].second;
649
650 if (region_end - region_start.value() >= min_region_size) {
651 Kakshya::Region region;
652 region.start_coordinates = { region_start.value() };
653 region.end_coordinates = { region_end };
654 regions.push_back(region);
655 }
656 region_start.reset();
657 }
658 }
659 }
660
661 if (region_start.has_value() && !first_channel.window_positions.empty()) {
662 uint64_t region_end = first_channel.window_positions.back().second;
663 if (region_end - region_start.value() >= min_region_size) {
664 Kakshya::Region region;
665
666 region.start_coordinates = { region_start.value() };
667 region.end_coordinates = { region_end };
668 regions.push_back(region);
669 }
670 }
671
672 return regions;
673}