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