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

◆ detect_regions_by_energy()

template<OperationReadyData DataType>
std::vector< Kakshya::Region > MayaFlux::Yantra::detect_regions_by_energy ( const DataType &  input,
double  energy_threshold,
uint32_t  min_region_size,
uint32_t  window_size,
uint32_t  hop_size 
)

Detect regions based on energy threshold using existing EnergyAnalyzer.

Template Parameters
DataTypeOperationReadyData type
Parameters
inputInput data
energy_thresholdEnergy threshold for region detection
min_region_sizeMinimum size of detected regions in samples
window_sizeAnalysis window size
hop_sizeHop size between windows
Returns
Detected regions

Definition at line 618 of file MatrixHelper.hpp.

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}

References MayaFlux::Kakshya::Region::end_coordinates, RMS, and MayaFlux::Kakshya::Region::start_coordinates.