⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 butterflycalculate.txt

📁 蝶形运算,用于TI VC33 DSP上的256点FFT程序
💻 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 + -