最近做一个课题要用到单片机进行数字滤波器的设计,滤波器做过不少,但是数字滤波器还是头一次做。所以上网查了很多资料,发现这方面的资料说明不少,但是没有直接使用的指南,经过好几天的摸索以及实践,将自己的使用心得记录如下,有疏漏错误的地方希望大家批评指正。
对于什么是FIR滤波器我就不再多说。在我看来,其实直接性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直接生成。
最近做一个课题要用到单片机进行数字滤波器的设计,滤波器做过不少,但是数字滤波器还是头一次做。所以上网查了很多资料,发现这方面的资料说明不少,但是没有直接使用的指南,经过好几天的摸索以及实践,将自己的使用心得记录如下,有疏漏错误的地方希望大家批评指正。
对于什么是FIR滤波器我就不再多说。在我看来,其实直接性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直接生成。
举报