FFT(快速傅立叶变换)使用“分而治之”的策略来计算一个n阶多项式的n阶DFT系数的值。定义n为2的整数幂数,为了计算一个n阶多项式f(x),算法定义了连个新的n/2阶多项式,函数f[0](x)包含了f(x)中的x偶次幂项,函数f[1](x)f(x)中的x奇次幂项。

f[0]=a0+a2x+a4x2+ ...+an-2xn/2-1

f[1]=a1+a3x+a5x2+ ...+an-1xn/2-1

则f(x) = f[0](x2)+ xf[1](x2),因此wn0,wn1,...wnn-1点计算f(x)的值得问题转化成计算f[0]和f[1]在(wn0)2,(wn1)2,...(wnn-1)2点的问题,然后计算f(x) = f[0](x2)+ xf[1](x2)。

FFT Code:

  1. #include "stdio.h"
  2. #include "math.h"
  3.  
  4. #define LENGTH 4
  5. #define PI 3.1415926
  6.  
  7. typedef struct Complex
  8. {
  9. float real;
  10. float img;
  11. }Complex;
  12.  
  13. void Recursive_FFT(float *a,Complex *y,int len);
  14. Complex Mul(Complex w,Complex y1_var);
  15. Complex Add(Complex y0_var,int op,Complex mul_result );
  16.  
  17. int main()
  18. {
  19. float a[LENGTH] = {,,,};
  20.  
  21. Complex f[LENGTH];
  22. Recursive_FFT(a,f,LENGTH);
  23.  
  24. int i;
  25. for(i=;i<LENGTH;i++)
  26. {
  27. if(f[i].real !=)
  28. {
  29. printf("%3.1f",f[i].real);
  30. }
  31. if(f[i].img !=)
  32. {
  33. printf("+%3.1fi",f[i].img);
  34. }
  35. printf("\n");
  36. }
  37. }
  38.  
  39. //递归求解,a为输入的初始矩阵,y为计算出来的频率矩阵
  40. void Recursive_FFT(float *a,Complex *y,int len)
  41. {
  42. Complex w0,wn;
  43. Complex y0[len/],y1[len/];
  44.  
  45. w0.real = 1.0;
  46. w0.img = 0.0;
  47.  
  48. wn.real = cos(- * PI /(float) len);
  49. wn.img = sin(- * PI / (float) len);
  50.  
  51. float a0[len/];
  52. float a1[len/];
  53. int count_a0 = ;
  54. int count_a1 = ;
  55.  
  56. int i;
  57. if(len == )
  58. {
  59. y[].real = a[];
  60. y[].img = ;
  61. }
  62. else
  63. {
  64. for(i=;i<len;i++)
  65. {
  66. if(i % )
  67. {
  68. a0[count_a0++] = a[i];
  69. }
  70. else
  71. {
  72. a1[count_a1++] = a[i];
  73. }
  74. }
  75.  
  76. Recursive_FFT(a0,y0,len/);
  77. Recursive_FFT(a1,y1,len/);
  78.  
  79. int k;
  80. Complex w = w0;;
  81. for(k=;k<len/;k++)
  82. {
  83. y[k] = Add(y0[k],,Mul(w,y1[k]));
  84. y[k+len/] = Add(y0[k],-,Mul(w,y1[k]));
  85. w = Mul(w,wn);
  86. }
  87. }
  88.  
  89. }
  90.  
  91. //乘法运算
  92. Complex Mul(Complex w,Complex y1_var)
  93. {
  94. Complex result;
  95. result.real = w.real * y1_var.real - w.img * y1_var.img;
  96. result.img = w.real * y1_var.img + w.img * y1_var.real;
  97. return result;
  98. }

  99. //op为1则为加法运算,-1为减法运算
  100. Complex Add(Complex y0_var,int op,Complex mul_result )
  101. {
  102. Complex result;
  103. if(op == )
  104. {
  105. result.real = y0_var.real + mul_result.real;
  106. result.img = y0_var.img + mul_result.img;
  107. }
  108. else
  109. {
  110. result.real = y0_var.real - mul_result.real;
  111. result.img = y0_var.img - mul_result.img;
  112. }
  113.  
  114. return result;
  115. }

时间复杂度:O(n*logn)。

傅立叶变换—FFT的更多相关文章

  1. 快速傅立叶变换(FFT)算法

    已知多项式f(x)=a0+a1x+a2x2+...+am-1xm-1, g(x)=b0+b1x+b2x2+...+bn-1xn-1.利用卷积的蛮力算法,得到h(x)=f(x)g(x),这一过程的时间复 ...

  2. TOT 傅立叶变换 FFT 入门

    HDU 1402,计算很大的两个数相乘. FFT 只要78ms,这里: 一些FFT 入门资料:http://wenku.baidu.com/view/8bfb0bd476a20029bd642d85. ...

  3. 快速傅立叶变换FFT模板

    递归版 UOJ34多项式乘法 //容易暴栈,但是很好理解 #include <cmath> #include <iostream> #include <cstdio> ...

  4. 傅立叶变换—FFT(cuda实现)

    背景: 无意间看到cuda解决FFT有一个cufft函数库,大体查看了有关cufft有关知识,写了一个解决一维情况的cuda代码,据调查知道cufft在解决1D,2D,3D的情况时间复杂度都为O(nl ...

  5. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换

    写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...

  6. Matlab图像处理系列4———傅立叶变换和反变换的图像

    注意:这一系列实验的图像处理程序,使用Matlab实现最重要的图像处理算法 1.Fourier兑换 (1)频域增强 除了在空间域内能够加工处理图像以外,我们还能够将图像变换到其它空间后进行处理.这些方 ...

  7. Matlab图像处理系列4———图像傅立叶变换与反变换

    注:本系列来自于图像处理课程实验.用Matlab实现最主要的图像处理算法 1.Fourier变换 (1)频域增强 除了在空间域内能够加工处理图像以外.我们还能够将图像变换到其它空间后进行处理.这些方法 ...

  8. 离散傅立叶变换与快速傅立叶变换(DFT与FFT)

    自从去年下半年接触三维重构以来,听得最多的词就是傅立叶变换,后来了解到这个变换在图像处理里面也是重点中的重点. 本身自己基于高数知识的理解是傅立叶变换是将一个函数变为一堆正余弦函数的和的变换.而图像处 ...

  9. $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换

    \(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...

随机推荐

  1. 解决ubuntu的Idea启动No JDK found. Please validate either IDEA_JDK, JDK_HOME or JAVA_HOME environment variable points to valid JDK installation.

    直接在idea安装目录下运行idea.sh可以正常启动,但是使用ubuntu的dash搜索出来的idea报错,No JDK found. Please validate either IDEA_JDK ...

  2. H3C 主机接收IP包

  3. H3C 分组交换连接模型

  4. Java使用RandomAccessFile读写文件

    目录 转载自:http://blog.csdn.net/akon_vm/article/details/7429245 Java RandomAccessFile RandomAccessFile是用 ...

  5. C#的类

    一.String类 1.Length 字符的长度 string x = Console.ReadLine();int i = x.Length;// Length 是获取字符串的长度(从1开始数)Co ...

  6. Python--day20--模块的导入

    1,模块的导入步骤: 2,,给文件起别名的用处: 重命名之后,原来的名字就不能用了 3,虽然这样写可以,但是不推荐,代码可读性不强,以后代码的修改成本也增加: 4,模块的导入顺序: 5,导入变量名的两 ...

  7. Codeforces Round #189 (Div. 1 + Div. 2)

    A. Magic Numbers 不能出现连续的3个4,以及1.4以外的数字. B. Ping-Pong (Easy Version) 暴力. C. Malek Dance Club 考虑\(x\)二 ...

  8. JavaScript:4个常见的内存泄露

    什么是内存泄漏 内存泄漏基本上就是不再被应用需要的内存,由于某种原因,没有被归还给操作系统或者进入可用内存池. 编程语言喜欢不同的管理内存方式.然而,一段确定的内存是否被使用是一个不可判断的问题.换句 ...

  9. Python 科学计算库numpy

    Numpy基础数据结构 NumPy数组是一个多维数组对象,称为ndarray.其由两部分组成: 实际的数据 描述这些数据的元数 # 多维数组ndarray import numpy as np ar ...

  10. JUnit4---Hamcrest匹配器常用方法总结

    一.Hamcrest是什么? Hamcrest is a library of matchers, which can be combined in to create flexible expres ...