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

📄 main.c

📁 tms320lf2407上的fft程序代码。
💻 C
字号:
#include "global.c" 
#include "math.h" 

float outdata[64];
#define pi 3.1415926        //定义常量
#define r  6                //频谱分析的旋转因子,64点的FFT变换            
#define N  64               //频谱分析数组长度

float data2_real[N];        //定义FFT变换的实部
float data2_imag[N];        //定义FFT变换的虚部
unsigned int x[N+10];       //定义输入数组
float xin[N];
unsigned int *p_x;

double f;
double fs;
void vect();                //中断向量子程序

void fft();                 //FFT变换子程序

extern void input_data();
extern void c54init();


main()

{
for(;;)
  {
    int k,n,i;   
    k=0;    
    c54init();  
    f=1500.0;
/*
   // frequency_sel();  	//重新采样     
     TCR=0x0114;
     PRD=331;

     fs=1000.0*1000.0/((PRD+1)*5)*100.0;////主频是100MHz 
     //采样频率设置为60.240KHz 
    
     TCR=0x0124; 
    // input_data();  
    */
    for(i=0;i<64;i++)
     { xin[i]=sin(3.14*2*i/64)+sin(3*3.14*2*i/64)+sin(5*3.14*2*i/64);
     }       
                                  
    fft();
       
    for(n=0;n<N;n++)
      { 
        outdata[n]=sqrt(data2_real[n]*data2_real[n]+data2_imag[n]*data2_imag[n]);
      } 
       k++;
  }
}

void input_data()               /* 采样子程序 */
{
  int i;                        //定义变量
  p_x=x;                        //定义指针数组
  asm(" RSBX INTM");
  IFR=0x0008;                   //开定时器中断
  IMR=0x0008;                   //屏蔽定时器以外的中断    
  
  asm(" pshm ar0");             //保护ar0值
  asm(" pshm ar1");             //保护ar1值
  asm(" stm #004ah,ar0");       //采样74点 
  asm(" mvdm _p_x,ar1");        //采样数据写到数组里
    
  asm("qaz: idle 1");	        //等待,直到产生中断
                                //如果intm=0,响应中断服务程序 
                                //如果intm=1,直接执行下面程序,不进入中断服务程序

  asm(" portr 0008h,*ar1+");    //读取I/O地址AD:0008h的数据
    
  asm(" stm #0ffffh,IFR");      //请求所有中断
  asm(" banz qaz,*ar0-");	    //采样点数未到设定值,跳转继续采样
  asm(" popm ar1");		        //恢复AR1值
  asm(" popm ar0");             //恢复AR0值   
 
  asm(" ssbx intm");
          
  IMR=IMR&0xfff7;               //屏蔽定时器0中断
    
  for(i=0;i<(N+10);i++)
    x[i]=x[i+10]&0x00ff;       //摒除采样的前10个数据,同时取采样数据低8位有效
  
  for(i=0;i<N;i++)
    xin[i]=(float)x[i]-60.0;  
}


void fft()
{
   int i,j,k,bfsize,NV2,NM1,a,b,c;
   float co_real,co_imag;
  
   for(i=0;i<N;i++)
        
   data2_real[i]=xin[i];
      
   for(i=0;i<N;i++)  data2_imag[i]=0;
  
   for(k=0;k<r;k++)
   {
      for(j=0;j<1<<k;j++)
      {
         bfsize=1<<(r-k);
         for(i=0;i<bfsize/2;i++)
         {
            a=i+j*bfsize;
            b=a+bfsize/2;
            c=i*(1<<k);
            co_real=data2_real[a]-data2_real[b];
            co_imag=data2_imag[a]-data2_imag[b];

            data2_real[a]=(data2_real[a]+data2_real[b])/2;
            data2_imag[a]=(data2_imag[a]+data2_imag[b])/2;

            data2_real[b]=(co_real*cos1[c]-co_imag*sin1[c])/20000.0;
            data2_imag[b]=(co_real*sin1[c]+co_imag*cos1[c])/20000.0;
         }
      }
   }

   NV2=N/2;NM1=N-1;k=0;
   i=j=1;
   while(i<=NM1)
   {
      if(i<j)
      {
         co_real=data2_real[j-1];          co_imag=data2_imag[j-1];
         data2_real[j-1]=data2_real[i-1];  data2_imag[j-1]=data2_imag[i-1];
         data2_real[i-1]=co_real;          data2_imag[i-1]=co_imag;
      }
      k=NV2;
      while(k<j)
      {
         j-=k;
         k/=2;
      }
      j+=k;
      i++;
   }    

}



⌨️ 快捷键说明

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