傅立叶变换—FFT
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的更多相关文章
- 快速傅立叶变换(FFT)算法
已知多项式f(x)=a0+a1x+a2x2+...+am-1xm-1, g(x)=b0+b1x+b2x2+...+bn-1xn-1.利用卷积的蛮力算法,得到h(x)=f(x)g(x),这一过程的时间复 ...
- TOT 傅立叶变换 FFT 入门
HDU 1402,计算很大的两个数相乘. FFT 只要78ms,这里: 一些FFT 入门资料:http://wenku.baidu.com/view/8bfb0bd476a20029bd642d85. ...
- 快速傅立叶变换FFT模板
递归版 UOJ34多项式乘法 //容易暴栈,但是很好理解 #include <cmath> #include <iostream> #include <cstdio> ...
- 傅立叶变换—FFT(cuda实现)
背景: 无意间看到cuda解决FFT有一个cufft函数库,大体查看了有关cufft有关知识,写了一个解决一维情况的cuda代码,据调查知道cufft在解决1D,2D,3D的情况时间复杂度都为O(nl ...
- 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换
写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...
- Matlab图像处理系列4———傅立叶变换和反变换的图像
注意:这一系列实验的图像处理程序,使用Matlab实现最重要的图像处理算法 1.Fourier兑换 (1)频域增强 除了在空间域内能够加工处理图像以外,我们还能够将图像变换到其它空间后进行处理.这些方 ...
- Matlab图像处理系列4———图像傅立叶变换与反变换
注:本系列来自于图像处理课程实验.用Matlab实现最主要的图像处理算法 1.Fourier变换 (1)频域增强 除了在空间域内能够加工处理图像以外.我们还能够将图像变换到其它空间后进行处理.这些方法 ...
- 离散傅立叶变换与快速傅立叶变换(DFT与FFT)
自从去年下半年接触三维重构以来,听得最多的词就是傅立叶变换,后来了解到这个变换在图像处理里面也是重点中的重点. 本身自己基于高数知识的理解是傅立叶变换是将一个函数变为一堆正余弦函数的和的变换.而图像处 ...
- $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换
\(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...
随机推荐
- HTML静态网页--JavaScript-Window.document对象
1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: var a =docunmen ...
- ubuntu 运行级别initlevel
Linux 系统任何时候都运行在一个指定的运行级上,并且不同的运行级的程序和服务都不同,所要完成的工作和要达到的目的都不同,系统可以在这些运行级之间进行切换,以完成不同的工作.Ubuntu 的系统运行 ...
- Python xrange() 函数
描述 xrange() 函数用法与 range 完全相同,所不同的是生成的不是一个数组,而是一个生成器. 语法 xrange 语法: xrange(stop) xrange(start, stop[, ...
- Activiti 工作流入门指南
概览 如我们的介绍部分所述,Activiti目前分为两大类: Activiti Core Activiti Cloud 如果你想上手Activiti的核心是否遵循了新的运行时API的入门指南:Acti ...
- java操作数组的工具类-Arrays
static int binarySearch(type[] a, type key) 使用二分搜索法来搜索key元素在数组中的索引:若a数组不包括key,返回负数.(该方法必须已按升序排列后调用). ...
- java TreeSet的排序之定制排序
TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了: 该接口包含int compare(Object o1,Object o2 ...
- 【38.96%】【hdu 1540】Tunnel Warfare
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission ...
- Linux 内核引用计数的操作
一个 kobject 的其中一个关键函数是作为一个引用计数器, 给一个它被嵌入的对象. 只 要对这个对象的引用存在, 这个对象( 和支持它的代码) 必须继续存在. 来操作一个 kobject 的引用计 ...
- Linux 内核 NuBus 总线
另一个有趣的, 但是几乎被忘记的, 接口总线是 NuBus. 它被发现于老的 Mac 计算机(那 些有 M68K CPU 家族的). 所有的这个总线是内存映射的(象 M68K 的所有东西), 并且设备 ...
- 使用 koa-router 路由拆分
根据功能不同,将路由拆分到不同的模块 目录结构: app.js const Koa = require('koa'); const Router = require('koa-router'); co ...