pub struct FftConvolution { /* private fields */ }Expand description
GPU-accelerated FFT-based 1D linear convolution.
Internally uses two Fft1d dispatches (forward FFT of signal and kernel,
then inverse FFT of the pointwise product). Complex multiplication is done
on the CPU because the buffer is small relative to the GPU dispatch overhead.
§Construction
use std::sync::Arc;
use oxigdal_gpu::convolution_fft::FftConvolution;
use oxigdal_gpu::GpuContext;
let ctx = Arc::new(GpuContext::new().await?);
let conv = FftConvolution::new(Arc::clone(&ctx));Implementations§
Source§impl FftConvolution
impl FftConvolution
Sourcepub fn new(ctx: Arc<GpuContext>) -> Self
pub fn new(ctx: Arc<GpuContext>) -> Self
Create a new FftConvolution bound to the given GPU context.
Sourcepub fn convolve(&self, signal: &[f32], kernel: &[f32]) -> GpuResult<Vec<f32>>
pub fn convolve(&self, signal: &[f32], kernel: &[f32]) -> GpuResult<Vec<f32>>
Compute the linear 1D convolution of signal with kernel.
Output length: signal.len() + kernel.len() - 1.
Both sequences are zero-padded to fft_size = (output_len).next_power_of_two().
Forward FFTs of each padded sequence are computed on the GPU, complex
multiplication is performed on the CPU, and then the inverse FFT is
computed on the GPU. Only the first output_len samples of the IFFT
result are returned (the remainder is circular aliasing that vanishes
because of the zero-padding).
§Errors
- Returns
GpuError::InvalidKernelParamswhenfft_size > MAX_FFT_CONVOLUTION_SIZE. - Returns a
GpuErrorvariant on any GPU pipeline or buffer error.
Sourcepub fn correlate(&self, signal: &[f32], kernel: &[f32]) -> GpuResult<Vec<f32>>
pub fn correlate(&self, signal: &[f32], kernel: &[f32]) -> GpuResult<Vec<f32>>
Compute the linear 1D cross-correlation of signal with kernel.
Cross-correlation is equivalent to convolution with a time-reversed
kernel. This method reverses kernel and delegates to Self::convolve.
Output length: signal.len() + kernel.len() - 1 (same as convolution).
§Errors
Propagates any error from Self::convolve.
Sourcepub fn convolve_batch(
&self,
signals: &[Vec<f32>],
kernel: &[f32],
) -> GpuResult<Vec<Vec<f32>>>
pub fn convolve_batch( &self, signals: &[Vec<f32>], kernel: &[f32], ) -> GpuResult<Vec<Vec<f32>>>
Apply the same kernel to each signal in signals.
This is a sequential loop over Self::convolve. A future
optimisation could share the forward-FFT of the kernel across all
signals; for now each signal gets an independent GPU dispatch.
Returns a Vec<Vec<f32>> with one result per input signal, in the
same order.
§Errors
Returns the first error encountered (processing stops on error).