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

📄 adc.c

📁 VC33进行FFT变换c源码
💻 C
字号:
#include<math.h>
#define TIM_PRD	    	*(int *)0x808028
#define TIM_CNT     	*(int *)0x808024
#define TIM_CTL     	*(int *)0x808020 


#define TIM_CTL_VALUE   0x601
#define TIM_PRD_VALUE   7500 //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_CHA   *(int *)0xb00001
#define Latch_Data_CHB   *(int *)0xb00002 
#define Latch_Data_CHC   *(int *)0xb00004
#define Latch_Data_CHAB  *(int *)0xb00003
#define Latch_Data_CHAC  *(int *)0xb00005
#define Latch_Data_CHBC  *(int *)0xb00006                                                   
#define Latch_Data_CHABC *(int *)0xb00007   /* 3 channel */  
#define Latch_Data       *(int *)0xb00007


#define VC33RAM3        *(int *)0X803FFF
#define VECS_EXINT0	    *(int *)0x809fc1 
#define VECS_TINT1      *(int *)0x809fca

int buffer[1024];   
int buffer1[1024];        
int i,j,temp,x,k,y,z,l,h;                   

#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; 
float fft_in[512],fft_out[512];
int   input[512],output[512],bitrev_index[256];                          
int   point,point1,i;
float sintab[512],costab[512];

interrupt void adfifo_int(void); 
void sintab_initial(void);
void fft(void);
void ifft(void);
void bitrev(void); 
interrupt void adfifo_int(void); 

main()
{    
     sintab_initial();
     bitrev();  	 
	 ST = 0x0000;
	 IE = 1;
	 IF = 0x0; 
	/* 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;
     point=0;
     for(;;)    
     if (point==256)
     {
     point=0;
     for(i=0;i<256;i++)     
     output[i]=fft_in[i]/256;
     for(i=0;i<256;i++)     
     {fft_in[2*i]=input[i];
      fft_in[2*i+1]=0;
     }
      fft();
      ifft();
     }
   
} 
interrupt void adfifo_int(void)
 {   int i;
           
          buffer[point]=AD_CS_ADDR; 
          buffer[point]=buffer[point]&0x0fff;             
          buffer[point]=buffer[point]+0x0800; 
 //         input[point]=buffer[point];
//          buffer[point]=output[point];
          DAC0=buffer[point];
          DAC1=buffer[point];
          DAC2=buffer[point];
          DAC3=buffer[point];
          point++; 
                     
/*        else if((i=buffer&0xf000)==0x9000)
           {
               buffer2=buffer&0x0fff;
           }                    
           else if((i=buffer&0xf000)==0xa000)
           {
               buffer3=buffer&0x0fff;
            }                                         
           else if((i=buffer&0xf000)==0xb000)
           {
               buffer4=buffer&0x0fff;
           }              
          else  if((i=buffer&0xf000)==0xc000)
           {
               buffer5=buffer&0x0fff;
           }              
          else if((i=buffer&0xf000)==0xd000)           
          {     buffer6=buffer&0x0fff;           
           }
          else  y=0;                     */
          

          
}
   
  
 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[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;
          fft_in[local0]=fft_out[local0]+fft_out[local0+mid1[i]];
          fft_in[local1]=fft_out[local1]+fft_out[local1+mid1[i]];
          fft_in[local0+mid1[i]]=(fft_out[local0]-fft_out[local0+mid1[i]])*costab[Pset]+(fft_out[local1]-fft_out[local1+mid1[i]])*sintab[Pset];
          fft_in[local1+mid1[i]]=(fft_out[local1]-fft_out[local1+mid1[i]])*costab[Pset]-(fft_out[local0]-fft_out[local0+mid1[i]])*sintab[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;
          fft_out[local0]=fft_in[local0]+fft_in[local0+mid1[i]];
          fft_out[local1]=fft_in[local1]+fft_in[local1+mid1[i]];
          fft_out[local0+mid1[i]]=(fft_in[local0]-fft_in[local0+mid1[i]])*costab[Pset]+(fft_in[local1]-fft_in[local1+mid1[i]])*sintab[Pset];
          fft_out[local1+mid1[i]]=(fft_in[local1]-fft_in[local1+mid1[i]])*costab[Pset]-(fft_in[local0]-fft_in[local0+mid1[i]])*sintab[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,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[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;
          fft_in[local0]=fft_out[local0]+fft_out[local0+mid1[i]];
          fft_in[local1]=fft_out[local1]+fft_out[local1+mid1[i]];
          fft_in[local0+mid1[i]]=(fft_out[local0]-fft_out[local0+mid1[i]])*costab[Pset]-(fft_out[local1]-fft_out[local1+mid1[i]])*sintab[Pset];
          fft_in[local1+mid1[i]]=(fft_out[local1]-fft_out[local1+mid1[i]])*costab[Pset]+(fft_out[local0]-fft_out[local0+mid1[i]])*sintab[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;
          fft_out[local0]=fft_in[local0]+fft_in[local0+mid1[i]];
          fft_out[local1]=fft_in[local1]+fft_in[local1+mid1[i]];
          fft_out[local0+mid1[i]]=(fft_in[local0]-fft_in[local0+mid1[i]])*costab[Pset]-(fft_in[local1]-fft_in[local1+mid1[i]])*sintab[Pset];
          fft_out[local1+mid1[i]]=(fft_in[local1]-fft_in[local1+mid1[i]])*costab[Pset]+(fft_in[local0]-fft_in[local0+mid1[i]])*sintab[Pset];         
          } 
     for ( i=0; i<256; i++ )
     {
      fft_in[2*i]=fft_out[bitrev_index[i]];
      fft_in[2*i+1]=fft_out[bitrev_index[i]+1];
     }                     
 
  }              
void sintab_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,
          },
     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++)   
   {sintab[i]=pi2[i];sintab[i+64]=pi1[i];sintab[i+128]=-pi2[i];sintab[i+192]=-pi1[i]; 
    costab[i]=pi1[i];costab[i+64]=-pi2[i];costab[i+128]=-pi1[i];costab[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;                     
}                      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -