📄 fft2.c
字号:
#include <math.h>
#include <float.h>
#include <intrin.h>
#define TIM_PRD *(int *)0x808028
#define TIM_CNT *(int *)0x808024
#define TIM_CTL *(int *)0x808020
#define TIM_CTL_VALUE 0x6c1
#define TIM_PRD_VALUE 1875//3750/* 60Mhz/sample frequency*/
#define TIM_START 0xc0
#define AD_CS_ADDR *(int *)0xf00000 //port address
#define AD_RS_ADDR *(int *)0xf00001
#define FIFO_RS_ADDR *(int *)0xf00002
#define Latch_Data *(int *)0xb00007
#define VC33RAM3 *(int *)0X803FFF
#define VECS_EXINT0 *(int *)0x809fc1
//#define VECS_TINT1 *(int *)0x809fca
#define DAC0 *(int *)0xe00004 /*CHANNEL0*/
#define DAC1 *(int *)0xe00005 /*CHANNEL1*/
#define DAC2 *(int *)0xe00006 /*CHANNEL2*/
#define DAC3 *(int *)0xe00007 /*CHANNEL3*/
#define DACR *(int *)0xe40000
cregister unsigned int IE,IF,ST,IOF;
unsigned char ChNumber;
float fft_in[512],fft_out[512];
int input[512],output[256],bitrev_index[256];
int buffer,point=0,i;
float stab[256],ctab[256];
int mid[8]={128,64,32,16,8,4,2,1},Pset;
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};
interrupt void adfifo_int(void);
void stab_initial(void);
void fft(void);
void ifft(void);
void bitrev(void);
main()
{
ST = 0x0000;
IE = 1;
IF = 0x0;
IOF = 0x22;
for(i=0;i<10;i++);
Latch_Data = 1;
IOF = 0x66;
/* IOF = 0x06; xf0=1*/
TIM_CTL=TIM_CTL_VALUE;
TIM_CNT=0;
TIM_PRD=TIM_PRD_VALUE;
TIM_CTL=TIM_CTL_VALUE|TIM_START;
VECS_EXINT0= 0x60000000|(unsigned)adfifo_int;
ST=0x2000;
bitrev();
stab_initial();
for(;;)
if(point==256)
{
point=0;
for(i=0;i<256;i++)
output[i]=fft_in[i]/256;
for(i=0;i<512;i++)
fft_in[i]=input[i];
fft();
ifft();
}
}
interrupt void adfifo_int(void)
{int k;
buffer=AD_CS_ADDR;
buffer=buffer&0x0FFF;
buffer=buffer+0x0800;
k=point*2;
input[k]=buffer;
input[k+1]=0;
buffer=output[point];
DAC0=buffer;
point++;
}
void fft(void)
{
int i,j,k,local0,local1,win0,win1,win2,win3;
for (i=0;i<8;i++)
if ((i==curse[i]))
for (k=0;k<i_k[i];k++)
for (j=0;j<mid[i];j++)
{
Pset=j*inner[i];
local0=2*j+k*mid2[i];local1=local0+1; win0=local0+mid1[i];win1=local1+mid1[i];
fft_in[local0]=fft_out[local0]+fft_out[win0];
fft_in[local1]=fft_out[local1]+fft_out[win1];
fft_in[win0]=(fft_out[local0]-fft_out[win0])*ctab[Pset]-(fft_out[local1]-fft_out[win1])*stab[Pset];
fft_in[win1]=(fft_out[local1]-fft_out[win1])*ctab[Pset]+(fft_out[local0]-fft_out[win0])*stab[Pset];
}
else
for (k=0;k<i_k[i];k++)
for (j=0;j<mid[i];j++)
{
Pset=j*inner[i];
local0=2*j+k*mid2[i];local1=local0+1; win0=local0+mid1[i];win1=local1+mid1[i];
fft_out[local0]=fft_in[local0]+fft_in[win0];
fft_out[local1]=fft_in[local1]+fft_in[win1];
fft_out[win0]=(fft_in[local0]-fft_in[win0])*ctab[Pset]-(fft_in[local1]-fft_in[win1])*stab[Pset];
fft_out[win1]=(fft_in[local1]-fft_in[win1])*ctab[Pset]+(fft_in[local0]-fft_in[win0])*stab[Pset];
}
for ( i=0; i<256; i++ )
{
fft_out[2*i]=fft_in[bitrev_index[i]];
fft_out[2*i+1]=fft_in[bitrev_index[i]+1];
}
}
void ifft(void)
{
int i,j,k,local0,local1,win0,win1,win2,win3;
for (i=0;i<8;i++)
if ((i!=curse[i]))
for (k=0;k<i_k[i];k++)
for (j=0;j<mid[i];j++)
{
Pset=j*inner[i];
local0=2*j+k*mid2[i];local1=local0+1; win0=local0+mid1[i];win1=local1+mid1[i];
fft_in[local0]=fft_out[local0]+fft_out[win0];
fft_in[local1]=fft_out[local1]+fft_out[win1];
fft_in[win0]=(fft_out[local0]-fft_out[win0])*ctab[Pset]-(fft_out[local1]-fft_out[win1])*stab[Pset];
fft_in[win1]=(fft_out[local1]-fft_out[win1])*ctab[Pset]+(fft_out[local0]-fft_out[win0])*stab[Pset];
}
else
for (k=0;k<i_k[i];k++)
for (j=0;j<mid[i];j++)
{
Pset=j*inner[i];
local0=2*j+k*mid2[i];local1=local0+1; win0=local0+mid1[i];win1=local1+mid1[i];
fft_out[local0]=fft_in[local0]+fft_in[win0];
fft_out[local1]=fft_in[local1]+fft_in[win1];
fft_out[win0]=(fft_in[local0]-fft_in[win0])*ctab[Pset]-(fft_in[local1]-fft_in[win1])*stab[Pset];
fft_out[win1]=(fft_in[local1]-fft_in[win1])*ctab[Pset]+(fft_in[local0]-fft_in[win0])*stab[Pset];
}
for ( i=0; i<256; i++ )
fft_in[i]=fft_out[bitrev_index[i]];
}
void stab_initial(void)
{
int i,mid,pi=3.14159265359;
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,
},
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,
};
for(i=0;i<64;i++)
{stab[i]=pi2[i];stab[i+64]=pi1[i];stab[i+128]=-pi2[i];stab[i+192]=-pi1[i];
ctab[i]=pi1[i];ctab[i+64]=-pi2[i];ctab[i+128]=-pi1[i];ctab[i+192]=pi2[i];
}
}
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[i]=a[i]*2;output[i]=0;}
for(i=0;i<512;i++)
input[i]=i/2+1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -