FIR滤波器实践-基于ARM CMSIS-DSP库
一、CMSIS-DSP库介绍
CMSIS-DSP库是ARM官方提供的数字信号处理库,包含了大量常用的数字信号处理算法,如快速傅里叶变换(FFT)、FIR滤波、自适应滤波器等等。由于是ARM官方提供,因此可以适配Cortex-A、Cortex-R、Cortex-M三种内核的单片机,典型的如Cortex-M内核的STM32单片机。CMSIS-DSP通常在安装Keil的时候会自动安装在keil根目录下的ARM文件夹下,采用不同的软件有不同的库包含方法,可以去百度看看。库的包含非常简单,这里也不做介绍。
二、Q15格式介绍
Q15是最常见的浮点转定点的数据格式,Q15数据格式根据定义是长度为16位的数据,其中最高位为符号位,后面15位为小数位。Q15格式下的0x1111(十进制为4369),二级制数据为0001 0001 0001 0001,根据Q15的定义,最高位为符号位,0代表正数,后续位为小数位,计算过程如下
1 ∗ 2 − 3 + 1 ∗ 2 − 7 + 2 − 11 + 2 − 15 = 0.1333312988 1*2^{-3}+1*2^{-7}+2^{-11}+2^{-15}=0.1333312988 1∗2−3+1∗2−7+2−11+2−15=0.1333312988
Q15数据格式本质是将小数左移15位,即扩大 2 15 2^{15} 215变成一个整数进行运算,0x1111为十进制数4369,Q15对应下的小数为 4369 / 2 15 = 0.1333312988 4369/2^{15}=0.1333312988 4369/215=0.1333312988 。对于没有浮点运算单元(FPU)的单片机来说,将小数转换成浮点数可以显著提高计算效率。Q15格式下所能表示的整数数据范围为-32768 ~ 32767 ,对应的小数范围为-1 ~ 0.9999694824 。下面再举一个实际的例子,例如一个12bit的ADC采集到的电压数据为2369,其中参考电压为3.3V,则实际的电压为 2369 / 4096 × 3.3 = 1.908618164 2369/4096\times3.3=1.908618164 2369/4096×3.3=1.908618164V,现在需要对该电压缩小0.4倍,为了避免浮点运算,可以采用如下的计算方式
i n t ( ( 2369 ∗ Q 15 ( 0.4 ) ) > > 15 ) \rm int((2369*\rm Q15(0.4))>>15) int((2369∗Q15(0.4))>>15)
其中, Q 15 ( 0.4 ) = 0.4 ∗ 2 15 = 13107.2 \rm Q15(0.4)=0.4*2^{15}=13107.2 Q15(0.4)=0.4∗215=13107.2,为了避免浮点运算,取整后为13107。由此,上式可以转换为
i n t ( ( 2369 ∗ 13107 ) > > 15 ) = 948 \rm int((2369*13107)>>15)=948 int((2369∗13107)>>15)=948
其中,int取整操作为单片机运算定点数时自动完成,现在可以计算一下948对应的真实电压值, 948 / 4096 × 3.3 = 0.7637695313 948/4096\times3.3=0.7637695313 948/4096×3.3=0.7637695313V,真实电压的0.4倍为0.7634472656V 。可以看到,