基于STM32F4 DSP库的FIR滤波器使用心得

       最近做一个课题要用到单片机进行数字滤波器的设计,滤波器做过不少,但是数字滤波器还是头一次做。所以上网查了很多资料,

发现这方面的资料说明不少,但是没有直接使用的指南,经过好几天的摸索以及实践,将自己的使用心得记录如下,有疏漏错误的地方

希望大家批评指正。



       对于什么是FIR滤波器我就不再多说,推荐这个博主的博客http://blog.csdn.net/vast_sea/article/details/8194814。在我看来,其实直

接性FIR滤波器就是输入序列x[n]与滤波器系数h[n]卷积,最后输出的序列就是滤波后的序列。

步骤:

1.下载官方提供的STM32F4的DSP库,这里面将用到的数字信号处理函数都封装好了,直接用就可以。

在工程里添加.ilb文件,因为DSP的函数数目很多,为了方便官方就建了这么一个库,用起来只要包含

着一个库就可以用所有函数,这个文件在下图的路径下。

包含后的工程目录就是这样:

以上的工作都做好了,但是还有一点要注意,在使用时必须要包含一个叫arm_math.h的头文件。

2.这下准备活动就都准备好了,接下来说DSP函数,我用的是arm_fir_f32();函数,

对于这个函数的几个入口参数的说明如下。

看官方的注释就可以大概了解。

S是一个结构体,里面用来存放arm_fir_f32();这个函数进行滤波操作时所用到的信息,这是结构体的申明。

                                            第一个numTaps就是指滤波系数的个数。这个说白了就是你的滤波器的阶数-1;

                                            第二个*pState指针指向数据缓冲区(相当于一个数组),这个缓冲区的长度刚好是输入序列长度+

                                                   numTaps-1,刚好符合FIR滤波器卷积的运算。

                                            第三个*pCoeffs,指向滤波器系数序列。

这个结构体说明结束,接下来就遇到与个问题,S我们知道是什么意思了,但是怎么对他的各个元素进行复制呢赋值呢?这就先要

介绍另一个函数:

 
官方的名称叫FIR滤波器的初始化,其实说白了主要工作完成上面说的结构体的赋值工作。


第二个参数*pSrc,很简单就是输入序列。
第三个参数*pDst,输出序列。
第四个blocksize就是指一次处理多少个值。

3.具体使用
          这次课题我用的是内置AD采样来建立输入序列。
          这就遇到了一个大麻烦,AD采样的结果是12位无符号数,就是uint16,而dsp函数的入口参数明显
要是float型,贸然将整型数传进去是没用的,uint型和float型数据在内存里的存放方式是截然不同的,这
里不赘述,经过查资料最后我发现可以直接将uint转化成float型的数据(都是C语言没学好。。。)。
只需要一个简单的float变量中转一下就行了。
接下来类似于ARM官方提供的DSP的例子直接用就实现了FIR滤波器的设计。


各种变量定义


低通滤波函数:

最后对于滤波器系数的由来,这里也不赘述,用matlab直接生成。


你可能感兴趣的:(基于STM32F4 DSP库的FIR滤波器使用心得)