完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
最近做一个课题要用到单片机进行数字滤波器的设计,滤波器做过不少,但是数字滤波器还是头一次做。所以上网查了很多资料,发现这方面的资料说明不少,但是没有直接使用的指南,经过好几天的摸索以及实践,将自己的使用心得记录如下,有疏漏错误的地方希望大家批评指正。
对于什么是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直接生成。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1801 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1096 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
735 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1684 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
745浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
578浏览 3评论
601浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
564浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 06:45 , Processed in 0.592536 second(s), Total 45, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号