DM642上信号的FFT变换

[复制链接]
3396|2
 楼主| ysdx 发表于 2007-9-27 18:45 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;<br /><br />#include&nbsp;&ltstdio.h&gt<br />#include&nbsp;&ltstdlib.h&gt<br />#include&nbsp;&ltcsl.h&gt<br />#include&nbsp;&ltcsl_timer.h&gt<br />#include&nbsp;&ltmath.h&gt<br /><br />/*&nbsp;========================================================================&nbsp;*/<br />/*&nbsp;Include&nbsp;the&nbsp;DSPLIB&nbsp;header&nbsp;file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;========================================================================&nbsp;*/<br />#include&nbsp;&quot;dsp_fft32x32.h&quot;<br /><br />/*&nbsp;========================================================================&nbsp;*/<br />/*&nbsp;Macro&nbsp;definition&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;========================================================================&nbsp;*/<br />#define&nbsp;PI&nbsp;&nbsp;(3.141592654)<br />#define&nbsp;NN&nbsp;&nbsp;(512)<br /><br />/*&nbsp;========================================================================&nbsp;*/<br />/*&nbsp;Input&nbsp;and&nbsp;output&nbsp;arrays&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;========================================================================&nbsp;*/<br />#pragma&nbsp;DATA_ALIGN(x,&nbsp;8)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />#pragma&nbsp;DATA_ALIGN(xx,&nbsp;8)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />#pragma&nbsp;DATA_ALIGN(y,&nbsp;8)<br />#pragma&nbsp;DATA_ALIGN(w,&nbsp;8)<br />int&nbsp;x[2*NN];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />int&nbsp;w[2*NN];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />int&nbsp;xx[2*NN];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />int&nbsp;y[2*NN];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />unsigned&nbsp;int&nbsp;z[2*NN];&nbsp;<br />short&nbsp;ch[NN];<br />/*&nbsp;========================================================================&nbsp;*/<br />/*&nbsp;&nbsp;D2I&nbsp;--&nbsp;Truncate&nbsp;a&nbsp;'double'&nbsp;to&nbsp;a&nbsp;'int',&nbsp;&nbsp;&nbsp;with&nbsp;clamping.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;========================================================================&nbsp;*/<br />static&nbsp;int&nbsp;d2i(double&nbsp;d)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(d&nbsp;&gt=&nbsp;&nbsp;2147483647.0)&nbsp;return&nbsp;(int)0x7FFFFFFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(d&nbsp;&lt=&nbsp;-2147483648.0)&nbsp;return&nbsp;(int)0x80000000;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(int)d;<br />}<br /><br /><br />int&nbsp;gen_twiddle_fft32x32(int&nbsp;*w,&nbsp;int&nbsp;n,&nbsp;double&nbsp;scale)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i,&nbsp;j,&nbsp;k,&nbsp;s=0,&nbsp;t;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j&nbsp;=&nbsp;1,&nbsp;k&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt&nbsp;n&nbsp;&gt&gt&nbsp;2;&nbsp;j&nbsp;=&nbsp;j&nbsp;&lt&lt&nbsp;2,&nbsp;s++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;t=0;&nbsp;i&nbsp;&lt&nbsp;n&nbsp;&gt&gt&nbsp;2;&nbsp;i&nbsp;+=&nbsp;j,&nbsp;t++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w[k&nbsp;+&nbsp;&nbsp;5]&nbsp;=&nbsp;d2i(scale&nbsp;*&nbsp;cos(6.0&nbsp;*&nbsp;PI&nbsp;*&nbsp;i&nbsp;/&nbsp;n));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w[k&nbsp;+&nbsp;&nbsp;4]&nbsp;=&nbsp;d2i(scale&nbsp;*&nbsp;sin(6.0&nbsp;*&nbsp;PI&nbsp;*&nbsp;i&nbsp;/&nbsp;n));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w[k&nbsp;+&nbsp;&nbsp;3]&nbsp;=&nbsp;d2i(scale&nbsp;*&nbsp;cos(4.0&nbsp;*&nbsp;PI&nbsp;*&nbsp;i&nbsp;/&nbsp;n));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w[k&nbsp;+&nbsp;&nbsp;2]&nbsp;=&nbsp;d2i(scale&nbsp;*&nbsp;sin(4.0&nbsp;*&nbsp;PI&nbsp;*&nbsp;i&nbsp;/&nbsp;n));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w[k&nbsp;+&nbsp;&nbsp;1]&nbsp;=&nbsp;d2i(scale&nbsp;*&nbsp;cos(2.0&nbsp;*&nbsp;PI&nbsp;*&nbsp;i&nbsp;/&nbsp;n));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w[k&nbsp;+&nbsp;&nbsp;0]&nbsp;=&nbsp;d2i(scale&nbsp;*&nbsp;sin(2.0&nbsp;*&nbsp;PI&nbsp;*&nbsp;i&nbsp;/&nbsp;n));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;+=&nbsp;6;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;k;<br />}<br /><br /><br /><br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;*file;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;iRead;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tempI,tempR;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;====================================================================&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Initialize&nbsp;Chip&nbsp;Support&nbsp;Library&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;====================================================================&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;CSL_init();&nbsp;&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;fopen(&quot;test1.PCM&quot;,&nbsp;&quot;rb&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;iRead&nbsp;=&nbsp;fread(ch,&nbsp;1,&nbsp;NN,&nbsp;file);<br />&nbsp;&nbsp;&nbsp;&nbsp;//iRead&nbsp;=&nbsp;fread(ch,&nbsp;1,&nbsp;NN,&nbsp;file);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fclose(file);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;====================================================================&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Generate&nbsp;Q.31&nbsp;input&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;====================================================================&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&ltNN;&nbsp;i++)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x[2*i]&nbsp;=&nbsp;xx[2*i]&nbsp;=&nbsp;(int)ch;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x[2*i+1]&nbsp;=&nbsp;xx[2*i+1]&nbsp;=&nbsp;0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;====================================================================&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Generate&nbsp;twiddle&nbsp;factors&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;====================================================================&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;gen_twiddle_fft32x32(w,&nbsp;NN,&nbsp;2147483647.);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DSP_fft32x32(w,&nbsp;NN,&nbsp;x,&nbsp;y);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&ltNN;&nbsp;i++)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;tempI=y[i*2];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempR=y[i*2+1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z&nbsp;=&nbsp;tempI&nbsp;*&nbsp;tempI&nbsp;+&nbsp;tempR&nbsp;*&nbsp;tempR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;END\n&quot;&nbsp;);<br /><br />}<br /><br />/*&nbsp;========================================================================&nbsp;*/<br />/*&nbsp;&nbsp;End&nbsp;of&nbsp;file:&nbsp;fft32x32_main.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;========================================================================&nbsp;*/<br /><br /><br />test1.pcm是8K采样的16BIT语音信号文件。用cool&nbsp;edit&nbsp;pro软件产生。实际是一个440hz正弦信号。<br />问题描述(用的是CCS3.1环境):<br />1、当信号幅值很小的时候,运行程序到末尾后用view/graph看z数组。发现会出现两个对称的峰值。第一个落在z[28]附件,另外一个落在z[480]附件。为什么这样?这是一个正弦波<br />&nbsp;&nbsp;&nbsp;。虽然z没有开平方,但是应该是单一峰值啊。<br />2、当增大波形的幅值,频率不变后,再看z。发现峰值的波形变宽变乱。为什么这个算法和输入的动态范围有关?如何让FFT变换和输入幅值没有关系?<br />3、把iRead&nbsp;=&nbsp;fread(ch,&nbsp;1,&nbsp;NN,&nbsp;file);语句重复,也就是ch的值取文件的第二次读写结果进行变换,z的结果完全乱了。按照道理,波形文件足够长,又是一个正弦波形。<br />&nbsp;&nbsp;&nbsp;应该没有变化才对。我怀疑什么地方错了。但是我用view/graph看xx的FFT,没有改变。这么说变换前数据是一样的。这是为什么?<br />
 楼主| ysdx 发表于 2007-9-29 11:30 | 显示全部楼层

问题3解决:好像是软件问题。从新启动软件就可以了

问题2是由于没有进行逐级定标导致的,谁会啊
cmliang 发表于 2007-10-6 21:01 | 显示全部楼层

幅值过大

由于DM642是定点DSP,当幅值过大时,FFT计算时产生生的中间结果出现溢出,导致计算结果错误,所以幅值不能过大.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

338

主题

1056

帖子

21

粉丝
快速回复 在线客服 返回列表 返回顶部