2个不稳定版本
0.2.1 | 2023年6月2日 |
---|---|
0.1.0 | 2023年5月30日 |
762 在 数学 中
每月下载 22 次
40KB
579 行
omni-wave
易于使用的DWT(离散小波变换)库,无需担心填充,并提供多种小波。
注意:我的知识无法保证其“正确性”,但它确实“集中能量”和“完美重建”。
use approx::assert_abs_diff_eq;
use ndarray::{Array1, Array2, Axis};
use omni_wave::*;
let wavelet = wavelet::BIOR_3_1;
let love = Array2::from_shape_vec((8, 8),
vec![0., 0., 0., 0., 0., 0., 0., 0.,
0., 0.,99., 0., 0.,99., 0., 0.,
0.,99.,99.,99.,99.,99.,99., 0.,
0.,99.,99.,99.,99.,99.,99., 0.,
0.,99.,99.,99.,99.,99.,99., 0.,
0., 0.,99.,99.,99.,99., 0., 0.,
0., 0., 0.,99.,99., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,]).unwrap();
let mut signal = love.clone();
let mut buffer = Array1::zeros(signal.len_of(Axis(0)) + wavelet.window_size() - 2); // The minimum length of a buffer
completely_decompose_2d(signal.view_mut(), buffer.view_mut(), wavelet);
completely_reconstruct_2d(signal.view_mut(), buffer.view_mut(), wavelet);
love.into_iter()
.zip(signal)
.for_each(|(a, b)| assert_abs_diff_eq!(a, b, epsilon = 0.0001));
特性
f64
- 默认用于计算的原始类型是f32
。启用此功能可切换到f64
。
知识
信号
需要转换的数据。 长度应该是偶数。 如果不满足长度要求,则可能不会导致panic,但函数的行为将是未定义的。
输入的左侧将被视为 近似,而右侧将被视为 细节。
填充
处理信号时的扩展。我们使用的填充方法名为 periodic
(在 PyWavelets),
[ A.B.C.D.E.F.G.H ] a.b.c.d ...
↑^^^^^^^^^^^^^^ ↑^^^^^^
Original signal Padding: automatically fill & detach.
最初,我计划提供更多扩展模式,但发现小波如 bior2.2
的第一个系数为零... 这样不会丢失信息吗? 所以目前只提供 periodic
模式。如果您有更好的建议,请告诉我。
缓冲区
计算时的临时缓冲区。为了性能,强烈建议其在内存中是连续的。
窗口大小
小波系数的数量。
依赖关系
~1.5MB
~25K SLoC