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

◆ cross_correlate()

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 90 of file Convolution.cpp.

94{
95 std::vector<double> reversed(tmpl.rbegin(), tmpl.rend());
96
97 auto out = apply_convolution(src, reversed,
98 [](const auto& s, const auto& k, auto& r) {
99 P::transform(P::par_unseq, s.begin(), s.end(), k.begin(), r.begin(),
100 [](const std::complex<double>& a, const std::complex<double>& b) {
101 return a * std::conj(b);
102 });
103 });
104
105 if (normalize && !out.empty()) {
106 const auto [mn, mx] = std::ranges::minmax_element(out);
107 const double peak = std::max(std::abs(*mn), std::abs(*mx));
108 if (peak > 0.0) {
109 P::transform(P::par_unseq, out.begin(), out.end(), out.begin(),
110 [peak](double v) { return v / peak; });
111 }
112 }
113
114 return out;
115}
size_t a
size_t b
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.
std::vector< double > reversed(const std::vector< double > &data)
Reverse time order of single-channel data (non-destructive)
Definition Yantra.cpp:651
double peak(const std::vector< double > &data)
Find peak amplitude in single-channel data.
Definition Yantra.cpp:216

References a, apply_convolution(), b, normalize(), peak(), and MayaFlux::reversed().

Referenced by matched_filter().

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