[应用方案] FFT的C语言算法实现

[复制链接]
874|7
 楼主| eefas 发表于 2023-7-13 21:02 | 显示全部楼层 |阅读模式
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<stdlib.h>
  4. #define N 1024
  5. typedef struct{       //定义一个结构体表示复数的类型
  6.         double real;
  7.         double imag;
  8. }complex;
  9. complex x[N], *W;   //定义输入序列和旋转因子
  10. int size=0;   //定义数据长度
  11. double PI=4.0*atan(1); //定义π 因为tan(π/4)=1 所以arctan(1)*4=π,增加π的精度
  12. void output()
  13. {
  14.         int i;
  15.         for(i=0;i<size;i++)
  16.         {       
  17.                 printf("%.4f",x[i].real);
  18.                 if(x[i].imag>=0.0001)
  19.                 {
  20.                         printf("+%.4fj\n",x[i].imag);
  21.                 }
  22.                 else if(fabs(x[i].imag)<0.0001)
  23.                 {
  24.                         printf("\n");
  25.                 }
  26.                 else
  27.                 {
  28.                         printf("%.4fj\n",x[i].imag);
  29.                 }
  30.         }
  31. }
  32. void change()
  33. {
  34.         complex temp;
  35.         unsigned short i=0,j=0,k=0;
  36.         double t;
  37.         for(i=0;i<size;i++)
  38.         {
  39.                 k=i;
  40.                 j=0;
  41.                 t=(log(size)/log(2));
  42.                 while( (t--)>0 )
  43.                 {
  44.                         j=j<<1;
  45.                         j|=(k & 1);
  46.                         k=k>>1;
  47.                 }
  48.                 if(j>i)
  49.                 {
  50.                         temp=x[i];
  51.                         x[i]=x[j];
  52.                         x[j]=temp;
  53.                 }
  54.         }
  55.         output();
  56. }
  57. void transform()
  58. {
  59.         int i;
  60.         W=(complex *)malloc(sizeof(complex) * size);
  61.         for(i=0;i<size;i++)
  62.         {
  63.                 W[i].real=cos(2*PI/size*i);
  64.                 W[i].imag=-1*sin(2*PI/size*i);
  65.         }
  66. }
  67. void add(complex a,complex b,complex *c)
  68. {
  69.         c->real=a.real+b.real;
  70.         c->imag=a.imag+b.imag;
  71. }
  72. void sub(complex a,complex b,complex *c)
  73. {
  74.         c->real=a.real-b.real;
  75.         c->imag=a.imag-b.imag;
  76. }
  77. void mul(complex a,complex b,complex *c)
  78. {
  79.         c->real=a.real*b.real - a.imag*b.imag;
  80.         c->imag=a.real*b.imag + a.imag*b.real;
  81. }
  82. void fft()
  83. {
  84.         int i=0,j=0,k=0,m=0;
  85.         complex q,y,z;
  86.         change();
  87.         for(i=0;i<log(size)/log(2) ;i++)
  88.         {
  89.                 m=1<<i;
  90.                 for(j=0;j<size;j+=2*m)
  91.                 {
  92.                         for(k=0;k<m;k++)
  93.                         {
  94.                                 mul(x[k+j+m],W[size*k/2/m],&q);
  95.                                 add(x[j+k],q,&y);
  96.                                 sub(x[j+k],q,&z);
  97.                                 x[j+k]=y;
  98.                                 x[j+k+m]=z;
  99.                         }
  100.                 }
  101.         }
  102. }
  103. int main()
  104. {
  105.         int i;
  106.         printf("输入数据个数\n");
  107.         scanf("%d",&size);//输入数据的长度(2的整数次幂)
  108.         printf("输入数据的实部、虚部\n");
  109.         for(i=0;i<size;i++)
  110.         {
  111.                 scanf("%lf%lf",&x[i].real,&x[i].imag);  //输入复数的实部和虚部
  112.         }
  113.         printf("输出倒序后的序列\n");
  114.         transform();//变换序列顺序
  115.         fft();//蝶形运算
  116.         printf("输出FFT后的结果\n");
  117.         output();//输出结果
  118.         return 0;
  119. }


tpgf 发表于 2024-2-4 11:24 | 显示全部楼层
这么看的话  循环次数真的不少啊
磨砂 发表于 2024-2-4 11:53 | 显示全部楼层
fft的c语言算法是不是还有分好多种的呢
八层楼 发表于 2024-2-4 12:25 | 显示全部楼层
FFT,即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的
晓伍 发表于 2024-2-4 12:51 | 显示全部楼层
请问fft的算法原理是什么呢
观海 发表于 2024-2-4 13:23 | 显示全部楼层
fft算法和dft算法的区别或者说关系是什么呢
guanjiaer 发表于 2024-2-4 19:45 | 显示全部楼层
点数越多,运算量的节约就越大,这就是FFT的优越性
药无尘 发表于 2024-2-6 10:25 | 显示全部楼层
这个算法非常好,就是在高速系统不友好,计算时间有点长
您需要登录后才可以回帖 登录 | 注册

本版积分规则

98

主题

3152

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部