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.
| Primitive | Description |
|---|---|
StreamingMODWT | ~67 ns per tick (Db4, 4 levels) — shift-invariant detail + scaling coefficients. |
StreamingDWT | Decimated streaming DWT. |
StreamingSWT | Stationary streaming transform. |
StreamingCWT | 100–600 ns per tick across 10–100 scales — a fresh (power, phase) column per sample. |
StreamingDenoiser | 42 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
- Streaming denoise — emit one clean sample
per tick with
StreamingDenoiser. - Streaming CWT — update a Morlet scaleogram column on every sample.
See the sanitized streaming API reference for callable signatures and types.