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

◆ cross_correlate()

MAYAFLUX_API std::vector< double > MayaFlux::Kinesis::Discrete::cross_correlate ( std::span< const double >  src,
std::span< const double >  tmpl,
bool  normalize = true 
)

Cross-correlation via FFT.

Parameters
srcInput signal
tmplTemplate signal
normalizeNormalise result to peak absolute value
Returns
Cross-correlation, same length as src

Definition at line 88 of file Convolution.cpp.

92{
93 std::vector<double> reversed(tmpl.rbegin(), tmpl.rend());
94
95 auto out = apply_convolution(src, reversed,
96 [](const auto& s, const auto& k, auto& r) {
97 std::transform(std::execution::par_unseq, s.begin(), s.end(), k.begin(), r.begin(),
98 [](const std::complex<double>& a, const std::complex<double>& b) {
99 return a * std::conj(b);
100 });
101 });
102
103 if (normalize && !out.empty()) {
104 const auto [mn, mx] = std::ranges::minmax_element(out);
105 const double peak = std::max(std::abs(*mn), std::abs(*mx));
106 if (peak > 0.0) {
107 std::transform(std::execution::par_unseq, out.begin(), out.end(), out.begin(),
108 [peak](double v) { return v / peak; });
109 }
110 }
111
112 return out;
113}
const uint32_t * src
size_t a
size_t b
std::vector< float > * out
std::vector< double > apply_convolution(std::span< const double > src, std::span< const double > kernel, const ConvolutionProcessor &processor, bool full_size)
Core FFT convolution engine.

References a, apply_convolution(), b, normalize(), out, peak(), and src.

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

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