STM32
直播中

青sky

8年用户 1272经验值
擅长:模拟技术
私信 关注
[问答]

如何去实现基于单片机的数字滤波器设计呢

如何去实现基于单片机的数字滤波器设计呢?有哪些基本步骤?

回帖(1)

李万寿

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

更多回帖

发帖
×
20
完善资料,
赚取积分