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

◆ transform_by_energy() [2/2]

template<OperationReadyData DataType, typename TransformFunc >
requires std::invocable<TransformFunc, double>
DataType MayaFlux::Yantra::transform_by_energy ( DataType &  input,
double  energy_threshold,
TransformFunc  transform_func,
uint32_t  window_size = 1024,
uint32_t  hop_size = 512 
)

Energy-based transformation using existing EnergyAnalyzer (IN-PLACE)

Template Parameters
DataTypeOperationReadyData type
TransformFuncFunction type for transformation
Parameters
inputInput data - WILL BE MODIFIED
energy_thresholdEnergy threshold for transformation
transform_funcTransformation function
window_sizeAnalysis window size
hop_sizeHop size between windows
Returns
Transformed data

Definition at line 140 of file MatrixHelper.hpp.

145{
146 auto [target_data, structure_info] = OperationHelper::extract_structured_double(input);
147
148 auto energy_analyzer = std::make_shared<StandardEnergyAnalyzer>(window_size, hop_size);
149 energy_analyzer->set_energy_method(EnergyMethod::RMS);
150 auto energy_result = energy_analyzer->analyze_energy(input);
151
152 for (size_t ch = 0; ch < energy_result.channels.size() && ch < target_data.size(); ++ch) {
153 const auto& channel_energy = energy_result.channels[ch];
154 auto& target_channel = target_data[ch];
155
156 for (size_t i = 0; i < channel_energy.energy_values.size(); ++i) {
157 if (channel_energy.energy_values[i] > energy_threshold && i < channel_energy.window_positions.size()) {
158 auto [start_idx, end_idx] = channel_energy.window_positions[i];
159
160 if (start_idx < target_channel.size() && end_idx <= target_channel.size()) {
161 auto window_span = target_channel.subspan(start_idx, end_idx - start_idx);
162 std::ranges::transform(window_span, window_span.begin(), transform_func);
163 }
164 }
165 }
166 }
167
168 auto reconstructed_data = target_data
169 | std::views::transform([](const auto& span) {
170 return std::vector<double>(span.begin(), span.end());
171 })
172 | std::ranges::to<std::vector>();
173
174 return OperationHelper::reconstruct_from_double<DataType>(reconstructed_data, structure_info);
175}

References MayaFlux::Yantra::OperationHelper::extract_structured_double(), and RMS.

+ Here is the call graph for this function: