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

◆ transform_deconvolve() [1/2]

template<OperationReadyData DataType>
DataType MayaFlux::Yantra::transform_deconvolve ( DataType &  input,
const std::vector< double > &  impulse_to_remove,
double  regularization,
std::vector< std::vector< double > > &  working_buffer 
)

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

Template Parameters
DataTypeOperationReadyData type
Parameters
inputInput data - will NOT be modified
impulse_to_removeImpulse response to remove
regularizationRegularization factor for numerical stability
working_bufferBuffer for operations (will be resized if needed)
Returns
Deconvolved data

Definition at line 486 of file ConvolutionHelper.hpp.

487{
488 auto [target_data, structure_info] = OperationHelper::setup_operation_buffer(input, working_buffer);
489
490 auto deconvolution_op = [regularization](const Eigen::VectorXcd& input_fft,
491 const Eigen::VectorXcd& kernel_fft,
492 Eigen::VectorXcd& result_fft) {
493 std::ranges::transform(input_fft, kernel_fft, result_fft.begin(),
494 [regularization](const std::complex<double>& signal, const std::complex<double>& kernel) {
495 double magnitude_sq = std::norm(kernel);
496 if (magnitude_sq < regularization) {
497 return std::complex<double>(0.0, 0.0);
498 }
499 return signal * std::conj(kernel) / (magnitude_sq + regularization);
500 });
501 };
502
503 working_buffer.clear();
504 working_buffer.resize(target_data.size());
505
506 for (size_t i = 0; i < target_data.size(); ++i) {
507 working_buffer[i] = fft_convolve_helper(target_data[i], impulse_to_remove, deconvolution_op);
508 }
509
510 return OperationHelper::reconstruct_from_double<DataType>(working_buffer, structure_info);
511}

References transform_deconvolve().

+ Here is the call graph for this function: