查看: 15994|回复: 17

[原创] STM32 FFT优化最终版!速度逼近官方库,不再折腾了再搞剁手

  [复制链接]

1

主题

0

好友

85

积分

童生

Rank: 2

该用户从未签到

发表于 2014-4-7 11:55:00 |显示全部楼层
本帖最后由 Borden 于 2014-4-7 11:58 编辑

简介:这是一个在STM32F103开发板上做的FFT计算演示程序。程序以36kHz采样率从AD采集播放器的音频信号,然后以同样速率发送到DA通过喇叭播放。同时采下来的信号做FFT变换,在屏幕上显示两路音频波形以及频谱。

之前的程序(http://www.amobbs.com/forum.php?mod=viewthread&tid=5574904&page=1#pid7424203)搞好之后本来不打算再弄了,但是在本坛另外一个帖子里面发现原来ST是有官方DSP库的,文档:(http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/CD00208762.pdf),里面的benchmark结果显示官方库的1024点FFT的速度居然达到了2.138ms,基本上是我之前程序速度的一倍,于是我又不淡定了。。。

去官网找了半天居然找不到那个库的下载,放狗一搜才发现有人说官方早就把那个库下架了,我估计是为了给带DSP指令集的F4系列让路。还好有老外放出了下载(https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/DispForm.aspx?ID=30831&RootFolder=%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex%5fmx%5fstm32%2fSTM32F10x%20DSP%20library%2c%20where%20is%20it),下回来看了看,官方库确实是高度优化的,但是代价是非常固化,不灵活,实用性比较差。说白了就是跑分很好看,真正用那个库就不是那么回事了。主要体现在:

1、它的输入是1024点32bit的数组(以1024FFT为例),那么要用这个库你必须把数据拷贝到数组里面。在实时运算的时候基本上只有双缓冲这一个唯一的选择。而双缓冲是有缓冲切换开销的。我的程序是给个指针直接从循环缓冲区任意位置读数据的,任意缓冲区长度,自动回卷。

2、它用的是基-4的FFT,我用的是最简单的基-2的。基-4的FFT理论上运算量就比基-2的小,速度肯定快,但是代价是FFT点数必须是4^n,如果你要做512点或者2048点的FFT,那么你就没法用官方库了。另外看它的代码,实际上stm32做基-4的FFT寄存器是不大够用的,所以它里面有很多数据倒来倒去的过程,如果寄存器能像64位ARM那样有32个的话,官方库这个程序还可以更快~

3、它的输入输出是等长的,就是说你做1024点的FFT输入必须是1024点,如果你的输入小于这个长度,是没有任何性能提升的。我的程序可以随意设置输入长度,自动补零自动优化,当输入长度小于FFT点数的时候速度可以成倍提升。实际上我工作中用的FFT是4096点的,但是输入数据只有128点。所以这一点优化在实际应用中还是非常有用的。

好了,基本情况就是这样。我之前那个FFT是32位精度的,为了跟官方库比较,也跟着改为16位了。前前后后改了一个礼拜,每天都能发现一些新的地方可以提高速度,搞到现在觉得基本上到头了。也实在是不能再搞了,我觉得自己有点走火入魔了,再搞工作都要丢了~~

成果:视频演示的是跟官方benchmark一样的配置,1024入1024出,16bit,三角函数表在flash里。视频中关闭显示之后即是纯FFT循环,此时除了FFT之外只有AD,DA以及帧率显示。可以看到实测是365fps,也就是2.74ms,比官方的2.138ms还是差一点,残念。。。作为基-2的FFT,我基本上只能接受这样的结果啦,哎~~~~


回复

使用道具 举报

4

主题

2

好友

3156

积分

状元

Rank: 6Rank: 6

  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 502 天

    [LV.9]以坛为家II

    发表于 2014-4-7 15:58:01 |显示全部楼层
    很强的技术贴,跟楼主学习了
    回复

    使用道具 举报

    81

    主题

    33

    好友

    3063

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    奋斗
    2016-5-31 17:39
  • 签到天数: 483 天

    [LV.9]以坛为家II

    爱板会员勋章 活跃会员勋章 在线达人勋章 优秀会员勋章 热心会员勋章 发帖机器勋章 原创先锋勋章 推广达人勋章 论坛骨干勋章 技术先锋勋章 原创达人勋章 技术高手勋章 突出贡献勋章 灌水专家勋章 在线之王勋章

    发表于 2014-4-8 15:56:32 |显示全部楼层
    这个。。。。完全不明觉厉啊,屌爆了
    最近板子好多啊,玩都玩不过来了,我看可以开个板子铺了
    回复

    使用道具 举报

    12

    主题

    13

    好友

    576

    积分

    举人

    Rank: 4

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 56 天

    [LV.5]常住居民I

    发表于 2014-4-20 11:50:32 |显示全部楼层
    叼咋天
    回复

    使用道具 举报

    114

    主题

    24

    好友

    9851

    积分

    实习版主

    Rank: 7Rank: 7Rank: 7

  • TA的每日心情

    2016-5-27 15:41
  • 签到天数: 850 天

    [LV.10]以坛为家III

    爱板会员勋章 活跃会员勋章 发帖机器勋章 论坛骨干勋章 在线达人勋章 在线之王勋章

    发表于 2014-4-20 12:21:56 |显示全部楼层
    又见大神!

    http://shop109129479.taobao.com
    纵然万劫不复,纵然相思入骨,
    我也待你眉眼如初,岁月如故!
    回复

    使用道具 举报

    0

    主题

    0

    好友

    4

    积分

    白丁

    Rank: 1

    该用户从未签到

    发表于 2014-5-22 09:18:28 |显示全部楼层
    ddddddddddddddddddd
    回复

    使用道具 举报

    8

    主题

    1

    好友

    1156

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    2014-7-24 09:00
  • 签到天数: 205 天

    [LV.7]常住居民III

    爱板会员勋章

    发表于 2014-6-1 17:51:10 |显示全部楼层
    好强大。。
    没人在乎过程,只在乎结果。
    回复

    使用道具 举报

    0

    主题

    0

    好友

    148

    积分

    童生

    Rank: 2

    该用户从未签到

    发表于 2014-6-3 05:23:07 |显示全部楼层
    okokokok ok okoko ok
    回复

    使用道具 举报

    0

    主题

    0

    好友

    2

    积分

    白丁

    Rank: 1

    该用户从未签到

    发表于 2014-8-18 20:27:05 |显示全部楼层
    我想要一份
    回复

    使用道具 举报

    333

    主题

    6

    好友

    1万

    积分

    翰林

    Rank: 7Rank: 7Rank: 7

  • TA的每日心情
    开心
    2016-8-4 10:56
  • 签到天数: 242 天

    [LV.8]以坛为家I

    发表于 2014-8-18 20:57:57 |显示全部楼层
    楼主好强啊              
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /5 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-10 23:02 , Processed in 0.494629 second(s), 29 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部