#statistics #stability #frequency #system-time #time #allan

allan-tools

用于计算统计以研究系统稳定性的软件包

7 个版本

0.1.3 2022 年 3 月 13 日
0.1.2 2022 年 1 月 5 日
0.1.1 2021 年 12 月 27 日
0.0.3 2021 年 12 月 26 日

#503数学 类别中

每月 26 次下载

MIT/Apache

275KB
804

allan-tools

crates.io License License crates.io
Rust crates.io

所有工具 (Python 库) 移植到 Rust

该库允许轻松计算 Allan 偏差及类似统计量。
这些统计方法主要用于系统稳定性研究。

Allen 和其他偏差

在原始数据上计算 Allan 偏差

  use allantools::*;
  let taus = tau::generator(tau::TauAxis::Octave, 2, 128); // [2, 4, 8, ... 128]
  let sampling_rate = 1.0_f64; // [Hz]
  let (dev, errs) = deviation(&data, &taus, Deviation::Allan, sampling_rate, false, false).unwrap();
alt text

此库与 Time Lab 相比。

已知计算

  • Deviation::Allan adev
  • Deviation::Modified mdev
  • Deviation::Time tdev (尚未完全测试)
  • Deviation::Hadamard hdev (尚未完全测试)
  • Deviation::Gcov gcov allan 协方差 (尚未测试)

误差条

目前只生成遵循 1/√N 衰减的基本(有偏)误差条

重叠

通过使用 重叠 公式提高统计置信度

  let data: Vec<f64> = some_data();
  let taus = tau::generator(tau::TauAxis::Octave, 128);
  let overlapping = true;
  let sampling_rate = 1.0_f64; // [Hz]
  let (var, errs) = deviation(&data, &taus, Deviation::Allan, sampling_rate, false, overlapping).unwrap();

分数数据

is fractional 可以用于计算分数(n.a)数据的统计量

  let data: Vec<f64> = some_data();
  let taus = tau::generator(tau::TauAxis::Octave, 10000);
  let is_fractional = true;
  let sampling_rate = 1.0_f64; // [Hz]
  let ( adev, errs) = deviation(&data, &taus, Deviation::Allan, sampling_rate, is_fractional, false).unwrap();
  let (oadev, errs) = deviation(&data, &taus, Deviation::Allan, sampling_rate, is_fractional, true).unwrap();

Tau 轴生成器

用户可以将任何 τ 序列传递给所有计算方法。

此库还集成了一个 τ 轴生成器,这是一种将标准轴快速传递给计算方法的有效方法。已知几种轴

  • TauAxis::Octave 是最有效的
  • TauAxis::Decade 是标准且有效
  • TauAxis::All 需要更多的计算
  let taus = tau::generator(tau::TauAxis::Decade, 1.0, 10000.0); // [1.0, 10.0, 100.0, ..., 10000.0]
alt text

使用 TauAxis::All 需要更多的计算,但提供了完整的时间粒度

  let taus = tau::generator(tau::TauAxis::All, 1.0, 100.0); // [1.0, 2.0, 3.0, ..., 99.0, 100.0]
alt text

Tau 偏移和错误管理

只要可以评估 $#964;(n),此库就会计算所有 τ 值的请求统计量。
如果 τ (n) 不能评估,则计算停止并返回所有之前评估的偏移量。

如果没有 τ 值可行,则库返回 Error::NotEnoughSamplesError

用户必须传递一个有效的 τ 序列,否则

  • TauAxis::NullTauValue: 当请求 τ = 0(无意义)时返回
  • TauAxis::NegativeTauValue: 当请求 τ < 0(非物理)时返回
  • TauAxis::InvalidTauShape: 形状不是递增(不一定稳定)的形状

数据 & 噪声生成器

为测试目的集成了或开发了某些数据生成器

  • 白噪声生成器
  let x = allantools::noise::white_noise(
    -140.0_f64, // dBc/Hz
    1.0_f64, // (Hz)
    10000); // 10k samples
alt text
  • 粉色噪声发生器
  let x = allantools::noise::pink_noise(
    -140.0_f64, // dBc @ 1Hz
    1.0_f64, // (Hz)
    1024); // 1k samples
alt text
噪声 白色PM 闪烁PM 白色FM 闪烁FM
adev -1 -1 -1/2 0
mdev -3/2 -1 -1/2 0
方法 utils::diff(noise::white) utils::diff(noise::pink) noise::white noise::pink

幂律识别

NIST LAG1D自相关

NIST幂律识别方法[[46]]

此宏在只有一个噪声过程非常占主导地位的数据序列上工作得很好。

  let r = allantools::nist_lag1d_autocorr(&some_data);

Bias1 + R(n)识别方法

待办事项

三角帽

三角帽时尚统计,用于从a对b、b对c和c对a的测量中估计a/b/c。

   let a_against_b = some_measurements("a", "b");
   let b_against_c = some_measurements("b", "c");
   let c_against_a = some_measurements("c", "a");
   
   let taus = tau::tau_generator(tau::TauAxis::Octave, 10000.0);
   let sampling_rate = 1.0;
   let is_fractionnal = false;
   let overlapping = true;

   let ((dev_a, err_a),(dev_b,err_b),(dev_c,err_c)) =
      three_cornered_hat(&a_against_b, &b_against_c, &c_against_a,
         &taus, sampling_rate, is_fractionnal, overlapping, Deviation::Allan).unwrap();
alt text

工具和实用程序

cumsum : (类似于python::numpy) 返回序列的累积和

   let data: Vec<f64> = some_data();
   allantools::utilities::cumsum(data, None);
   allantools::utilities::cumsum(data, Some(10E6_f64)); // opt. normalization

diff : (类似于python::numpy) 返回序列的一阶导数

   let data: Vec<f64> = some_data();
   allantools::utilities::diff(data, None);
   allantools::utilities::diff(data, Some(10E6_f64)); // opt. normalization

random : 生成0 < x <= 1.0的伪随机序列

   let data = allantools::utilities::random(1024); // 1k symbols 
   println!("{:#?}", data);

normalize : 将序列归一化到1/norm

   let data: Vec<f64> = somedata(); 
   let normalized = allantools::utilities::normalize(
       data, 
       2.0_f64 * std::f64::consts::PI); // 1/(2pi)

to_fractional_frequency : 将原始数据序列转换为分数数据

   let data: Vec<f64> = somedata(); // sampled @ 10kHz
   let fract = allantools::utilities::to_fractional_frequency(data, 10E3); // :)

fractional_integral : 将分数测量序列转换为积分测量(如分数频率(n.a)到相时间(s))

   let data: Vec<f64> = somedata(); // (n.a) 
   let fract = allantools::utilities::fractional_integral(data, 1.0); // sampled @ 1Hz :)

fractional_freq_to_phase_time : 之前函数的宏包装器

phase_to_radians : 将相时间(s)转换为相弧度(rad)

   let data: Vec<f64> = somedata(); // (s)
   let data_rad = allantools::utilities::phase_to_radians(data);

依赖关系

~1.8–2.6MB
~50K SLoC