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:

#include "stdio.h"
#include "math.h" #define LENGTH 4
#define PI 3.1415926 typedef struct Complex
{
float real;
float img;
}Complex; void Recursive_FFT(float *a,Complex *y,int len);
Complex Mul(Complex w,Complex y1_var);
Complex Add(Complex y0_var,int op,Complex mul_result ); int main()
{
float a[LENGTH] = {,,,}; Complex f[LENGTH];
Recursive_FFT(a,f,LENGTH); int i;
for(i=;i<LENGTH;i++)
{
if(f[i].real !=)
{
printf("%3.1f",f[i].real);
}
if(f[i].img !=)
{
printf("+%3.1fi",f[i].img);
}
printf("\n");
}
} //递归求解,a为输入的初始矩阵,y为计算出来的频率矩阵
void Recursive_FFT(float *a,Complex *y,int len)
{
Complex w0,wn;
Complex y0[len/],y1[len/]; w0.real = 1.0;
w0.img = 0.0; wn.real = cos(- * PI /(float) len);
wn.img = sin(- * PI / (float) len); float a0[len/];
float a1[len/];
int count_a0 = ;
int count_a1 = ; int i;
if(len == )
{
y[].real = a[];
y[].img = ;
}
else
{
for(i=;i<len;i++)
{
if(i % )
{
a0[count_a0++] = a[i];
}
else
{
a1[count_a1++] = a[i];
}
} Recursive_FFT(a0,y0,len/);
Recursive_FFT(a1,y1,len/); int k;
Complex w = w0;;
for(k=;k<len/;k++)
{
y[k] = Add(y0[k],,Mul(w,y1[k]));
y[k+len/] = Add(y0[k],-,Mul(w,y1[k]));
w = Mul(w,wn);
}
} } //乘法运算
Complex Mul(Complex w,Complex y1_var)
{
Complex result;
result.real = w.real * y1_var.real - w.img * y1_var.img;
result.img = w.real * y1_var.img + w.img * y1_var.real;
return result;
}

//op为1则为加法运算,-1为减法运算
Complex Add(Complex y0_var,int op,Complex mul_result )
{
Complex result;
if(op == )
{
result.real = y0_var.real + mul_result.real;
result.img = y0_var.img + mul_result.img;
}
else
{
result.real = y0_var.real - mul_result.real;
result.img = y0_var.img - mul_result.img;
} return result;
}

时间复杂度: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. 2015年热门的国产开源软件TOP 50

    2015年热门的国产开源软件TOP 50 开源中国在 2015 年得到了快速的发展,单开源软件收藏量就接近 40000 款,其中不乏优质的国产开源项目.本文从软件的收藏.下载.访问等多角度挑选出了 2 ...

  2. hdu 2892 area (圆与多边形交面积)

    Problem - 2892 这道题的做法是以圆心为原点,对多边形进行三角剖分.题目描述中,多边形的可能是顺时针或者是逆时针给出,不过在我的做法里,是用有向面积来计算的,和常见的多边形面积的求法类似, ...

  3. Python--day62--ORM的使用

    4.Django里ORM的使用 1,手动创建数据库 2,在settings.py里面,配置数据库的连接信息 3,在项目/__init__.py告诉Django用pymysql模块代替MySQLdb(不 ...

  4. Hibernate @OneToOne懒加载实现解决方案

    在hibernate注解(三)中,我提高过一对一(@OneToOne)懒加载失效的问题.虽然给出了解决方法,但并没有给出完整的解决方案.今天我专门针对该问题进行讨论.至于懒加载失效的原因,在之前的文章 ...

  5. mysql 第一课 win7艰难的配置与删除注册表重新安装

    mysql 这个安装一定要慎重!慎重!慎重! 重要的事情说三遍.. 不会的一定要按步骤来~出错了真的很难受. 详细教程 -->  https://jingyan.baidu.com/album/ ...

  6. P1103 走迷宫三

    题目描述 大魔王抓住了爱丽丝,将她丢进了一口枯井中,并堵住了井口. 爱丽丝在井底发现了一张地图,他发现他现在身处一个迷宫当中,从地图中可以发现,迷宫是一个N*M的矩形,爱丽丝身处迷宫的左上角,唯一的出 ...

  7. Chrome 里的请求报错 " Provisional headers are shown"

    之所以会出现这个警告,是因为去获取该资源的请求其实并(还)没有真的发生; 背景:提交表单,按钮点击<button>标签,触发事件,ajax发送请求,服务器返回信息; <button& ...

  8. 【t046】牛跳

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] John的奶牛们计划要跳到月亮上去.它们请魔法师配制了P(1 <= P <=150,000 ...

  9. 在eclipse动态网页项目中,编写web.xml时,servlet标签报错.

    cvc-complex-type.2.4.b: The content of element 'servlet' is not complete. One of '{"http:// jav ...

  10. dotnet 删除只读文件

    如果直接通过 File.Delete 删除只读文件会出现没有权限提示,可以先设置文件不是只读然后删除文件 try { File.Delete(file); } catch (UnauthorizedA ...