本帖最后由 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);
}
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
不知道你测的是什么信号 我测发时候同样的数组经过dsp库与MATLAB比较高次有泄露后来就没深究 后来用自己的算法没有什么问题
感觉原因是这样的:float型乘float型,理论上需要用double型进行存储,所以可能是用float做乘除法时它自动转成了double型进行计算,就没法用FPU了,所以速度会慢,比没有FPU的片子略快一些,但跟库函数这种直接用FPU进行运算的东西比还是慢了很多。
这里给出实现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;
}
/*还有一个*/
/* 来至 Quake 3 的源码 */
float CarmSqrt(float x){
union
{
int intPart;
float floatPart;
} convertor;
union
{
int intPart;
float floatPart;
} convertor2;
convertor.floatPart = x;
convertor2.floatPart = x;
convertor.intPart = 0x1FBCF800 + (convertor.intPart >> 1);
convertor2.intPart = 0x5f3759df - (convertor2.intPart >> 1);
return 0.5f*(convertor.floatPart + (x * convertor2.floatPart));
}
还有一个带神秘常数的
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the func?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
一周热门 更多>