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

◆ transform_deconvolve() [2/2]

template<OperationReadyData DataType>
DataType MayaFlux::Yantra::transform_deconvolve ( DataType &  input,
const std::vector< double > &  impulse_to_remove,
double  regularization = 1e-6 
)

Deconvolution using frequency domain division (IN-PLACE) Useful for removing known impulse responses.

Template Parameters
DataTypeOperationReadyData type
Parameters
inputInput data - WILL BE MODIFIED
impulse_to_removeImpulse response to remove
regularizationRegularization factor for numerical stability
Returns
Deconvolved data

Definition at line 444 of file ConvolutionHelper.hpp.

445{
446 auto [target_data, structure_info] = OperationHelper::extract_structured_double(input);
447
448 auto deconvolution_op = [regularization](const Eigen::VectorXcd& input_fft,
449 const Eigen::VectorXcd& kernel_fft,
450 Eigen::VectorXcd& result_fft) {
451 std::ranges::transform(input_fft, kernel_fft, result_fft.begin(),
452 [regularization](const std::complex<double>& signal, const std::complex<double>& kernel) {
453 double magnitude_sq = std::norm(kernel);
454 if (magnitude_sq < regularization) {
455 return std::complex<double>(0.0, 0.0);
456 }
457 return signal * std::conj(kernel) / (magnitude_sq + regularization);
458 });
459 };
460
461 for (auto& span : target_data) {
462 auto result = fft_convolve_helper(span, impulse_to_remove, deconvolution_op);
463 std::copy(result.begin(), result.begin() + std::min(result.size(), span.size()), span.begin());
464 }
465
466 auto reconstructed_data = target_data
467 | std::views::transform([](const auto& span) {
468 return std::vector<double>(span.begin(), span.end());
469 })
470 | std::ranges::to<std::vector>();
471
472 return OperationHelper::reconstruct_from_double<DataType>(reconstructed_data, structure_info);
473}

References MayaFlux::Yantra::OperationHelper::extract_structured_double().

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

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