MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Convolution.hpp
Go to the documentation of this file.
1#pragma once
2
4
5/**
6 * @brief Frequency-domain processor callback for apply_convolution
7 *
8 * Receives the one-sided FFT of the signal and the kernel, writes the
9 * result into the third argument. All three vectors have length fft_size/2+1.
10 */
11using ConvolutionProcessor = std::function<void(
12 const std::vector<std::complex<double>>& signal_fft,
13 const std::vector<std::complex<double>>& kernel_fft,
14 std::vector<std::complex<double>>& result_fft)>;
15
16/**
17 * @brief Core FFT convolution engine
18 * @param src Input signal
19 * @param kernel Kernel signal
20 * @param processor Frequency-domain operation
21 * @param full_size When true returns linear convolution length (N+M-1);
22 * when false returns the same number of samples as @p src
23 * @return Processed output
24 */
25[[nodiscard]] std::vector<double> apply_convolution(
26 std::span<const double> src,
27 std::span<const double> kernel,
28 const ConvolutionProcessor& processor,
29 bool full_size = false);
30
31/**
32 * @brief Linear FFT convolution
33 * @param src Input signal
34 * @param ir Impulse response
35 * @return Convolved output, same length as @p src
36 */
37[[nodiscard]] std::vector<double> convolve(
38 std::span<const double> src,
39 std::span<const double> ir);
40
41/**
42 * @brief Cross-correlation via FFT
43 * @param src Input signal
44 * @param tmpl Template signal
45 * @param normalize Normalise result to peak absolute value
46 * @return Cross-correlation, same length as @p src
47 */
48[[nodiscard]] std::vector<double> cross_correlate(
49 std::span<const double> src,
50 std::span<const double> tmpl,
51 bool normalize = true);
52
53/**
54 * @brief Matched filter (normalised cross-correlation)
55 * @param src Input signal
56 * @param reference Reference signal
57 * @return Matched filter output, same length as @p src
58 */
59[[nodiscard]] std::vector<double> matched_filter(
60 std::span<const double> src,
61 std::span<const double> reference);
62
63/**
64 * @brief Frequency-domain deconvolution with Tikhonov regularisation
65 * @param src Input signal
66 * @param ir Impulse response to invert
67 * @param regularization Regularisation factor for numerical stability
68 * @return Deconvolved output, same length as @p src
69 */
70[[nodiscard]] std::vector<double> deconvolve(
71 std::span<const double> src,
72 std::span<const double> ir,
73 double regularization = 1e-6);
74
75/**
76 * @brief Auto-correlation via FFT
77 * @param src Input signal
78 * @param normalize Normalise result to zero-lag peak
79 * @return Auto-correlation, same length as @p src
80 */
81[[nodiscard]] std::vector<double> auto_correlate(
82 std::span<const double> src,
83 bool normalize = true);
84
85} // namespace MayaFlux::Kinesis::Discrete
std::vector< double > cross_correlate(std::span< const double > src, std::span< const double > tmpl, bool normalize)
Cross-correlation via FFT.
std::vector< double > deconvolve(std::span< const double > src, std::span< const double > ir, double regularization)
Frequency-domain deconvolution with Tikhonov regularisation.
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::function< void(const std::vector< std::complex< double > > &signal_fft, const std::vector< std::complex< double > > &kernel_fft, std::vector< std::complex< double > > &result_fft)> ConvolutionProcessor
Frequency-domain processor callback for apply_convolution.
void normalize(std::span< double > data, double target_min, double target_max) noexcept
Normalize to [target_min, target_max] in-place Single-pass min/max reduction followed by a single tra...
Definition Transform.cpp:61
std::vector< double > auto_correlate(std::span< const double > src, bool normalize)
Auto-correlation via FFT.
std::vector< double > convolve(std::span< const double > src, std::span< const double > ir)
Linear FFT convolution.
std::vector< double > matched_filter(std::span< const double > src, std::span< const double > reference)
Matched filter (normalised cross-correlation)