跳转至

滤波器(Filter)

组件源码仓库地址:https://github.com/ZJU-HelloWorld/HW-Components

适用滤波器种类

微分跟踪器 Td(用于计算微分,对高频噪声具有抑制作用),斜坡滤波器 Ramp(用于限制变化率),有限冲激响应滤波器 Fir ,无限冲激响应滤波器 Iir

使用前准备

使用本组件前需要做以下准备:

  • config.cmake 文件中设置 use_hwcomponents_algorithms_filter 选项为 ON,开启该设备文件的编译,若为 OFF 则根驱动配置需求在 CMakeLists.txt 文件中重配置为 ON

1. 设计说明

滤波器在使用时应具有一下基本功能:

  1. 通过输入需要滤波的数据,得到滤波后的数据。
  2. 有时,有多组数据使用同一组滤波参数的情况,对于此种情况,应支持输入一组固定长度的数据,然后得到一组固定长度的输出(彼此独立)。
  3. 根据使用者需要,需要提供重置滤波器的接口。

2. 使用示例

在项目中引用头文件:

C++
1
2
3
#include "filter.hpp"

namespace hw_filter = hello_world::filter;

实例化一个滤波器并根据需要进行配置(以 FIR 为例):

C++
1
2
3
4
5
6
hw_filter::Filter* filter_ptr = nullptr;
float h_arr[4] = {0.4f, 0.4f, 0.4f, 0.4f};  // 前向系数
size_t m = 3;                               // 前向系数阶数
size_t dim = 2;                             // 两维的输入

filter_ptr = new hw_filter::Fir(h_arr, m, dim);

以固定频率调用 calc 方法实现滤波器计算。

C++
1
2
3
4
5
6
float in_arr[2];
float out_arr[2];

/* 输入赋值 */

filter_ptr->calc(in_arr, out_arr);

可通过 reset 方法进行滤波器重置:

C++
filter_ptr->reset();

3. 特殊情况说明

由于滤波器往往用于处理连续数据(不与离散数据对应),对于角度这类周期性数据,跨周期产生的跳变将严重影响滤波器的工作效果,为此分为两种情况:

  1. 对于微分跟踪器 Td 和斜坡滤波器 Ramp(用于限制变化率),可在初始化时使用 period 参数(代表周期数据的周期),如弧度制的角度将其赋值为 2 * PI
  2. 对于有限冲激响应滤波器 Fir 与无限冲激响应滤波器 Iir 而言,需要使用 PeriodData2ContData(对于角度还可以使用 PeriodAngle2ContAngleRadPeriodAngle2ContAngleDeg)类,将周期数据转换为连续数据后,再使用滤波器进行计算。

附录

版本说明

版本号 发布日期 说明 贡献者
2024.07.27 发布滤波器使用手册 蔡坤镇