页次: 1
最近用STM32F407的DSP库(en.stm32f4_dsp_stdperiph_lib)实现了FFT功能,有三种方式,现将这三种方案做个对比。
方式一:使用arm_cfft_radix2_f32.c文件,基2
方式二:使用arm_cfft_radix4_f32.c文件,基4
方式三:使用arm_cfft_f32.c与CMSIS中的arm_cortexM4lf_mat.lib文件
采64点同一原始数据的相同数据段计算时间与所占资源
方式一:163uS Program Size: Code=9228RO-data=217380 RW-data=2108 ZI-data=4740
方式二:111uS Program Size:Code=11012 RO-data=217380 RW-data=2108 ZI-data=4740
方式三:103uS Program Size:Code=15848 RO-data=217396 RW-data=2120 ZI-data=2416
采128点同一原始数据的相同数据段计算所得到的周期,采用256点FFT采128点实际数据后续128个补0的方式。
方式一:
方式二:
方式三:
由上可算得Fn=(4-1)*50/256=0.5859375Hz,Tn=1/Fn=1.707s。与MATLAB分析的结果一致。
MATLAB结果:
原始信号:
另外在单片机中使用基2的算法,采128个点做128点的FFT分析结果为0.78125Hz与实际相差较大,见下图。
由上可得以下结论:
1. 运算时间由快到慢依次为arm_cfft_f32、arm_cfft_radix4_f32、arm_cfft_radix2_f32。
2. 所占资源相差不大。
3. 相同采集点情况下,补0对正确计算周期有帮助。
另外还有两个问题请教各位。
1.FFT以后频域中的模值比时域中实际信号的幅值小很多,不到1/2甚至更少。
2.FFT结果是对称的,为什么又不能使用一半的数据做分析呢。
最近做了一块驱动板,经过了空载与带载的验证。因为使用了专用IC所以省了很多事,至少不用编程了哈,而且也达到了设计时的需求。此驱动板工作电压为12VDC或者24VDC,最大电流10A,可实现正反转与调速以及刹车功能。
说一下其中的坑,PWM口与FILTER口都可以调速,但是两个口不能同时使用。如果使用FILTER口调速,必须将PWM接地,反之将FILTER通过一个小电容接地。开始设计时想把两个口都引了出来,结果FILTER输入口一直输出2.3VDC左右的电平,无法调速电机也不转动,一度很慌张。
这里要感谢黄兔先生,布板时帮我发现一个严重的封装错误,不然要填一个大坑了,以及后来还亲自帮我布了一块板,让我学习,非常感谢!黄兔先生的技术水平与人格魅力都是楚才子的最佳代表。
页次: 1