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 次下载
275KB
804 行
allan-tools
所有工具 (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();
此库与 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]
使用 TauAxis::All 需要更多的计算,但提供了完整的时间粒度
let taus = tau::generator(tau::TauAxis::All, 1.0, 100.0); // [1.0, 2.0, 3.0, ..., 99.0, 100.0]
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
- 粉色噪声发生器
let x = allantools::noise::pink_noise(
-140.0_f64, // dBc @ 1Hz
1.0_f64, // (Hz)
1024); // 1k samples
噪声 | 白色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自相关
此宏在只有一个噪声过程非常占主导地位的数据序列上工作得很好。
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();
工具和实用程序
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