#filter #ratio #filtering #signal #compatible #no-alloc #cutoff

无需std flaw

受控制律启发的嵌入式信号滤波,无需std和无需分配兼容

2个不稳定版本

0.2.0 2024年7月10日
0.1.0 2024年4月7日

249嵌入式开发

Download history 4/week @ 2024-04-14 1/week @ 2024-05-19 110/week @ 2024-07-07 6/week @ 2024-07-14 3/week @ 2024-07-21

每月119次下载

MIT/Apache

180KB
471

flaw

受控制律启发的嵌入式信号滤波,无需std和无需分配兼容。

此库提供了一种简单的方法,用于使用32位浮点数初始化和更新单输入、单输出无限冲激响应滤波器,以及一些常见滤波器的表格滤波系数。滤波器以N阶滤波器的4N+1次浮点运算进行评估。

名称flaw是filter-law的简称,同时也指出了数字IIR滤波器使用小浮点类型是一个固有的缺陷,因为高阶和低截止滤波器会产生非常小的系数,从而导致浮点舍入误差。该库通过提供测试域内的滤波系数来尝试减轻这个问题。结果是,这些滤波器在有限的但有用的操作范围内可以实现精度和性能,并在嵌入式环境中进行公式化和初始化。

示例:二阶巴特沃斯滤波器

// First, choose a cutoff frequency as a fraction of sampling frequency
let cutoff_ratio = 1e-3;

// Initialize a filter, interpolating coefficients to that cutoff ratio.
let mut filter = flaw::butter2(cutoff_ratio).unwrap();  // Errors if extrapolating

// Update the filter with a new raw measurement
let measurement = 0.3145; // Some number
let estimate = filter.update(measurement);  // Latest state estimate

开发状态:早期阶段

这处于实验阶段 - 它似乎工作得很好,但没有完全验证或具有完整功能。

  • 需要更多的软件测试来保证滤波器在插值截止比下的性能
  • 需要更多的硬件/固件测试来检查在实际微控制器上的性能
  • 可以添加更多滤波器类型

系数表

表格滤波器经过测试以确保

  • 在最小截止频率的收敛阶跃响应中误差小于0.1%
  • 在最大截止频率的收敛阶跃响应中误差小于1ppm
  • 在截止频率处,正弦输入的-3dB衰减误差小于5%,当截止比接近奈奎斯特频率时
    • 这种误差似乎是测试案例离散化的问题,可以通过使用更好的测试方法(将正弦曲线拟合到结果或对三次插值器进行梯度下降)来减少

具有表格系数的每个滤波器都有一个最小和最大截止比。最小值由阶跃响应收敛的浮点误差决定,而最大值由截止比接近奈奎斯特频率时截止频率的衰减精度决定。

使用对数(cutoff_ratio)作为自变量的三次Hermite方法对这些表中的给定滤波器的系数进行插值。表格值存储并作为64位浮点数进行插值,仅在计算的最后阶段转换为32位浮点数。

滤波系数是从scipy的状态空间表示中提取的,这些表示是传递函数多项式的双线性变换的结果。

滤波器 最小截止比 最大截止比
Butter1 10^-5 0.4
Butter2 10^-3 0.4
Butter3 10^-2.25 (~0.006) 0.4
Butter4 10^-1.5 (~0.032) 0.4
Butter5 10^-1.5 (~0.032) 0.4
Butter6 10^-1.25 (~0.06) 0.4

许可

根据您的选择,许可如下:

依赖项

~685KB
~12K SLoC