STM32 FFT之后计算模值比较慢的问题

2019-08-17 07:22发布

本帖最后由 xfdr0805 于 2017-3-8 22:29 编辑

STM32F103c8t6用DSP库进行 256点 FFT运算,仿真发现FFT运算倒挺快的,跟官方速度差不多,但是计算幅值的时间,时间特别长,有差不多40多ms,造成3264点阵刷新比较慢,速度差不多20帧吧,反正也过的去,这里想请教一下大家,这种情况求模运算比FFT运算慢那么多是怎么回事?有没有其它办法提高速度呢,请做过这方面的朋友给指点一下,谢谢了

void dsp_asm_powerMag(void)
{
  s16 lX,lY;
  u32 i;
  for(i=0;i<NPT/2;i++)
  {
    lX  = (lBUFOUT << 16) >> 16;
    lY  = (lBUFOUT >> 16);
    {
    float X    = NPT * ((float)lX) /32768;
    float Y    = NPT * ((float)lY) /32768;
    float Mag = sqrt(X*X + Y*Y)/NPT;
                if(i==0)
                {
                        lBUFMAG    = (u32)(Mag* 32768*31/256);
                }
                else
                {
                       lBUFMAG    = (u32)(Mag* 65536*31/150);
                }
    }
  }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
yijinxiaoyou
1楼-- · 2019-08-17 08:42
xfdr0805 发表于 2017-3-9 19:27
等会下班了验证一下,最后一个计算是正确的,但还是慢,还没原来的快呢

/*****************************************************************************************
平方根
******************************************************************************************/
float mySqrt(float x)
{
        float a = x;
        unsigned int i = *(unsigned int *)&x;
        i = (i + 0x3f76cf62) >> 1;
        x = *(float *)&i;
        x = (x + a / x) * 0.5;
        return x;
}
不会啊快的不只一点
xfdr0805
2楼-- · 2019-08-17 10:28
这段函数能不能查表替换掉?
wmaxwell
3楼-- · 2019-08-17 10:43
少用除法,比如除以2,改为乘以0.5
yijinxiaoyou
4楼-- · 2019-08-17 11:46
 精彩回答 2  元偷偷看……
yijinxiaoyou
5楼-- · 2019-08-17 12:29
1024点360us 103跑起来没问题的
ieeloleei
6楼-- · 2019-08-17 18:18
yijinxiaoyou 发表于 2017-3-9 08:55
1、F1没有浮点核 用q15整点算吧
2、除法2的幂用移位
3、求根网上一大堆快速算法

第四点不赞同,按照你的说法,“频谱泄露”是ARM DSP库算法造成的,让人觉得这是ARM DSP库的缺陷,然而并不是这样。请仔细理解“频谱泄露”的含义,仔细查看FFT函数的说明。
---
无论是用labview还是matlab验证,计算结果都是一样的,这是我的经验。除非你使用的不对。

一周热门 更多>