Skip to main content

Crate signal_filters

Crate signal_filters 

Source
Expand description

§signal-filters Rust Crate
Crates.io Documentation License: Apache 2.0 License: MIT open source

This crate contains a collection of filters and utilities for digital signal processing.

This crate is no_std, no alloc, no panic, no unwrap, no expect, and the Minimum Supported Rust Version (MSRV) is Rust 1.89.

§Overview

This crate contains the following filters:

Pt1Filter, Pt2Filter, and Pt3Filter : basic first, second, and third order low-pass filters.

BiquadFilter: second order filter that can be used as a low-pass, high-pass, or notch filter.

MedianFilter3 and MedianFilter5: median filters for spike rejection.

SlewRateLimiter: filter that limits the rate of change of a signal.

MovingAverageFilter : simple moving average filter.

The filters have aliases for f32 and f64 versions:

f32f64
Pt1Filterf32Pt1Filterf64
Pt2Filterf32Pt2Filterf64
Pt3Filterf32Pt3Filterf64
BiquadFilterf32BiquadFilterf64
MedianFilter3f32MedianFilter3f64
MedianFilter5f32MedianFilter5f64
SlewRateLimiterf32SlewRateLimiterf64
MovingAverageFilterf32MovingAverageFilterf64

Additionally the all the filters except the Median Filters and Slew Rate Limiters have aliases for their vectorized forms for both f32 and f64 vectors.

So for Pt1Filter we have:

vector f32vector f64
Pt1FilterVector2f32Pt1FilterVector2f64
Pt1FilterVector3f32Pt1FilterVector3f64
Pt1FilterVector4f32Pt1FilterVector4f64

and similarly for the other filters.

§Rolling and Circular buffers

This crate also has basic circular and rolling buffers: CircularBuffer<T, const N: usize> and RollingBuffer<T, const N: usize>.

A rolling buffer is similar to a circular buffer, except, once full, old items fall off the front when new items are added.

§Motivation

These filters have been developed for use in stabilized vehicles (self balancing robots and aircraft)and have been used to:

  1. Filter gyro and accelerometer output for use in the Attitude and Heading Reference System (AHRS).
  2. Filter motor encoder values for use in the motor controller.
  3. Filter derivative terms in a PID controller.
  4. Filter motor power input values to smooth the motor speed.

§Examples

use signal_filters::Pt1Filterf32;
use signal_filters::Pt1FilterVector3f32;
use signal_filters::BiquadFilterf32;
use signal_filters::BiquadFilterVector3f32;
use signal_filters::SignalFilter;
use vqm::Vector3f32;

//
// Pt1 low pass filter.
//
let mut filter = Pt1Filterf32::new();
let sample_interval_s: f32 = 0.001; // 1 kHz sampling rate
filter.set_cutoff_frequency(100.0, sample_interval_s);

let input: f32 = 2.7;
let output = filter.update(input);

//
// Pt1 low pass filter with vector input.
//
let mut filter = Pt1FilterVector3f32::new();
filter.set_cutoff_frequency(80.0, sample_interval_s);

let gyro = Vector3f32 { x: 0.2, y: 0.5, z: 1.5 };
let output = filter.update(gyro);

//
// Biquad filter used as low-pass filter.
//
let sample_interval_s: f32 = 0.001; // 1 kHz sampling rate
let q_factor: f32 = 2.0;
let cutoff_frequency_hz: f32 = 80.0;

let mut notch_filter = BiquadFilterf32::new().with_q(q_factor).with_sample_interval(sample_interval_s);
notch_filter.set_low_pass_frequency_assuming_q(cutoff_frequency_hz);

let input: f32 = 0.8;
let output = notch_filter.update(input);

//
// Biquad filter used as notch filter.
//
let notch_frequency_hz: f32 = 50.0; // 50 Hz power line hum filter
let q_factor: f32 = 10.0; // Narrow notch width

let mut notch_filter = BiquadFilterf32::new().with_q(q_factor).with_sample_interval(sample_interval_s);
notch_filter.set_notch_frequency_assuming_q(notch_frequency_hz);

let input: f32 = 0.8;
let output = notch_filter.update(input);

//
// Biquad notch filter with vector input.
//
let mut notch_filter = BiquadFilterVector3f32::new().with_q(q_factor).with_sample_interval(sample_interval_s);
notch_filter.set_notch_frequency_assuming_q(notch_frequency_hz);

let gyro = Vector3f32 { x: 0.8, y: 2.1, z: -0.2 };
let output = notch_filter.update(gyro);

§Original implementation

I originally implemented this crate as a C++ library: Library-Filter.

§License

Licensed under either of:

at your option.

Structs§

BiquadFilter
Second-order biquad IIR filter.

CircularBuffer
CircularBuffer<T, const N: usize>. N items of type T.

MedianFilter3
Non-linear median-of-3 filter for spike rejection.
Maintains a window of the last three samples and returns the median value.
MedianFilter5
Non-linear median-of-5 filter for spike rejection.
Maintains a window of the last three samples and returns the median value.

MovingAverageFilter
Simple moving average filter.

Pt1Filter
Discrete-time, first-order low-pass filter (Proportional Time element).
Pt2Filter
Discrete-time, second-order low-pass filter (Proportional Time element).
This is equivalent to two cascaded PT1 filters with the same time constant.
Pt3Filter
Discrete-time, third-order low-pass filter (Proportional Time element).
This is equivalent to three cascaded PT1 filters. It provides a very steep 60dB/decade roll-off.

RollingBuffer
RollingBuffer<T, const N: usize>. N items of type T.
Once full, old items fall off the front when new items are pushed on the back.

SlewRateLimiter
Limits the maximum rate of change (dV/dt) of a signal.
It allows for different rates depending on whether the signal is increasing (rising) or decreasing (falling).

Traits§

LimitSlew
Adds value.limit_slew_using(&mut slew_rate_limiter) method call to SlewRateLimiter.
SignalFilter
Filter Definition trait. filter.reset() filter.update(value)
UpdateFilter
Adds value.filter_using(&mut filter) method call syntax to SignalFilter.

Type Aliases§

BiquadFilterVector2f32
BiquadFilter for Vector2f32
BiquadFilterVector2f64
BiquadFilter for Vector2f64

BiquadFilterVector3f32
BiquadFilter for Vector3f32
BiquadFilterVector3f64
BiquadFilter for Vector3f64

BiquadFilterVector4f32
BiquadFilter for Vector4f32
BiquadFilterVector4f64
BiquadFilter for Vector4f64

BiquadFilterf32
BiquadFilter for f32
BiquadFilterf64
BiquadFilter for f64

MedianFilter3f32
Median3Filter for f32
MedianFilter3f64
Median3Filter for f64

MedianFilter5f32
Median5Filter for f32
MedianFilter5f64
Median5Filter for f64

MovingAverageFilterVector2f32
MovingAverageFilter for Vector2f32
MovingAverageFilterVector2f64
MovingAverageFilter for Vector2f64

MovingAverageFilterVector3f32
MovingAverageFilter for Vector3f32
MovingAverageFilterVector3f64
MovingAverageFilter for Vector3f64

MovingAverageFilterVector4f32
MovingAverageFilter for Vector4f32
MovingAverageFilterVector4f64
MovingAverageFilter for Vector4f64

MovingAverageFilterf32
MovingAverageFilter for f32
MovingAverageFilterf64
MovingAverageFilter for f64

Pt1FilterVector2Vector2f32
Pt1Filter for Vector2Vector2f32
Pt1FilterVector2Vector2f64
Pt1Filter for Vector2Vector2f64
Pt1FilterVector2f32
Pt1Filter for Vector2f32
Pt1FilterVector2f64
Pt1Filter for Vector2f64

Pt1FilterVector3Vector3f32
Pt1Filter for Vector3Vector3f32
Pt1FilterVector3Vector3f64
Pt1Filter for Vector3Vector3f64
Pt1FilterVector3f32
Pt1Filter for Vector3f32
Pt1FilterVector3f64
Pt1Filter for Vector3f64

Pt1FilterVector4Vector4f32
Pt1Filter for Vector4Vector4f32
Pt1FilterVector4Vector4f64
Pt1Filter for Vector4Vector4f64
Pt1FilterVector4f32
Pt1Filter for Vector4f32
Pt1FilterVector4f64
Pt1Filter for Vector4f64

Pt1Filterf32
Pt1Filter for f32
Pt1Filterf64
Pt1Filter for f64

Pt2FilterVector2Vector2f32
Pt2Filter for Vector2Vector2f32
Pt2FilterVector2Vector2f64
Pt2Filter for Vector2Vector2f64
Pt2FilterVector2f32
Pt2Filter for Vector2f32
Pt2FilterVector2f64
Pt2Filter for Vector2f64

Pt2FilterVector3Vector3f32
Pt2Filter for Vector3Vector3f32
Pt2FilterVector3Vector3f64
Pt2Filter for Vector3Vector3f64
Pt2FilterVector3f32
Pt2Filter for Vector3f32
Pt2FilterVector3f64
Pt2Filter for Vector3f64

Pt2FilterVector4Vector4f32
Pt2Filter for Vector4Vector4f32
Pt2FilterVector4Vector4f64
Pt2Filter for Vector4Vector4f64
Pt2FilterVector4f32
Pt2Filter for Vector4f32
Pt2FilterVector4f64
Pt2Filter for Vector4f64

Pt2Filterf32
Pt2Filter for f32
Pt2Filterf64
Pt2Filter for f64

Pt3FilterVector2Vector2f32
Pt3Filter for Vector2Vector2f32
Pt3FilterVector2Vector2f64
Pt3Filter for Vector2Vector2f64
Pt3FilterVector2f32
Pt3Filter for Vector2f32
Pt3FilterVector2f64
Pt3Filter for Vector2f64

Pt3FilterVector3Vector3f32
Pt3Filter for Vector3Vector3f32
Pt3FilterVector3Vector3f64
Pt3Filter for Vector3Vector3f64
Pt3FilterVector3f32
Pt3Filter for Vector3f32
Pt3FilterVector3f64
Pt3Filter for Vector3f64

Pt3FilterVector4Vector4f32
Pt3Filter for Vector4Vector4f32
Pt3FilterVector4Vector4f64
Pt3Filter for Vector4Vector4f64
Pt3FilterVector4f32
Pt3Filter for Vector4f32
Pt3FilterVector4f64
Pt3Filter for Vector4f64

Pt3Filterf32
Pt3Filter for f32
Pt3Filterf64
Pt3Filter for f64

SlewRateLimiterf32
SlewRateLimiter for f32
SlewRateLimiterf64
SlewRateLimiter for f64