[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
上士Extreme
2018-1-24 20:57:32 显示全部楼层

马上注册,玩转Robomaster!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 Extreme 于 2018-1-25 02:42 编辑

随着RoboMaster比赛的推广,不断有新的学校参与进来,有些同学因为刚接触比赛,缺乏实践经验,可能会遇到一些基础的技术问题。我们可能会陆续更新一些基础教程。今天给大家介绍一个实用技巧:利用MATLAB设计滤波器并在STM32平台上跑起来。

滤波器的重要作用不必多说,在传感器数据处理、电机控制、视觉算法中都会用到。这里举一个最简单的例子,对陀螺仪采集的数据进行低通滤波,从而达到去除噪声的作用。


1. 分析原数据
首先我们将MPU6500的陀螺仪数据带宽设置为250Hz,然后使用J-Scope采集静置时候的陀螺仪x轴的数据。可以看出角速度有幅度约为0.3°/s的跳动。(为了让J-Scope读到值,这里将原始数据乘以1000转化成整型了)
250Hz_s.png
对数据进行FFT变换之后得到频谱图:
fft_250hz.png
可以看出信号在250Hz之后有衰减,证明MPU6500确实有对原始adc采样数据做过滤波,但是效果不明显。


2. FDATool工具介绍
现在我们来自己设计一个低通滤波器。
首先打开MATLAB,在命令行窗口键入 fdatool,打开滤波器设计和分析工具(Filter Design & Analysis Tool),初始界面如下图所示:
fdatool_orig.png
这是经典的MATLAB工具箱界面,第一行菜单栏,第二行工具栏,中间展示结果,最下方的功能区可以切换,默认的功能就是设置滤波器参数。这点英文肯定难不倒大家,随便点点看就能学会。

3. 设计滤波器
在设计滤波器界面,可以根据自己的需求选择滤波器类型、阶数、频率特性、幅度特性等参数。
例如我选择了切比雪夫Ⅱ型低通滤波器,采用Minimum order模式(根据频率、幅度指标自动选择最小阶数),设置采样频率(Fs)1000Hz,通带频率(Fpass)50Hz,阻带频率(Fstop)60Hz,衰减幅度保持默认。点击Design Filter按钮,一个滤波器就出来了。
fdatool_50Hz.png
该滤波器是17阶的,点击工具栏的按钮可以看到该滤波器的详细特性,例如幅频、相频、群延时、零极点等等。蓝色线表示的幅频响应曲线,橙色线是相频响应曲线。可以看出切比雪夫Ⅱ型滤波器在通带内平滑,阻带内有等幅度纹波。

4. 转化和导出
FDATool默认生成的滤波器是二阶级联组成,这样的稳定性更高(尤其是滤波器阶数较高时),但是结构比较复杂,程序实现也不方便,一般将其转化成一阶级联型再使用,点击菜单栏的Edit->Convert to Single Section进行转换。至此,一个50Hz的切比雪夫Ⅱ型低通滤波器就完成了。
点击 Targets-> Generate C Header,将滤波器的系数存到.h文件中。然后我们可以进入C语言的部分了。
fdatool_gen.png

coef.png

5. C语言实现
把系数提取出来,然后把下面这个滤波器函数放到定时器中断或者数据接收中断处理函数里面,按照固定频率运行,即可输出滤波后的陀螺仪数据了。(具体原理再文章最后有介绍)
filter_c2.png
(注意:分子系数是成对出现的,可以先合并来提高运算效率)

6. 结果对比
静止测试时,噪声得到了有效的抑制。
jscope_compare.png
再看频谱,滤波效果非常明显,50Hz以上的分量几乎被完全消除了。
fft_compare.png
动态测试图:
test_compare.png
曲线平滑很多,毛刺都被消除了,但是可以明显看出,滤波之后的信号相比原信号有滞后,这是滤波造成的相位延迟。这里只是为了给大家展示滤波器的效果,实际上该滤波器并不一定适合用于对陀螺仪数据进行处理,要综合考虑各种因素来确定滤波器。

7. 计算原理
详细内容可以去翻信号与系统的课本:
FDATool生成的滤波器其实传递函数形式 ,两组系数分别是传递函数的分子分母,结构如下:
1.png
上下同除以z^n :
2.png
将上式展开,并利用z变换的时移性质 2.5.PNG 可以得到:
3.png

最后整理为:
4.png
此即代码里循环累加的过程。
这个算法是用差分方程表示线性时不变系统的通用方法,也适用于将自己设计的传递函数形式的控制器转化成代码。需要注意的是,如果传递函数是连续形式的,需要先经过离散化,可以利用MATLAB的c2d函数。

最后附上频谱分析的m文件和滤波器实现的C代码,有优化空间,仅供参考。

filter_code.zip

1.42 KB, 下载次数: 259

跳转到指定楼层

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
下士lcpdeb
2019-3-31 06:47:18 显示全部楼层
把系数提取出来,然后把下面这个滤波器函数放到定时器中断或者数据接收中断处理函数里面,按照固定频率运行,即可输出滤波后的陀螺仪数据了。(具体原理再文章最后有介绍)


请问如何按照固定频率运行这个滤波器呢,是只需要放在中断里就行了吗

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
上士Extreme
 楼主| 2019-4-8 20:13:44 显示全部楼层
lcpdeb 发表于 2019-3-31 06:47
把系数提取出来,然后把下面这个滤波器函数放到定时器中断或者数据接收中断处理函数里面,按照固定频率运行 ...

用定时器中断或者rtos的任务里,只要保证执行周期稳定即可

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
下士liufengle
2019-11-17 14:01:55 显示全部楼层
v把系数提取出来,然后把下面这个滤波器函数放到定时器中断或者数据接收中断处理函数里面,按照固定频率运行,即可输出滤波后的陀螺仪数据了。(具体原理再文章最后有介绍)

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
上等兵20164160
2018-1-24 21:16:29 显示全部楼层
。。。。。。。。。。。。。。。。。。。。
回复

使用道具 举报

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
下士物非人非
2018-1-25 10:04:57 显示全部楼层
大佬,表示之前没有用过

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
中士小仙男
2018-1-27 09:30:06 显示全部楼层
好厉害
回复

使用道具 举报

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
下士风中的少年
2018-1-27 20:51:23 显示全部楼层
学习了
回复

使用道具 举报

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
少尉Jizefeng0810
2018-1-29 22:27:20 显示全部楼层
厉害!学习了

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
下士Daqo_Lee
2018-1-30 09:12:50 显示全部楼层
666,学习了
回复

使用道具 举报

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
上等兵老神棍
2018-1-30 18:08:58 显示全部楼层
66666666666

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
上等兵游离子
2018-1-30 20:44:06 显示全部楼层
thanks....
回复

使用道具 举报

[嵌入式] 【RM入门教学系列】数字滤波器设计与实现(含代码)

  [复制链接]
下士H.F.
2018-2-4 19:51:52 显示全部楼层
幸苦了,收藏!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

触屏版 | 电脑版

Copyright © 2021 RoboMasters 版权所有 备案号 粤ICP备12022215号

快速回复 返回顶部 返回列表