请教关于fft运算结果,和matlab计算的对不上

[复制链接]
 楼主| lvgaopan 发表于 2007-10-31 20:55 | 显示全部楼层 |阅读模式
请教各位前辈,我在用2407a做fft运算实验,使用ti的库函数。但程序计算出来的结果和matlab计算出来的结果不一样(峰值频率对得上,但幅值不对)。<br />源程序如下:<br />#include&nbsp;&quot;math.h&quot;<br /><br />#include&nbsp;&quot;fft.h&quot;<br /><br />#define&nbsp;N&nbsp;128&nbsp;/*&nbsp;FFT&nbsp;Length&nbsp;*/<br /><br />#pragma&nbsp;DATA_SECTION(ipcb,&nbsp;&quot;FFTipcb&quot;);<br />#pragma&nbsp;DATA_SECTION(mag,&nbsp;&quot;FFTmag&quot;);<br />#pragma&nbsp;DATA_SECTION(win,&nbsp;&quot;FFTwin&quot;);<br /><br />FFT128C&nbsp;fft=FFT128C_DEFAULTS;<br /><br />int&nbsp;ipcb[2*N];&nbsp;/*&nbsp;In&nbsp;place&nbsp;computation&nbsp;buffer&nbsp;*/<br />int&nbsp;mag[N];&nbsp;/*&nbsp;Magnitude&nbsp;buffer&nbsp;*/<br />int&nbsp;win[N/2]=HAMMING128;&nbsp;/*&nbsp;Window&nbsp;coefficient&nbsp;array&nbsp;*/<br /><br />int&nbsp;src[N];<br /><br />#define&nbsp;PI&nbsp;(3.141592654)<br /><br />main()<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;peak,freq;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;disable();<br />&nbsp;&nbsp;&nbsp;&nbsp;lf2407a_init();<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;FFT&nbsp;initialization&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;fft.ipcbptr=ipcb;&nbsp;/*&nbsp;FFT&nbsp;computation&nbsp;buffer&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;fft.magptr=mag;&nbsp;/*&nbsp;Store&nbsp;mag.&nbsp;square&nbsp;in&nbsp;separate&nbsp;buff&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;fft.winptr=win;&nbsp;/*&nbsp;Window&nbsp;coefficient&nbsp;array&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;fft.init();&nbsp;/*&nbsp;Copy&nbsp;Twiddle&nbsp;factor&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Acquire&nbsp;samples&nbsp;in&nbsp;bit&nbsp;reversed&nbsp;order&nbsp;or<br />&nbsp;&nbsp;&nbsp;&nbsp;Bit-reverse&nbsp;the&nbsp;in-order&nbsp;data&nbsp;using&nbsp;bit-rev&nbsp;utility&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&ltN;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src&nbsp;=&nbsp;32768&nbsp;*&nbsp;cos(2*PI*i/N);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;FFTC_brev1(src,&nbsp;ipcb,&nbsp;N);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;FFT&nbsp;Computation&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;fft.win(&fft);&nbsp;/*&nbsp;Window&nbsp;the&nbsp;input&nbsp;data&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;fft.izero(&fft);&nbsp;/*&nbsp;Zero&nbsp;the&nbsp;imaginary&nbsp;part&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;fft.calc(&fft);&nbsp;/*&nbsp;Compute&nbsp;the&nbsp;FFT&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;fft.mag(&fft);&nbsp;/*&nbsp;Obtain&nbsp;the&nbsp;magnitude&nbsp;square&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;peak=fft.peakmag;<br />&nbsp;&nbsp;&nbsp;&nbsp;freq=fft.peakfrq;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />}<br /><br />结果分析请看下楼
 楼主| lvgaopan 发表于 2007-10-31 20:59 | 显示全部楼层

这是matlab计算的前六项结果

matlab上的操作:<br />i=0:127<br />src=cos((2*3.14159*i)/128)<br />fft(src)<br /><br />第一项:-0.0001<br />第二项:64.0000&nbsp;-&nbsp;0.0002i&nbsp;&nbsp;&nbsp;<br />第三项:0.0000&nbsp;-&nbsp;0.0000i&nbsp;&nbsp;&nbsp;<br />第四项:0.0000&nbsp;-&nbsp;0.0000i&nbsp;&nbsp;&nbsp;<br />第五项:0.0000&nbsp;-&nbsp;0.0000i&nbsp;&nbsp;&nbsp;<br />第六项:0.0000&nbsp;-&nbsp;0.0000i<br />
 楼主| lvgaopan 发表于 2007-10-31 21:05 | 显示全部楼层

计算结果ipcb

这个计算结果,我的理解是<br />第一项:-0.231201&nbsp;+&nbsp;i0<br />第二项:0.266693&nbsp;-&nbsp;i(3.05176e-05)<br />第三项:-0.11557&nbsp;-&nbsp;i0.00283813<br />第四项:-0.00137329&nbsp;+&nbsp;i0<br />第五项:(-9.15527e-05)&nbsp;+&nbsp;i0<br />第六项:-0.00195313&nbsp;+&nbsp;i0<br /><br />这个结果与matlab计算出来的结果明显不符。请问是我的理解有问题(该如何理解结果数据)?还是程序计算有问题(错在什么地方)?<br /><br />谢谢
 楼主| lvgaopan 发表于 2007-10-31 21:07 | 显示全部楼层

计算结果mag

computer00 发表于 2007-10-31 21:08 | 显示全部楼层

DSP中的为了防止运算结果溢出,做了归一化处理吧?

  
 楼主| lvgaopan 发表于 2007-10-31 21:09 | 显示全部楼层

峰值频率

 楼主| lvgaopan 发表于 2007-10-31 21:18 | 显示全部楼层

弱弱地问

什么是“归一化处理”?<br />好像在文档里看到有类似的描述,但不太理解。<br />如果这些数据是对的,那应该如何与matlab计算的数据对应起来?<br />谢谢
 楼主| lvgaopan 发表于 2007-10-31 21:33 | 显示全部楼层

归一化是不是这样理解?

比如有四个数,分别为<br /><br />原数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;归一化处理后<br />1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt&gt&nbsp;&nbsp;&nbsp;0.25<br />2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt&gt&nbsp;&nbsp;&nbsp;0.5<br />3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt&gt&nbsp;&nbsp;&nbsp;0.75<br />4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt&gt&nbsp;&nbsp;&nbsp;1
computer00 发表于 2007-10-31 23:47 | 显示全部楼层

结果除以FFT点数就是了

  
selina1983 发表于 2012-5-23 23:20 | 显示全部楼层
mark^_^
kdurant 发表于 2012-5-24 09:00 | 显示全部楼层
是不是有字长效应影响
shiyue0415 发表于 2013-7-29 22:47 | 显示全部楼层
假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

35

帖子

0

粉丝
快速回复 返回顶部 返回列表