lowpassns is a small, efficient, and robust first-order low-pass filter crate for no_std Rust environments. Designed for embedded systems like RP2040 or STM32, it smooths sensor readings or signals in real-time while being memory- and CPU-efficient.
#![forbid(unsafe_code)] for safety and opt-level = 3 for speed
- ✅ Pure
no_std: Zero standard library dependencies, perfect for bare-metal and RTOS. - ⚡ Flexible Floating-Point: Default
f64, optionalf32feature for memory-constrained devices. - 🔧 Lightweight: Minimal stack usage, O(1) per update.
- 🛡️ Stable & Safe: Handles zero/negative dt safely, clamps tiny dt for embedded portability.
- 📈 Smooth Filtering: Simple first-order low-pass behavior for sensor smoothing or signal conditioning.
- ⛑️ Resettable State: Filter value can be reset at any time.
Add to your Cargo.toml:
[dependencies]
lowpassns = lowpassns = "0.2.0"
Enable f32 for constrained MCUs:
lowpassns = { version="0.2.0", features = ["f32"] }Build with optimizations:
cargo build --release
use lowpassns::LowPass1;
fn main() {
// Initial value = 0.0, time constant τ = 0.1 s
let mut filter = LowPass1::new(0.0, 0.1);
let dt = 0.01; // 10 ms timestep
for i in 0..100 {
let input = 1.0; // example sensor input
let output = filter.update(input, dt);
// output smoothly approaches input
}
filter.reset(0.0); // Reset the filter state
}| Method | Signature | Description |
|---|---|---|
new |
LowPass1::new(initial: Float, tau: Float) |
Creates a new low-pass filter. |
update |
update(&mut self, input: Float, dt: Float) -> Float |
Updates the filter state for a timestep. |
reset |
reset(&mut self, value: Float) |
Resets the filter state. |
Type Float = f64 (default) or f32 via feature flag.
Speed opt-level = 3
CPU cost: constant time O(1) per update
Stack-only, zero allocations
Ideal for 100 Hz – 10 kHz control loops on MCUs
🧪 Testing
Includes tests for:
Step response stability Zero/negative dt handling Reset functionality
Run:
cargo test -- --nocapture
GPL-2.0-or-later © 2026 Jorge Andre Castro.
Free to use, modify, and distribute. Any derivative works must also be GPL-2.0-or-later.