<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>对影成三人 &#187; fft</title>
	<atom:link href="http://ichaochao.com/tag/fft/feed/" rel="self" type="application/rss+xml" />
	<link>http://ichaochao.com</link>
	<description></description>
	<lastBuildDate>Wed, 21 Jul 2010 03:29:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>FFT在C6000DSP上的仿真</title>
		<link>http://ichaochao.com/2008/07/01/fft_in_dsp/</link>
		<comments>http://ichaochao.com/2008/07/01/fft_in_dsp/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 09:04:00 +0000</pubDate>
		<dc:creator>beethoven</dc:creator>
				<category><![CDATA[假装懂技术]]></category>
		<category><![CDATA[假装爱摄影]]></category>
		<category><![CDATA[c6000]]></category>
		<category><![CDATA[CCS]]></category>
		<category><![CDATA[DSP]]></category>
		<category><![CDATA[fft]]></category>

		<guid isPermaLink="false">http://ichaochao.com/2008/07/01/fft_in_dsp/</guid>
		<description><![CDATA[经过一段时间的学习，今天在CCS内成功仿真了基2频域抽取FFT(radix2 DIF FFT)。
环境：CCS 3.1 + C6201 Device Simulator
仿真结果如下图：

全部代码在下面，为了描述简单，把所有函数写在了一起，实际运用中不应该这样做。另外位反转索引表和旋转因子表都是在里面实时生成的，实际运用时，应该做好表格后嵌入，或在编译时生成而不是运行时生成。
感谢 pacificxu 的教程，他貌似曾经是闻亭的高手。
#include &#8220;math.h&#8221;
/*========================================*/
/* GLOBAL CONSTANTS                                                          */
/*========================================*/
#define PI    3.14159265358979
#define N        2048
/*========================================*/
/* GLOBAL VARIABLES                                                          */
/*========================================*/
static short index1[64], w1[N];
static short x1[N*2];
static int x2[N];
int i;
void DSP_radix2(int n, short *restrict xy, const short *restrict w)
{
short n1,n2,ie,ia,i,j,k,l;
short xt,yt,c,s;
n2 = n;
ie = 1;
for (k=n; k &#62; 1; k = (k &#62;&#62; 1) )
{
n1 = <a href="http://ichaochao.com/2008/07/01/fft_in_dsp/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>经过一段时间的学习，今天在CCS内成功仿真了基2频域抽取FFT(radix2 DIF FFT)。</p>
<p>环境：CCS 3.1 + C6201 Device Simulator</p>
<p>仿真结果如下图：</p>
<p><span id="more-155"></span><a href="http://ichaochao.com/wp-content/uploads/2008/07/fft-timewave.jpg"><img style="0px" src="http://ichaochao.com/wp-content/uploads/2008/07/fft-timewave-thumb.jpg" border="0" alt="fft_timewave" width="244" height="169" /></a><a href="http://ichaochao.com/wp-content/uploads/2008/07/fft-freqwave.jpg"><img style="0px" src="http://ichaochao.com/wp-content/uploads/2008/07/fft-freqwave-thumb.jpg" border="0" alt="fft_freqwave" width="244" height="168" /></a></p>
<p>全部代码在下面，为了描述简单，把所有函数写在了一起，实际运用中不应该这样做。另外位反转索引表和旋转因子表都是在里面实时生成的，实际运用时，应该做好表格后嵌入，或在编译时生成而不是运行时生成。</p>
<p>感谢 pacificxu 的教程，他貌似曾经是闻亭的高手。</p>
<p>#include &#8220;math.h&#8221;<br />
/*========================================*/<br />
/* GLOBAL CONSTANTS                                                          */<br />
/*========================================*/</p>
<p>#define PI    3.14159265358979<br />
#define N        2048</p>
<p>/*========================================*/<br />
/* GLOBAL VARIABLES                                                          */<br />
/*========================================*/<br />
static short index1[64], w1[N];<br />
static short x1[N*2];<br />
static int x2[N];<br />
int i;</p>
<p>void DSP_radix2(int n, short *restrict xy, const short *restrict w)<br />
{<br />
short n1,n2,ie,ia,i,j,k,l;<br />
short xt,yt,c,s;<br />
n2 = n;<br />
ie = 1;<br />
for (k=n; k &gt; 1; k = (k &gt;&gt; 1) )<br />
{<br />
n1 = n2;<br />
n2 = n2&gt;&gt;1;<br />
ia = 0;<br />
for (j=0; j &lt; n2; j++)<br />
{<br />
c = w[2*ia];<br />
s = w[2*ia+1];<br />
ia = ia + ie;<br />
for (i=j; i &lt; n; i += n1)<br />
{<br />
l = i + n2;<br />
xt      = xy[2*l] &#8211; xy[2*i];<br />
xy[2*i] = xy[2*i] + xy[2*l];<br />
yt      = xy[2*l+1] &#8211; xy[2*i+1];<br />
xy[2*i+1] = xy[2*i+1] + xy[2*l+1];<br />
xy[2*l]   = (c*xt + s*yt)&gt;&gt;15;<br />
xy[2*l+1] = (c*yt &#8211; s*xt)&gt;&gt;15;<br />
}<br />
}<br />
ie = ie&lt;&lt;1;<br />
}<br />
}<br />
void DSP_bitrev_cplx(int *x, short *index, int nx)<br />
{<br />
int     i;<br />
short       i0, i1, i3;<br />
short       j0, j1, j3;<br />
int     xi0, xi1, xi3;<br />
int     xj0, xj1, xj3;<br />
short       t;<br />
int     a, b, ia, ib, ibs;<br />
int     mask;<br />
int     nbits, nbot, ntop, ndiff, n2, halfn;<br />
nbits = 0;<br />
i = nx;<br />
while (i &gt; 1)<br />
{<br />
i = i &gt;&gt; 1;<br />
nbits++;<br />
}</p>
<p>nbot    = nbits &gt;&gt; 1;<br />
ndiff   = nbits &amp; 1;<br />
ntop    = nbot + ndiff;<br />
n2      = 1 &lt;&lt; ntop;<br />
mask    = n2 &#8211; 1;<br />
halfn   = nx &gt;&gt; 1;<br />
for (i0 = 0; i0 &lt; halfn; i0 += 2)<br />
{<br />
b   = i0 &amp; mask;<br />
a   = i0 &gt;&gt; nbot;<br />
if (!b) ia  = index[a];<br />
ib  = index[b];<br />
ibs = ib &lt;&lt; nbot;<br />
j0  = ibs + ia;<br />
t   = i0 &lt; j0;<br />
xi0 = x[i0];<br />
xj0 = x[j0];</p>
<p>if (t){x[i0] = xj0;<br />
x[j0] = xi0;}</p>
<p>i1  = i0 + 1;<br />
j1  = j0 + halfn;<br />
xi1 = x[i1];<br />
xj1 = x[j1];<br />
x[i1] = xj1;<br />
x[j1] = xi1;</p>
<p>i3  = i1 + halfn;<br />
j3  = j1 + 1;<br />
xi3 = x[i3];<br />
xj3 = x[j3];<br />
if (t){x[i3] = xj3;<br />
x[j3] = xi3;}<br />
}<br />
}<br />
void bitrev_index(short *index, int n)<br />
{<br />
int   i, j, k, radix = 2;<br />
short nbits, nbot, ntop, ndiff, n2, raddiv2;<br />
nbits = 0;<br />
i = n;<br />
while (i &gt; 1)<br />
{<br />
i = i &gt;&gt; 1;<br />
nbits++;<br />
}<br />
raddiv2 = radix &gt;&gt; 1;<br />
nbot    = nbits &gt;&gt; raddiv2;<br />
nbot    = nbot &lt;&lt; raddiv2 &#8211; 1;<br />
ndiff   = nbits &amp; raddiv2;<br />
ntop    = nbot + ndiff;<br />
n2      = 1 &lt;&lt; ntop;<br />
index[0] = 0;<br />
for ( i = 1, j = n2/radix + 1; i &lt; n2 &#8211; 1; i++)<br />
{<br />
index[i] = j &#8211; 1;<br />
for (k = n2/radix; k*(radix-1) &lt; j; k /= radix)<br />
j -= k*(radix-1);<br />
j += k;<br />
}<br />
index[n2 - 1] = n2 &#8211; 1;<br />
}<br />
/*===================================*/<br />
/* MAIN()                                                                    */<br />
/*===================================*/<br />
void main()</p>
<p>{<br />
double delta;</p>
<p>/*======== init the index table for FFT bitrev =====*/</p>
<p>bitrev_index(index1, N);</p>
<p>/*======== init the FFT coeficients =====*/<br />
delta = 2*PI/N;<br />
for (i=0;i&lt;N/2;i++)<br />
{<br />
w1[2*i] = 32767*(-cos((double)i*delta));<br />
w1[2*i+1] = 32767*(-sin((double)i*delta));<br />
}</p>
<p>/*======== init the input data =====*/<br />
for (i=0;i&lt;N;i++)<br />
{<br />
x1[2*i] = (short)((cos(PI*i/20.0)+cos(PI*i/10.0)+cos(PI*i/5.0))*0&#215;80);<br />
x1[2*i+1] = 0;<br />
}<br />
/*======== implement FFT =====*/</p>
<p>DSP_radix2(N, x1, w1);<br />
for (i=0; i&lt;N; i++)<br />
{<br />
x2[i] = sqrt(x1[2*i]*x1[2*i]+x1[2*i+1]*x1[2*i+1]);  //&#8212;?<br />
}</p>
<p>/*======== bitrev =====*/</p>
<p>DSP_bitrev_cplx(x2, index1, N);<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://ichaochao.com/2008/07/01/fft_in_dsp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
