1.综述
STM32搭配的CMSIS的DSP库已经写好了FIR,我们做的就是用好用稳定!
2.使用流程
2.1使用MATLAB的Filter Designer生成滤波器的参数(直接在MATLAB命令中输入filterDesigner即可调出此工具,配置好参数后,选择Targets->Generate C header)
2.2调用arm_fir_init_f32或arm_fir_init_q31或arm_fir_init_q15等等视实际使用情况而定数据类型
2.3调用对应的arm_fir_f32或arm_fir_q31或arm_fir_q15等等与上一步对应的函数开始计算
2.4就这两步算就对了
3.需要注意的细节问题
3.1滤波器阶数选择
滤波器阶数应当选择能整除4或8或16的,具体要求如下图
例如,f32要求4的倍数,与该数值直接相关的是numTaps,即MATLAB生成的参数的个数。numTaps比FIR滤波器的阶数大1,所以如果numTaps-1不能整除4,那就有问题了。
3.2状态缓冲大小
该参数在arm_fir_init函数中会用到,具体要求如下图
该缓冲状态区域大小为numTaps + 2*blockSize -1
其中,numTaps为FIR滤波器的配置参数个数,该数值比FIR滤波器的阶数大1。blockSize是每次调用arm_fir_f32计算的数值的个数,如果想一口气计算完,就让blockSize等于缓冲区中的元素个数。
3.3有多个FIR滤波器时,哪些能公用,哪些不行
例如笔者使用该FIR滤波器实现数字分频器,需要分别为左右声道配置两个FIR滤波器,显而易见,这两个滤波器的工作模式(低通、高通、带通等)相同;截止频率相同;窗函数相同。孪生兄弟一般,然而还是互相嫌弃,在实际使用时发现有些东西是不能公用的。
两个滤波器的基本属性与MATLAB生成的配置参数相关,所以MATLAB生成的配置参数可以公用。但是FIR滤波器句柄,即arm_fir_instance_f32(arm_fir_init_f32和arm_fir_f32的第一个参数)和状态缓存(arm_fir_init_f32的第四个参数)不能公用!
例如:
先举个反面例子
这是公用的例子,实际结果是,会听到明显的杂音
改正后是
结果就是声音很圆润,(笔者首先做的是低通滤波器)和低音炮上用运放实现的有源滤波器听起来无区别。
3.4在循环执行时,哪些可以省掉
例如笔者的分频器,只要音乐在播放,他就要一刻不停得工作(毕竟替代的是更不怕累的模拟电路),在一遍遍的滤波过程中,实测arm_fir_init开头这个函数可以省去的,即在循环前调用一次就行。
4.简单聊下我们手里的FIR
我们手头的这个FIR是直接型结构的,系统函数和拓扑图如上。上面的图里面,箭头代表乘法,圆圈代表加法。该滤波器的拓扑结构在有些资料上是下图这样,其本质上相同。
文章来源:https://www.toymoban.com/news/detail-629163.html
文章来源地址https://www.toymoban.com/news/detail-629163.html
到了这里,关于STM32 FIR滤波器使用要点,STM32 DSP篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!