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

📄 fft.c

📁 AD9850串行驱动程序,使用51单片机,通过修改宏,能方便地对DDS进行配置!
💻 C
字号:
#include <reg51.h>
#include "stdio.h"
#include <math.h>       //调用源(头)文件
struct compx           /*定义一个复数结构*/
{float real;float imag;
};
struct compx s[ 257 ];      //FFT输入输出均从是s[1]开始存入
struct compx EE(struct compx,struct compx); //定义复数相乘结构
void FFT(struct compx xin,int N);   /*定义FFT函数*/

struct compx EE(struct compx a1,struct compx b2) //两复数相乘的程序
{struct compx b3;  //b3保存两复数间的结果
b3.real=a1.real*b2.real-a1.imag*b2.imag; //两复数间的运算
b3.imag=a1.real*b2.imag+a1.imag*b2.real;
return(b3);    /*返回结果*/
}
//-------------------------------------------
void FFT(struct compx xin,int N)   /*FFT函数体*/
{int f,m,nv2,nm1,i,k,j=1,l;   /*定义变量*/
struct compx v,w,t;    /*定义结构变量*/
nv2=N/2;           /*最高位值的权值*/
f=N;                  /*f为中间变量*/
for(m=1;(f=f/2)!=1;m++){;}            /*求级数m*/
nm1=N-1;                               /*nm1为数组长度*/
for(i=1;i<=nm1;i++)                   /*倒序*/
{if(i<j) {t=xin[ j ];xin[j]=xin[ i ];xin[ i ] =t;}         /*i<j则换位*/
k=nv2;                       /*k为倒序中相应位置的权值*/
while(k<j) {j=j-k;k=k/2;}            /*k<j时最高为变为0*/
j=j+k;                  /* j为数组中的位数,是一个十进制数*/ 
} 
{int le,lei,ip;       //变量初始化,le为序列长度
  float pi;
  for(l=1;l<=m;l++)                /*l控制级数*/
   {le=pow(2,l);                  /*le等于2的l次方*/
    lei=le/2;                   /*蝶形两节点间的距离*/
    pi=3.14159265;
    v.real=1.0;                    // 此次的v运于复数的初始化    v.imag=0.0;  
   w.real=cos(pi/lei);                  /*旋转因子*/
    w.imag=-sin(pi/lei);
    for(j=1;j<=lei;j++)      //外循环控制蝶行运算的级数
     {for(i=j;i<=N;i=i+le)      //内循环控制每级间的运算次数 
      {ip=i+lei;                 /*蝶形运算的下一个节点*/
       t=EE(xin[ ip ],v);             /*第一个旋转因子*/
       xin[ ip ].real=xin[ i ].real-t.real;   /*蝶形计算*/
       xin[ ip ].imag=xin[ i ].imag-t.imag;
       xin[ i ].real=xin[ i ].real+t.real;
       xin[ i ].imag=xin[ i ].imag+t.imag;
      }
      v=EE(v,w); //调用EE复数相乘程序,结果给下次的循环    
      }
     
   }
  }
}
main()                    /*定义主函数*/
{int N,i;     //变量初始化,N为总点数,i为每点数
printf("shu ru N de ge shu N=");  /*提示输入*/
scanf("%d",&N);                   /*输入N*/
for(i=1;i<=N;i++)              /*输入*/
  {printf("di %d ge shu real=",i); 
   getchar();  
   scanf("%f",&s[ i ].real);
   getchar();   
   printf("\n");
   printf("di %d ge shu imag=",i);
   scanf("%f",&s[ i ].imag);
   printf("\n");
  }
  
  FFT(s,N);               /*调用FFt*/
  for(i=1;i<=N;i++)                 /*输出*/
   {printf("%f",s[ i ].real);
   printf(" + ");
    printf("%f",s[ i ].imag);
    printf("j");
    printf("\n");
   }  
}

⌨️ 快捷键说明

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