STM32 FIR滤波器使用要点,STM32 DSP篇

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是直接型结构的,系统函数和拓扑图如上。上面的图里面,箭头代表乘法,圆圈代表加法。该滤波器的拓扑结构在有些资料上是下图这样,其本质上相同。

 

猜你喜欢

转载自blog.csdn.net/Fairchild_1947/article/details/123007218
今日推荐