1个不稳定版本

0.1.0 2023年11月22日

#233无标准库

Apache-2.0

28KB
290 代码行

continuous integration

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>,其中 XYi32 常量泛型,分别表示输入和输出信号的分数位数。虽然运行函数都设计为使用定点算术,但构造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);

该库包括创建以下滤波器形式的关联函数

  1. 低通
  2. 带通
  3. 高通
  4. 陷波
  5. 单极点低通
  6. 比例积分行为

默认情况下,过滤器不会限制其输出,如果不小心,实际上可能会溢出。您可以使用set_minset_maxset_limit函数向现有过滤器添加限制,或者您可以使用带有with_minwith_maxwith_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