1个不稳定版本
0.1.0 | 2023年11月22日 |
---|
#233 在 无标准库
28KB
290 代码行
fixed-filters
定点数滤波器
fixed-filters
是一个创建 二阶IIR滤波器 的 #![no_std]
库。这些滤波器可以配置以实现各种滤波器行为(例如低通、带通、高通、陷波、比例积分等)。它专门设计用于与基于 fixed crate 的 32 位定点数一起工作。
Alpha: 此crate需要 fixed crate 的 2.0.0 版本的 alpha 版本,该版本使用 const generics 而不是 typenum crate。此版本需要启用 generic_const_exprs
功能的 nightly 编译器。
如何使用
此crate的主要数据结构是 Biquad<X,Y>
,其中 X
和 Y
是 i32
常量泛型,分别表示输入和输出信号的分数位数。虽然运行函数都设计为使用定点算术,但构造API接受浮点变量以简化使用。创建滤波器的最通用方法是使用 new()
进行构造并传递滤波器系数。
#![feature(generic_const_exprs)]
use fixed_filters::Biquad;
use fixed::FixedI32;
// poles
let a0 = 1.;
let a1 = -1.97985135;
let a2 = 0.980052318;
// zeros
let b0 = 0.000050241;
let b1 = 0.000100482;
let b2 = 0.000050241;
// make a filter with 20 fractional bits on input and 16 fractional bits on output
let mut filter = Biquad::<20, 16>::new(a0, a1, a2, b0, b1, b2);
let signal = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
let mut y = FixedI32::<16>::ZERO;
for s in signal {
let x = FixedI32::<20>::from_num(s); // convert to fixed-point number
y = filter.update(x);
}
虽然传递极点和零系数是创建滤波器的最通用方法,但 Biquad
还包括一些关联函数,允许用户仅指定采样周期、中心频率和 q 因子即可创建标准滤波器形式。
// create a butterworth lowpass filter
let ts = 1./10e3;
let f0 = 100.;
let q = core::f32::consts::FRAC_1_SQRT_2;
let mut filter = Biquad::<16, 16>::lowpass(ts, f0, q);
该库包括创建以下滤波器形式的关联函数
- 低通
- 带通
- 高通
- 陷波
- 单极点低通
- 比例积分行为
默认情况下,过滤器不会限制其输出,如果不小心,实际上可能会溢出。您可以使用set_min
、set_max
或set_limit
函数向现有过滤器添加限制,或者您可以使用带有with_min
、with_max
或with_limit
函数的构建器模式在构造时设置限制。
// create a proportional-integral controller with a limit ot +-20
let kp = 0.1;
let ki = 0.01;
let mut filter = Biquad::<16, 16>::pi(kp, ki).with_limit(20.0);
基准测试
通过在STM32F411RE Nucelo板上运行一个简单的RTIC应用
并使用10kHz的滤波器来对其他可用的#![no_std]
二阶滤波器实现进行了基准测试。RTIC单调API被用来量化每个滤波器更新方法使用的CPU周期数。
组件 | 周期 |
---|---|
fixed-filters | 80 |
biquad::DirectForm1 | 80 |
biquad::DirectForm2Transposed | 72 |
idsp::iir_int | 90 |
从这些结果中可以看出,所有组件在执行效率方面都提供了类似的表现,其中biquad DirectForm2Transposed在具有FPU的微控制器中略有优势。然而,此组件不支持输出信号的内部限制,这在某些应用(如实现抗饱和和PI控制器)中可能是关键的。
依赖项
约2.5MB
约46K SLoC