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条回答
xfdr0805
2019-08-18 05:02
xfdr0805 发表于 2017-3-9 19:22
根据大家回复,找到了一个快速开根号算法

这里给出实现32位无符号整数开方得到16位无符号整数的C语言代码。


//------------------------------------------------------------------------------- -
/****************************************/
/*Function: 开根号处理 */
/*入口参数:被开方数,长整型 */ /*出口参数:开方结果,整型 */
/****************************************/
unsigned int sqrt_16(unsigned long M)
{
unsigned int N, i;
unsigned long tmp, ttp; // 结果、循环计数
if (M == 0) // 被开方数,开方结果也为0
     return 0;
N = 0;
tmp = (M >> 30); // 获取最高位:B[m-1]
M <<= 2;
if (tmp > 1) // 最高位为1
{
   N ++; // 结果当前位为1,否则为默认的0
   tmp -= N;
}
for (i=15; i>0; i--) // 求剩余的15位
{
   N <<= 1; // 左移一位
   tmp <<= 2;
   tmp += (M >> 30); // 假设
   ttp = N;
   ttp = (ttp<<1)+1;
   M <<= 2;
   if (tmp >= ttp) // 假设成立
   {
     tmp -= ttp; N ++;
   }
}
return N;
}

一周热门 更多>