1、一种在 STM32应用 FIR 滤波器的设计与实现 摘 要: STM32 微控制器是 ST 公司面向嵌入式应用领域开发的微控制器,它具有很高的性价比,由于内核不同,它的产品种类也不同,本文主要针对 STM32F4x 系列,利用 ST 公司的 DSP 函数库实现在 STM32 上运行有限单位冲激响应滤波器( FIR)的设计方法,实践表明, STM32F407 在开启浮点运算后可以流畅运行 FIR,满足微处理器对传感器信号进行滤波的要求。 下载 关键词: STM32 微控器 ;FIR 滤波器 ;设计 0 引言 在小型的嵌入式应用系统当中,微控制器的主要作用不仅是协调、 控制各个外围电路工作,有些系
2、统还需要微控制器运算一些算法,简单而有效的算法或者数字滤波器可以替代纯硬件电路,具有硬件电路少、成本低、故障率低的优点,但是有些算法规模和复杂程度较大,一般的微控制器如 8位、 16 位微控制器偏重于实时控制、寄存器较多,浮点运算能力很弱运行起来就显得特别吃力,而现阶段 ST 公司推出的 STM32 微控制器性能较为强劲,在保证实时性的情况下,也可以运行一些大型的数字滤波器和算法。 1 STM32F407 微控制器 STM32F407 是一种基于 ARM cortex-M4内核的 高性能微处理器,它是STM32F4 系列的中高端产品,具备 168MHz 主频下达到 210DMIPS 的性能,内
3、置 1MB闪存和 192KB的 SRAM。其内部资源比较丰富,具有 2个 USB2.0的 OTG,3个快速转换的 12位 ADC,相比上一代 ARM cortex-M3内核产品, STM32F407微控制器集成了单周期的 DSP 指令集和浮点运算单元 FPU,大大提高了微控制器在浮点运算的计算能力,配合 ST公司专为 STM32 微控制器开发的库函数,可以运行大型数学运算,提升了微控制器的执行效率和运行速度,节约项目开发成本和开发时间。 2 FIR 滤波器 在嵌入式应用领域中,微控制器不仅仅需要对传感器信号进行采集然后送入 A/D转换器进行处理,还要针对处理结果控制外围设备。在这个过程中,对于
4、传感器信号进行采集、滤波处理一般由外围电路组成,如常用的巴特沃斯滤波器、切比雪夫滤波器等,把经过滤波处理过的信号送入 A/D转换器,可以获得准确度较高的数据。而在实际应用中,某些外界因素对传感器的影响会使检测的模拟信号受到干扰,而这些干扰信号是可以利用数字滤波器滤除的,目前应用比较多的数字滤波器是无限冲激响应滤波器( IIR)和有限冲激响 应滤波器( FIR)两种, IIR 滤波器具有输入反馈,所以其输出值不仅要取决于当前输入值,还要取决于过去的输出值,那么理论上,这种滤波器的冲激响应是无限持续的,有不容易被设计的缺点。而 FIR滤波器不具有输入反馈,即输出值只取决于当前和过去的输入值,容易被
5、设计,但是同样功能的 FIR滤波器相比 IIR滤波器要复杂很多,系数更多,给原本就负担较重和实时性要求较高的微控制器增加致命的计算量,使系统的实时性降低。所以一些采用数字滤波器的系统,都会将计算数字滤波器的工作量交给其他微处理器运行,如 DSP 或者 FPGA,所以,本文 主要提出一种采用 STM32F407微控制器运行 FIR滤波器的设计方案,在运行一定量的采样率和阶数的 FIR 下保证系统实时性,满足控制系统的要求。 3 库函数中的 FIR 滤波器设计方法 要在 STM32F407 上利用 DSP 库运行 FIR,首先需要利用 Matlab 的工具箱FDATOOL 设计 FIR 滤波器,然
6、后生成滤波器所需的系数,为了增强其运算性能,还需要在程序中添加开启 FPU 的命令。 本设计利用 Matlab 设计一个带阻滤波器,所滤波信号由 10Hz 和 100Hz信号组成,截止频率 50Hz,采样 率为 1000Hz。为了更好的检测信号,防止能量泄露, FIR 选择窗函数、 hamming 窗减少旁瓣,由于 DSP 库中的 FIR 滤波器系数必须是 4的倍数,所以选择 200阶。设计好 FIR滤波器后生成系数,保存为数组形式或者头文件形式等待移植。 DSP 库中的 FIR 函数支持 Q7、 Q15、 Q31 和浮点四种数据类型,需要用到arm_fir_f32()函数,这个函数可以在 D
7、SP_Lib SourceFilteringFunctions 文件夹中的 arm_fir_32.c 找到,在使用函数前需要对该函数中的参数定义有所了解 。 阶数越高,系数越复杂, STM32F407 的运算时间越长。一般来讲,开启FPU 后的 STM32F407 运行 200 阶左右的 FIR 滤波器运算时间为毫秒级,是可以保证实时性的。 4 开启 FPU 的方法 早期的 STM32F4xx固件库中的 system_stm32f4xx.c文件默认禁用 FPU的,即在 CMSIS中没有定义 FPU,虽然文件中添加了 FPU相关代码,但是利用 MDK编译器执行过程中会产生错误,为保证系统准确运行
8、,可以在 system_init()函数中添加条件编译代码或者直接使用 FPU即可。如: #if ( _FPU_PRESENT = 1) ( _FPU_USED = 1) SCB-CPACR |= ( 3UL 10*2) |( 3UL 11*2) ; #endif 或者: #define _FPU_USED 1 两种方法不同,但是都需要对各个相关文件进行设置,只需根据相应的#define 命令查找定义即可设置,这里不再赘述。 需要注意的是,启用 FPU 不代表微控制器处理复杂运算就大大的提升效率了,这里还需 要对 ARM处理器的 math.h头文件进行替换,因为 math.h头文件中的运算函数
9、都是基于定点处理器和 IEEE-754 标准来运行的,想要提升微控制器的运算性能,还需要 STM32固件库中的优化函数来解决,即包含arm_math.h 头文件即可。以上两个设置都需要在工程选项中的 C/C+加入define 命令: _FPU_PRESENT=1, _FPU_USED =1 ARM_MATH_CM4 5 结论 通过 Matlab 运行 FDATOOL 工具箱来设计 FIR 滤波器,可以 节省很大一部分时间,对于 STM32F407 开启 FPU 后运行 FIR 滤 波器能够在保证精度的情况下具有很好的实时性,在工业控制当中很实用,特别在小型的嵌入式应用系统开发应用中更具竞争实力。