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

◆ transform_cross_correlate() [2/2]

template<OperationReadyData DataType>
DataType MayaFlux::Yantra::transform_cross_correlate ( DataType &  input,
const std::vector< double > &  template_signal,
bool  normalize = true 
)

Cross-correlation using FFT (convolution with time-reversed impulse) (IN-PLACE)

Template Parameters
DataTypeOperationReadyData type
Parameters
inputInput data - WILL BE MODIFIED
template_signalTemplate signal for correlation
normalizeWhether to normalize the result
Returns
Cross-correlated data

Definition at line 235 of file ConvolutionHelper.hpp.

236{
237 auto [target_data, structure_info] = OperationHelper::extract_structured_double(input);
238
239 std::vector<double> reversed_template(template_signal.rbegin(), template_signal.rend());
240
241 auto correlation_op = [](const Eigen::VectorXcd& input_fft,
242 const Eigen::VectorXcd& kernel_fft,
243 Eigen::VectorXcd& result_fft) {
244 std::ranges::transform(input_fft, kernel_fft, result_fft.begin(),
245 [](const std::complex<double>& a, const std::complex<double>& b) {
246 return a * std::conj(b);
247 });
248 };
249
250 for (auto& span : target_data) {
251 auto result = fft_convolve_helper(span, reversed_template, correlation_op);
252
253 if (normalize && !result.empty()) {
254 auto [min_it, max_it] = std::ranges::minmax_element(result);
255 double max_abs = std::max(std::abs(*min_it), std::abs(*max_it));
256 if (max_abs > 0.0) {
257 std::ranges::transform(result, result.begin(),
258 [max_abs](double val) { return val / max_abs; });
259 }
260 }
261
262 std::copy(result.begin(), result.begin() + std::min(result.size(), span.size()), span.begin());
263 }
264
265 auto reconstructed_data = target_data
266 | std::views::transform([](const auto& span) {
267 return std::vector<double>(span.begin(), span.end());
268 })
269 | std::ranges::to<std::vector>();
270
271 return OperationHelper::reconstruct_from_double<DataType>(reconstructed_data, structure_info);
272}

References MayaFlux::Yantra::OperationHelper::extract_structured_double(), fft_convolve_helper(), and MayaFlux::normalize().

Referenced by MayaFlux::Yantra::ConvolutionTransformer< InputType, OutputType >::transform_implementation(), transform_matched_filter(), and transform_matched_filter().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: