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

◆ transform_auto_correlate_fft() [1/2]

template<OperationReadyData DataType>
DataType MayaFlux::Yantra::transform_auto_correlate_fft ( DataType &  input,
bool  normalize = true 
)

Auto-correlation using FFT (IN-PLACE)

Template Parameters
DataTypeOperationReadyData type
Parameters
inputInput data - will be modified
normalizeWhether to normalize the result
Returns
Auto-correlated data

Definition at line 326 of file ConvolutionHelper.hpp.

327{
328 auto [target_data, structure_info] = OperationHelper::extract_structured_double(input);
329
330 // For auto-correlation using FFT:
331 // R(k) = IFFT(FFT(x) * conj(FFT(x)))
332
333 auto correlation_op = [](const Eigen::VectorXcd& input_fft,
334 const Eigen::VectorXcd& /* unused */,
335 Eigen::VectorXcd& result_fft) {
336 std::ranges::transform(input_fft, input_fft, result_fft.begin(),
337 [](const std::complex<double>& a, const std::complex<double>& b) {
338 return a * std::conj(b);
339 });
340 };
341
342 for (auto& span : target_data) {
343 std::vector<double> signal_copy(span.begin(), span.end());
344 auto result = fft_convolve_helper(span, signal_copy, correlation_op);
345
346 if (normalize && !result.empty()) {
347 double max_val = *std::max_element(result.begin(), result.end());
348 if (max_val > 0.0) {
349 std::ranges::transform(result, result.begin(),
350 [max_val](double val) { return val / max_val; });
351 }
352 }
353
354 std::copy(result.begin(), result.begin() + std::min(result.size(), span.size()), span.begin());
355 }
356
357 auto reconstructed_data = target_data
358 | std::views::transform([](const auto& span) {
359 return std::vector<double>(span.begin(), span.end());
360 })
361 | std::ranges::to<std::vector>();
362
363 return OperationHelper::reconstruct_from_double<DataType>(reconstructed_data, structure_info);
364}

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

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

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