关于FFT的数据分离

[复制链接]
2604|3
 楼主| soso 发表于 2007-5-24 13:43 | 显示全部楼层 |阅读模式
请教一下各位,我用一个N点长的FFT一次计算了两个N点长的实序列,[ 即: x(n)=x1(n)+jx2(n)  计算FFT(x(n),N) ],倒是给数据变换出来了,在书上整了很久,也没看出怎么从共扼对称的性质中将两个序列的FFT值分离出来.还请知情的给指导一下,谢谢了.
 楼主| soso 发表于 2007-5-28 11:47 | 显示全部楼层

终于出来了

又苦看了两天书,倒是出来了<br />作了三个序列的实验,均作的8点的:<br />x1=2*i+j0&nbsp;//&nbsp;0&lt=i&lt=7<br />x2=3*i=j0&nbsp;&nbsp;//&nbsp;0&lt=i&lt=7<br />x3=2*i=j3*i&nbsp;&nbsp;&nbsp;//&nbsp;0&lt=i&lt=7&nbsp;&nbsp;&nbsp;<br /><br /><br />fft(x1,8)的结果<br />56.0000<br />-8.0000+19.3137j<br />-8.0000+8.0000j<br />-8.0000+3.3137j<br />-8.0000<br />-8.0000-3.3137j<br />-8.0000-8.0000j<br />-8.0000-19.3137j<br />fft(x2,8)的结果<br />84.0000<br />-12.0000+28.9706j<br />-12.0000+12.0000j<br />-12.0000+4.9706j<br />-12.0000<br />-12.0000-4.9706j<br />-12.0000-12.0000j<br />-12.0000-28.9706j<br /><br />fft(x3,8)的结果经分离后的两个序列<br />56.0000<br />-8.0000+19.3137j<br />-8.0000+8.0000j<br />-8.0000+3.3137j<br />-8.0000<br />-8.0000-3.3137j<br />-8.0000-8.0000j<br />-8.0000-19.3137j<br />//******************<br />84.0000<br />-12.0000-28.9706j<br />-12.0000-12.0000j<br />-12.0000-4.9706j<br />-12.0000<br />-12.0000+4.9706j<br />-12.0000+12.0000j<br />-12.0000+28.9706j<br /><br />仿真用的程序:&nbsp;<br />声明:FFT主程序是在网上找的经修改后的程序,作者的相关信息均在哈<br /><br />/*时间抽选基2FFT及IFFT算法C语言实现*/<br />/*Author&nbsp;:Junyi&nbsp;Sun*/<br />/*Copyright&nbsp;2004-2005*/<br />/*Mail:ccnusjy@yahoo.com.cn*/<br />#include&nbsp;&ltiostream.h&gt<br />#include&nbsp;&ltstdio.h&gt<br />#include&nbsp;&ltmath.h&gt<br />#include&nbsp;&ltstdlib.h&gt<br /><br />/*定义复数类型*/<br />typedef&nbsp;struct<br />{<br />&nbsp;&nbsp;float&nbsp;real;<br />&nbsp;&nbsp;float&nbsp;img;<br />}complex;<br /><br />&nbsp;void&nbsp;fft(complex&nbsp;*dt,int&nbsp;n);&nbsp;&nbsp;&nbsp;&nbsp;/*快速傅里叶变换*/<br />//&nbsp;void&nbsp;ifft();&nbsp;&nbsp;&nbsp;/*快速傅里叶反变换*/<br />&nbsp;void&nbsp;initW(complex&nbsp;*W,int&nbsp;n);&nbsp;&nbsp;/*初始化变换核*/<br /><br />&nbsp;void&nbsp;depart(complex&nbsp;*x1,complex&nbsp;*x2,int&nbsp;n);<br /><br />&nbsp;void&nbsp;add(complex&nbsp;,complex&nbsp;,complex&nbsp;*);&nbsp;/*复数加法*/<br />&nbsp;void&nbsp;mul(complex&nbsp;,complex&nbsp;,complex&nbsp;*);&nbsp;/*复数乘法*/<br />&nbsp;void&nbsp;sub(complex&nbsp;,complex&nbsp;,complex&nbsp;*);&nbsp;/*复数减法*/<br />&nbsp;void&nbsp;output(complex&nbsp;*dt,int&nbsp;n);&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 /><br />double&nbsp;&nbsp;&nbsp;PI;&nbsp;/*圆周率*/<br />double&nbsp;&nbsp;&nbsp;PI2;//&nbsp;2*PI<br />int&nbsp;main()<br />{<br />&nbsp;&nbsp;int&nbsp;i,method;<br />&nbsp;&nbsp;int&nbsp;size_x=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*输入序列的大小,在本程序中仅限2的次幂*/<br />&nbsp;&nbsp;double&nbsp;a;<br />&nbsp;&nbsp;complex&nbsp;*x,*y;<br />&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;system(&quot;cls&quot;);<br />&nbsp;&nbsp;//PI=atan(1)*4;<br />&nbsp;&nbsp;PI=3.141592653589793;<br />&nbsp;&nbsp;PI2=6.283185307179586;<br /><br />&nbsp;&nbsp;cout&lt&lt&quot;print&nbsp;N=&nbsp;
&quot;;<br />&nbsp;&nbsp;cin&gt&gtsize_x;<br />&nbsp;&nbsp;a=PI2/size_x;<br /><br /><br />&nbsp;&nbsp;x=new&nbsp;complex;<br />&nbsp;&nbsp;y=new&nbsp;complex;<br />&nbsp;&nbsp;if(x==NULL&nbsp;||&nbsp;y==NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);<br /><br />&nbsp;&nbsp;cout&lt&lt&quot;x.real=2*i&nbsp;&nbsp;x.img=0&nbsp;&nbsp;
&quot;;<br />&nbsp;&nbsp;for(i=0;i&ltsize_x;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.real=2*i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.img=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;fft(x,size_x);<br />&nbsp;&nbsp;output(x,size_x);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;cout&lt&lt&quot;any&nbsp;key&nbsp;NO.&nbsp;&quot;;<br />&nbsp;&nbsp;cin&gt&gti;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;cout&lt&lt&quot;x.real=3*i&nbsp;&nbsp;x.img=0&nbsp;&nbsp;
&quot;;<br />&nbsp;&nbsp;for(i=0;i&ltsize_x;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.real=3*i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.img=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;fft(x,size_x);<br />&nbsp;&nbsp;output(x,size_x);<br /><br />&nbsp;&nbsp;cout&lt&lt&quot;any&nbsp;key&nbsp;NO.&nbsp;&quot;;<br />&nbsp;&nbsp;cin&gt&gti;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;cout&lt&lt&quot;2*i+j3*i&nbsp;&nbsp;
&quot;;<br />&nbsp;&nbsp;for(i=0;i&ltsize_x;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.real=2*i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.img=3*i;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;fft(x,size_x);&nbsp;&nbsp;&nbsp;<br />&nbsp;depart(x,y,size_x);&nbsp;//数据分离<br />&nbsp;output(x,size_x);<br />&nbsp;output(y,size_x);<br /><br /><br />&nbsp;delete[]&nbsp;y;<br />&nbsp;delete[]&nbsp;x;<br /><br />&nbsp;return&nbsp;0;<br />}<br /><br />/*快速傅里叶变换*/<br />void&nbsp;fft(complex&nbsp;*dt,int&nbsp;n)<br />{<br />&nbsp;&nbsp;int&nbsp;i=0,j=0,k=0,r=0;<br />&nbsp;&nbsp;complex&nbsp;up,down,product,*W;<br /><br />&nbsp;&nbsp;double&nbsp;t;<br /><br />/*变址计算,将x(n)码位倒置*/<br />//***********************<br /><br />&nbsp;&nbsp;for(i=0;i&ltn;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k=i;j=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t=(log(n)/log(2));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(t--)&gt0&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=j&lt&lt1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j|=(k&nbsp;&&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k=k&gt&gt1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i&ltj)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product=dt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dt=dt[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dt[j]=product;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />//*********************<br />&nbsp;&nbsp;W=new&nbsp;complex[n];<br />&nbsp;&nbsp;if(W==NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;exit(0);<br /><br />&nbsp;&nbsp;initW(W,n);<br />//**********************************<br />&nbsp;&nbsp;i=j=k=0;<br />&nbsp;&nbsp;t=(log(n)/log(2));<br /><br />&nbsp;&nbsp;for(i=0;i&ltt&nbsp;;i++)<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;//*一级蝶形运算&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;r=1&lt&lti;//取&nbsp;r<br />&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;j&ltn;j+=&nbsp;2*r&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//*一组蝶形运算<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(k=0;k&ltr;k++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//*一个蝶形运算<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mul(dt[j+k+r],W[n*k/2/r],&product);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(dt[j+k],product,&up);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub(dt[j+k],product,&down);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dt[j+k]=up;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dt[j+k+r]=down;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;delete[]&nbsp;W;<br />}<br /><br /><br />void&nbsp;depart(complex&nbsp;*x1,complex&nbsp;*x2,int&nbsp;n)<br />{<br />&nbsp;&nbsp;float&nbsp;temp1_data_r,temp1_data_i,temp2_data_r,temp2_data_i;<br />&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;complex&nbsp;*s_x1;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;s_x1=new&nbsp;complex[n];<br />&nbsp;&nbsp;if(s_x1==NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;exit(0);<br /><br />&nbsp;&nbsp;for(i=0;i&ltn;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;s_x1=x1;<br /><br />&nbsp;&nbsp;for(i=1;i&ltn;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp1_data_r=(s_x1.real+s_x1[n-i].real)*0.5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2_data_i=(s_x1.real-s_x1[n-i].real)*0.5;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp2_data_r=(s_x1.img+s_x1[n-i].img)*0.5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp1_data_i=(s_x1.img-s_x1[n-i].img)*0.5;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x1.real=temp1_data_r;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x1.img=temp1_data_i;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x2.real=temp2_data_r;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x2.img=temp2_data_i;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;x1[0].real=s_x1[0].real;<br />&nbsp;&nbsp;x1[0].img=0;<br /><br />&nbsp;&nbsp;x2[0].real=s_x1[0].img;<br />&nbsp;&nbsp;x2[0].img=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;delete[]&nbsp;s_x1;<br />}<br /><br /><br /><br /><br />/*初始化变换核,cos,sin表*/<br />void&nbsp;initW(complex&nbsp;*W,int&nbsp;n)<br />{<br />&nbsp;&nbsp;/*输入序列,变换核*/<br />&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;double&nbsp;a;<br /><br />&nbsp;&nbsp;a=PI2/n;<br />&nbsp;&nbsp;for(i=0;i&ltn;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W.real=cos(a*i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W.img=-1*sin(a*i);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />/*输出傅里叶变换的结果*/<br />void&nbsp;output(complex&nbsp;*dt,int&nbsp;n)<br />{<br />&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;printf(&quot;The&nbsp;result&nbsp;are&nbsp;as&nbsp;follows
&quot;);<br />&nbsp;&nbsp;for(i=0;i&ltn;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%.4f&quot;,dt.real);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dt.img&gt=0.0001)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;+%.4fj
&quot;,dt.img);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(fabs(dt.img)&lt0.0001)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%.4fj
&quot;,dt.img);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;add(complex&nbsp;a,complex&nbsp;b,complex&nbsp;*c)<br />{<br />&nbsp;&nbsp;c-&gtreal=a.real+b.real;<br />&nbsp;&nbsp;c-&gtimg=a.img+b.img;<br />}<br /><br />void&nbsp;mul(complex&nbsp;a,complex&nbsp;b,complex&nbsp;*c)<br />{<br />&nbsp;&nbsp;c-&gtreal=a.real*b.real&nbsp;-&nbsp;a.img*b.img;<br />&nbsp;&nbsp;c-&gtimg=a.real*b.img&nbsp;+&nbsp;a.img*b.real;<br />}<br /><br />void&nbsp;sub(complex&nbsp;a,complex&nbsp;b,complex&nbsp;*c)<br />{<br />&nbsp;&nbsp;c-&gtreal=a.real-b.real;<br />&nbsp;&nbsp;c-&gtimg=a.img-b.img;<br />}<br /><br />//可能FFT程序中还有一些BUG,请指教一下<br /><br /><br />
wh111wh 发表于 2007-5-28 17:07 | 显示全部楼层

拜服

既然用dsp,就可以用现成的fft.lib,不需要自己编吧
 楼主| soso 发表于 2007-5-28 20:32 | 显示全部楼层

我还不会用DSP呢

这个是在386的嵌入式板子上跑的,用C++作的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

0

帖子

1

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