5 releases

Uses new Rust 2024

0.3.0 Oct 1, 2025
0.2.4 Nov 18, 2017
0.2.2 Aug 31, 2017
0.2.1 Aug 12, 2016
0.1.0 Mar 28, 2016

#298 in Hardware support

Download history 10/week @ 2026-01-06 71/week @ 2026-01-13 111/week @ 2026-01-20 118/week @ 2026-01-27 115/week @ 2026-02-03 156/week @ 2026-02-10 138/week @ 2026-02-17 165/week @ 2026-02-24 417/week @ 2026-03-03 514/week @ 2026-03-10 440/week @ 2026-03-17 423/week @ 2026-03-24 495/week @ 2026-03-31 1171/week @ 2026-04-07 822/week @ 2026-04-14 356/week @ 2026-04-21

2,940 downloads per month
Used in 2 crates (via tic)

MIT/Apache

69KB
1.5K SLoC

allan - variance and deviation tools for stability analysis

crates.io License

A Rust implementation of Allan variance and deviation calculations for analyzing the stability and noise characteristics of time-series data. This is particularly useful for characterizing frequency standards, oscillators, gyroscopes, and other precision measurement instruments.

Overview

Allan variance is a method of representing frequency stability in oscillators and other time-series data. Unlike standard deviation, Allan variance converges for most types of noise commonly found in physical systems and can distinguish between different noise types.

This library provides:

  • Overlapping Allan variance (AVAR) and Allan deviation (ADEV) calculations
  • Modified Allan variance (MVAR) and Modified Allan deviation (MDEV) calculations
  • Overlapping Hadamard variance (HVAR) and Hadamard deviation (HDEV) calculations
  • Configurable tau (averaging time) ranges with multiple spacing options
  • Streaming calculation with efficient circular buffer implementation
  • Support for real-time analysis of continuous data streams
  • SIMD optimizations (enabled by default) for 3x faster Modified Allan calculations

Example

use allan::{Allan, ModifiedAllan, Hadamard};

// Allan variance/deviation
let mut allan = Allan::new();
for sample in measurements.iter() {
    allan.record(*sample);
}

let tau_1 = allan.get(1).unwrap();
println!("Allan deviation at τ=1: {}", tau_1.deviation().unwrap());
println!("Allan variance at τ=1: {}", tau_1.variance().unwrap());

// Modified Allan variance/deviation (better white PM noise rejection)
let mut modified = ModifiedAllan::new();
for sample in measurements.iter() {
    modified.record(*sample);
}

let tau_1 = modified.get(1).unwrap();
println!("Modified Allan deviation at τ=1: {}", tau_1.deviation().unwrap());
println!("Modified Allan variance at τ=1: {}", tau_1.variance().unwrap());

// Hadamard variance/deviation (3rd difference, better drift rejection)
let mut hadamard = Hadamard::new();
for sample in measurements.iter() {
    hadamard.record(*sample);
}

let tau_1 = hadamard.get(1).unwrap();
println!("Hadamard deviation at τ=1: {}", tau_1.deviation().unwrap());
println!("Hadamard variance at τ=1: {}", tau_1.variance().unwrap());

Documentation

API documentation is available at docs.rs/allan.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~0–290KB