30template <ComputeData InputType = std::vector<Kakshya::DataVariant>, ComputeData OutputType = InputType>
43 set_default_parameters();
52 return TransformationType::CONVOLUTION;
61 return std::string(
"ConvolutionTransformer_").append(Utils::enum_to_string(m_operation));
78 switch (m_operation) {
79 case ConvolutionOperation::DIRECT_CONVOLUTION: {
80 auto impulse_response = get_parameter_or<std::vector<double>>(
"impulse_response", std::vector<double> { 1.0 });
82 if (this->is_in_place()) {
88 case ConvolutionOperation::CROSS_CORRELATION: {
89 auto template_signal = get_parameter_or<std::vector<double>>(
"template_signal", std::vector<double> { 1.0 });
90 auto normalize = get_parameter_or<bool>(
"normalize",
true);
92 if (this->is_in_place()) {
98 case ConvolutionOperation::MATCHED_FILTER: {
99 auto reference_signal = get_parameter_or<std::vector<double>>(
"reference_signal", std::vector<double> { 1.0 });
101 if (this->is_in_place()) {
107 case ConvolutionOperation::DECONVOLUTION: {
108 auto impulse_response = get_parameter_or<std::vector<double>>(
"impulse_response", std::vector<double> { 1.0 });
109 auto regularization = get_parameter_or<double>(
"regularization", 1e-6);
111 if (this->is_in_place()) {
114 return create_output(
transform_deconvolve(input, impulse_response, regularization, m_working_buffer));
117 case ConvolutionOperation::AUTO_CORRELATION: {
118 auto normalize = get_parameter_or<bool>(
"normalize",
true);
120 if (this->is_in_place()) {
127 return create_output(input);
148 if (name ==
"operation") {
149 if (
auto op_result = safe_any_cast<ConvolutionOperation>(value)) {
150 m_operation = *op_result.value;
153 if (
auto str_result = safe_any_cast<std::string>(value)) {
154 if (
auto op_enum = Utils::string_to_enum_case_insensitive<ConvolutionOperation>(*str_result.value)) {
155 m_operation = *op_enum;
177 this->set_parameter(
"impulse_response", std::vector<double> { 1.0 });
178 this->set_parameter(
"template_signal", std::vector<double> { 1.0 });
179 this->set_parameter(
"reference_signal", std::vector<double> { 1.0 });
180 this->set_parameter(
"normalize",
true);
181 this->set_parameter(
"regularization", 1e-6);
191 template <
typename T>
194 auto param = this->get_transformation_parameter(name);
195 if (!param.has_value())
196 return default_value;
198 auto result = safe_any_cast<T>(param);
199 return result.value_or(default_value);
213 if constexpr (std::is_same_v<InputType, OutputType>) {
216 auto [result_data, metadata] = OperationHelper::extract_structured_double(input);
217 return this->convert_result(result_data, metadata);
DataType transform_auto_correlate_fft(DataType &input, bool normalize=true)
Auto-correlation using FFT (IN-PLACE)
ConvolutionOperation
Specific convolution operations supported.
@ DECONVOLUTION
Deconvolution.
@ DIRECT_CONVOLUTION
Standard convolution.
@ AUTO_CORRELATION
Auto-correlation.
@ CROSS_CORRELATION
Cross-correlation.
@ MATCHED_FILTER
Matched filtering.
DataType transform_matched_filter(DataType &input, const std::vector< double > &reference_signal)
Matched filter using cross-correlation for signal detection (IN-PLACE)
DataType 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.
DataType 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)
TransformationType
Categories of transformation operations for discovery and organization.
DataType transform_convolve(DataType &input, const std::vector< double > &impulse_response)
Convolution transformation using existing infrastructure with C++20 ranges (IN-PLACE)
void normalize(std::vector< double > &data, double target_peak)
Normalize single-channel data to specified peak level (in-place)
Input/Output container for computation pipeline data flow with structure preservation.