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

◆ transform_convolve() [2/2]

template<OperationReadyData DataType>
DataType MayaFlux::Yantra::transform_convolve ( DataType &  input,
const std::vector< double > &  impulse_response,
std::vector< std::vector< double > > &  working_buffer 
)

Convolution transformation using existing infrastructure with C++20 ranges (OUT-OF-PLACE)

Template Parameters
DataTypeOperationReadyData type
Parameters
inputInput data - will NOT be modified
impulse_responseImpulse response for convolution
working_bufferBuffer for operations (will be resized if needed)
Returns
Convolved data

Definition at line 190 of file ConvolutionHelper.hpp.

191{
192 if (impulse_response.size() == 1) {
193 if (std::abs(impulse_response[0] - 1.0) < 1e-15) {
194 return input;
195 } else {
196 auto [target_data, structure_info] = OperationHelper::setup_operation_buffer(input, working_buffer);
197 for (size_t i = 0; i < target_data.size(); ++i) {
198 std::ranges::transform(target_data[i], working_buffer[i].begin(),
199 [gain = impulse_response[0]](double x) { return x * gain; });
200 }
201 return OperationHelper::reconstruct_from_double<DataType>(working_buffer, structure_info);
202 }
203 }
204
205 auto [target_data, structure_info] = OperationHelper::setup_operation_buffer(input, working_buffer);
206
207 working_buffer.clear();
208 working_buffer.resize(target_data.size());
209
210 auto convolution_op = [](const Eigen::VectorXcd& input_fft,
211 const Eigen::VectorXcd& kernel_fft,
212 Eigen::VectorXcd& result_fft) {
213 std::ranges::transform(input_fft, kernel_fft, result_fft.begin(),
214 [](const std::complex<double>& a, const std::complex<double>& b) {
215 return a * b;
216 });
217 };
218
219 for (size_t i = 0; i < target_data.size(); ++i) {
220 working_buffer[i] = fft_convolve_helper(target_data[i], std::span<const double>(impulse_response), convolution_op, false);
221 }
222
223 return OperationHelper::reconstruct_from_double<DataType>(working_buffer, structure_info);
224}
std::vector< double > fft_convolve_helper(std::span< const double > data_span, std::span< const double > kernel, OperationFunc &&operation, bool return_full_size=true)
Common FFT convolution helper to eliminate code duplication.

References fft_convolve_helper(), and MayaFlux::Yantra::OperationHelper::setup_operation_buffer().

+ Here is the call graph for this function: