FerroWave · guides

Streaming

Streaming wavelet primitives for per-tick updates at nanosecond latency.

Tick-by-tick transforms for bounded-window processing — five low-latency classical primitives at nanosecond cost, plus an adaptive family behind one shared incremental contract.

Low-latency primitives

Each primitive lives in ferro_wave::streaming and emits new coefficients per update(sample). State stays in a bounded ring buffer; steady-state allocation is zero.

PrimitiveDescription
StreamingMODWT~67 ns per tick (Db4, 4 levels) — shift-invariant detail + scaling coefficients.
StreamingDWTDecimated streaming DWT.
StreamingSWTStationary streaming transform.
StreamingCWT100–600 ns per tick across 10–100 scales — a fresh (power, phase) column per sample.
StreamingDenoiser42 ns p50 (Db4, 4 levels) — one denoised sample per tick.
use ferro_wave::streaming::StreamingMODWT;
use ferro_wave::wavelets::{Daubechies, DaubechiesType};
 
let wavelet = Box::new(Daubechies::new(DaubechiesType::Db4));
let mut stream = StreamingMODWT::<f64>::new(wavelet, window, 4);
 
for &tick in &feed {
    if let Some(update) = stream.update(tick)? {
        on_update(update); // per-tick coefficients
    }
}
# Ok::<(), ferro_wave::WaveletError>(())

Adaptive transforms

EMD, EEMD, CEEMDAN, MEMD, VMD, SSWT, and EWT support fixed-window incremental use through the shared IncrementalTransform contract. The public contract covers readiness, bounded state, output shape, and error behavior. Refresh and reuse policies, solver initialization, cadence, thresholds, and related numerical controls are controlled implementation details.

Use it

See the sanitized streaming API reference for callable signatures and types.