stm32利用DSP库做FFT变换,不懂取各个点模值函数。

使用stm32利用DSP库做FFT运算,调用cr4_fft_256_stm32(lBUFOUT,lBUFIN,NPT)后,然后计算各个点的幅值,看到网上是这么写的:voi... 使用stm32利用DSP库做FFT运算,调用cr4_fft_256_stm32(lBUFOUT, lBUFIN, NPT)后,然后计算各个点的幅值,看到网上是这么写的:
void dsp_asm_powerMag(void)
{
s16 lX,lY; u32 i;
for(i=0;i<NPT/2;i++)
{
lX = (lBUFOUT[i] << 16) >> 16;
lY = (lBUFOUT[i] >> 16);
float X = NPT * ((float)lX) /32768; //为什么要乘以NPT除以32768
float Y = NPT * ((float)lY) /32768;
float Mag = sqrt(X*X + Y*Y)/NPT;
lBUFMAG[i] = (u32)(Mag * 65536); //为什么要乘以65536
}
}
按照网上写的,不是只要 loat Mag = sqrt(X*X + Y*Y)/NPT; 这一句就可以计算模值了吗?
分数不多,麻烦有懂的人给我解释一下,万分感谢!
展开
 我来答
暗夜冰眼
2014-06-03 · TA获得超过455个赞
知道答主
回答量:47
采纳率:0%
帮助的人:31.1万
展开全部
之所以语句这么写是基于芯片的计算习惯,DSP最擅长的就是浮点数的乘机运算。语句分析如下:首先定义的的一个16位的有符号的数据IX 和IY 这两个只是中间变量,然后定义的i,是32位的无符号型。语句的目的的确是你理解的Mag = sqrt(X*X + Y*Y)/NPT。但直接这么写不符合DSP的计算习惯也就是不符合浮点运算的习惯。因此语句在for函数i写道 lX = (lBUFOUT[i] << 16) >> 16 就是取32位的i的低16位数据,lY = (lBUFOUT[i] >> 16);是取高16位数据。下面的两句
float X = NPT * ((float)lX) /32768;
float Y = NPT * ((float)lY) /32768
目的就是把数据浮点化,至于为什么是除以32768 。可以这么说,浮点化 就好像10进制里面的科学计数法。。32768=2的15次。除以32768也就是去除了浮点数后面的那个基数,只剩下前面的。比如1991 改写成1.991*10的三次幂,再除以10的三次方,只剩下1.991,便于余下的运算。
之后的语句就不用解释了吧至于最后一句要乘以65536是因为,我们定义的数据和我们需要求得的数据都是无符号32位的,之前已经把32位的数据拆开又分别浮点化了又开了个根号,所以再把它变回来 只需要乘以2的16次,也就是65536.
打个比方吧。比如说问你什么时候生日,你说是19911030,然而DSP是不习惯这么干的,他需要把它拆开为1991和1030。再写成1.991x10的3次方和1.030x10的3次方。然后才能进行其他的运算。
BY ZHE WAY ,你的注释中“loat Mag”的说法是错的,应该是float!!尽管DSP的芯片类型很多,数据变量的定义也各有差异,但原理是一样的,最终还是要采用DSP习惯的运算方式。至于为什么一定要采用浮点运算,因为机器是SB 然后TI公司的工程师是天才。

还不懂请留言我会尽力解答。
/********************************NO MORE ******************************************************************/
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式