📄 butterflycalculate.txt
字号:
butterfly calculate %TI VC33 DSP上的256点FFT程序
#include <math.h>
#include <float.h>
#include <intrin.h>
unsigned char ChNumber;
float fft_in[512],fft_out[512];
int input[512],output[512],bitrev_index[256];
int buffer,point=0,i;
float stab[512],ctab[512],test;
interrupt void adfifo_int(void);
void stab_initial(void);
void fft(void);
void ifft(void);
void bitrev(void);
main()
{
bitrev();
stab_initial();
for(i=1;i<512;i++)
fft_in=input;
fft();
ifft();
for(i=0;i<256;i++)
output=fft_out/256;
for(;;
}
interrupt void adfifo_int(void)
{ int k;
buffer=AD_CS_ADDR;
buffer=buffer&0x0FFF;
buffer=buffer+0x0800;
DAC0=buffer;
point++;
}
void fft(void)
{
int i,j,k,mid[8]={128,64,32,16,8,4,2,1},Pset,local0,local1,win,win1,win2,win3;
int mid1[8]={256,128,64,32,16,8,4,2};
int mid2[8]={512,256,128,64,32,16,8,4};
int inner[8]={1,2,4,8,16,32,64,0};
int i_k[8]={1,2,4,8,16,32,64,128};
int curse[]={1,1,3,3,5,5,7,7};
for (i=0;i<8;i++)
{if ((i==curse))
{for (k=0;k<i_k;k++)
{for (j=0;j<mid;j++) //这个for循环内部没有看懂,应该是做蝶形运算的,网络上多半都是这么写的
{
Pset=j*inner;
local0=2*j+k*mid2;local1=local0+1;
fft_in[local0]=fft_out[local0]+fft_out[local0+mid1];
fft_in[local1]=fft_out[local1]+fft_out[local1+mid1];
fft_in[local0+mid1]=(fft_out[local0]-fft_out[local0+mid1])*ctab[Pset]+(fft_out[local1]-fft_out[local1+mid1])*stab[Pset];
fft_in[local1+mid1]=(fft_out[local1]-fft_out[local1+mid1])*ctab[Pset]-(fft_out[local0]-fft_out[local0+mid1])*stab[Pset];
}
win3= ctab[Pset];
}
}
else
{for (k=0;k<i_k;k++)
{for (j=0;j<mid;j++)
{
Pset=j*inner;
local0=2*j+k*mid2;local1=local0+1;
fft_out[local0]=fft_in[local0]+fft_in[local0+mid1];
fft_out[local1]=fft_in[local1]+fft_in[local1+mid1];
fft_out[local0+mid1]=(fft_in[local0]-fft_in[local0+mid1])*ctab[Pset]+(fft_in[local1]-fft_in[local1+mid1])*stab[Pset];
fft_out[local1+mid1]=(fft_in[local1]-fft_in[local1+mid1])*ctab[Pset]-(fft_in[local0]-fft_in[local0+mid1])*stab[Pset];
}
}
}
}
for ( i=0; i<256; i++ )
{
fft_out[2*i]=fft_in[bitrev_index];
fft_out[2*i+1]=fft_in[bitrev_index+1];
}
}
void ifft(void)
{
int i,j,k,mid[8]={128,64,32,16,8,4,2,1},Pset,local0=0,local1=1;
int mid1[8]={256,128,64,32,16,8,4,2};
int mid2[8]={512,256,128,64,32,16,8,4};
int inner[8]={1,2,4,8,16,32,64,0};
int i_k[8]={1,2,4,8,16,32,64,128};
int curse[]={1,1,3,3,5,5,7,7};
for (i=0;i<8;i++)
if ((i!=curse))
for (k=0;k<i_k;k++)
for (j=0;j<mid;j++)
{
Pset=j*inner;
local0=2*j+k*mid2;local1=local0+1;
fft_in[local0]=fft_out[local0]+fft_out[local0+mid1];
fft_in[local1]=fft_out[local1]+fft_out[local1+mid1];
fft_in[local0+mid1]=(fft_out[local0]-fft_out[local0+mid1])*ctab[Pset]-(fft_out[local1]-fft_out[local1+mid1])*stab[Pset];
fft_in[local1+mid1]=(fft_out[local1]-fft_out[local1+mid1])*ctab[Pset]+(fft_out[local0]-fft_out[local0+mid1])*stab[Pset];
}
else
for (k=0;k<i_k;k++)
for (j=0;j<mid;j++)
{
Pset=j*inner;
local0=2*j+k*mid2;local1=local0+1;
fft_out[local0]=fft_in[local0]+fft_in[local0+mid1];
fft_out[local1]=fft_in[local1]+fft_in[local1+mid1];
fft_out[local0+mid1]=(fft_in[local0]-fft_in[local0+mid1])*ctab[Pset]-(fft_in[local1]-fft_in[local1+mid1])*stab[Pset];
fft_out[local1+mid1]=(fft_in[local1]-fft_in[local1+mid1])*ctab[Pset]+(fft_in[local0]-fft_in[local0+mid1])*stab[Pset];
}
for ( i=0; i<256; i++ )
{
fft_in[2*i]=fft_out[bitrev_index];
fft_in[2*i+1]=fft_out[bitrev_index+1];
}
}
void stab_initial(void)
{
int i,mid;
float pi1[]={1.000000000,0.999698819,0.998795456,0.997290457,
0.995184727,0.992479535,0.98917651, 0.985277642,
0.98078528, 0.97570213, 0.970031253,0.963776066,
0.956940336,0.949528181,0.941544065,0.932992799,
0.923879533,0.914209756,0.903989293,0.893224301,
0.881921264,0.870086991,0.85772861, 0.844853565,
0.831469612,0.817584813,0.803207531,0.788346428,
0.773010453,0.757208847,0.740951125,0.724247083,
0.707106781,0.689540545,0.671558955,0.653172843,
0.634393284,0.615231591,0.595699304,0.575808191,
0.555570233,0.53499762, 0.514102744,0.492898192,
0.471396737,0.44961133, 0.427555093,0.405241314,
0.382683432,0.359895037,0.336889853,0.31368174,
0.290284677,0.266712757,0.24298018, 0.21910124,
0.195090322,0.170961889,0.146730474,0.122410675,
0.09801714, 0.073564564,0.049067674,0.024541229,
}, //cos 1/4周期
pi2[]={0.00000000,0.024541229,0.049067674,0.073564564, 0.09801714,
0.122410675, 0.146730474, 0.170961889, 0.195090322,
0.21910124, 0.24298018, 0.266712757, 0.290284677,
0.31368174, 0.336889853,0.359895037, 0.382683432,
0.405241314,0.427555093, 0.44961133, 0.471396737,
0.492898192,0.514102744, 0.53499762, 0.555570233,
0.575808191,0.595699304, 0.615231591, 0.634393284,
0.653172843,0.671558955, 0.689540545, 0.707106781,
0.724247083, 0.740951125, 0.757208847,0.773010453,
0.788346428, 0.803207531,0.817584813,0.831469612,
0.844853565, 0.85772861, 0.870086991, 0.881921264,
0.893224301, 0.903989293,0.914209756, 0.923879533,
0.932992799, 0.941544065,0.949528181,0.956940336,
0.963776066, 0.970031253,0.97570213, 0.98078528,
0.985277642, 0.98917651, 0.992479535,0.995184727,
0.997290457, 0.998795456,0.999698819,
}; //sin 1/4周期
for(i=0;i<64;i++)
{stab=pi2;stab[i+64]=pi1;stab[i+128]=-pi2;stab[i+192]=-pi1;
ctab=pi1;ctab[i+64]=-pi2;ctab[i+128]=-pi1;ctab[i+192]=pi2;
}
point=0;
}
void bitrev(void)
{int i;
int a[]={0,128,64,192,32,160, 96,224,16,144,80,208,48,176,112,240,
8,136,72,200,40,168,104,232,24,152,88,216,56,184,120,248,
4,132,68,196,36,164,100,228,20,148,84,212,52,180,116,244,
12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,
2,130,66,194,34,162, 98,226,18,146,82,210,50,178,114,242,
10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,
6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,
14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254,
1,129,65,193,33,161, 97,225,17,145,81,209,49,177,113,241,
9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249,
5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245,
13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,
3,131,67,195,35,163, 99,227,19,147,83,211,51,179,115,243,
11,139,75,203,43,171,107,235,27,155,91,219,59,187,123,251,
7,135,71,199,39,167,103,231,23,151,87,215,55,183,119,247,
15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255
};
for(i=0;i<256;i++)
{bitrev_index=a*2;output=0;}
for(i=0;i<512;i++)
{
input=i/2+1;
}
SINTAB
FLOAT 1.000000000
FLOAT 0.999698819
FLOAT 0.998795456
FLOAT 0.997290457
FLOAT 0.995184727
FLOAT 0.992479535
FLOAT 0.98917651
FLOAT 0.985277642
FLOAT 0.98078528
FLOAT 0.97570213
FLOAT 0.970031253
FLOAT 0.963776066
FLOAT 0.956940336
FLOAT 0.949528181
FLOAT 0.941544065
FLOAT 0.932992799
FLOAT 0.923879533
FLOAT 0.914209756
FLOAT 0.903989293
FLOAT 0.893224301
......
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -