MayaFlux 0.3.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 620 of file MatrixHelper.hpp.

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}

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