快速傅里叶(FFT)的快速深度思考
关于按时间抽取快速傅里叶(FFT)的快速理论深度思考
对于FFT基本理论参考维基百科或百度百科。
首先谈谈FFT的快速何来?大家都知道FFT是对DFT的改进变换而来,那么它究竟怎样改进,它改进的思想在何处呢?明白后,深感奇妙,感悟学习,感悟生活,写下此文,供大家分享之。(文中FFT均讨论按时间抽取快速傅里叶(FFT))
首先我们来一起看看变换公式,DFT ->FFT(整数 ->奇数 + 偶数)

我自己到这结束也没了解它是怎么把时间变少的,从O(N2)(DFT时间深度)到O(N log2 N)(FFT时间深度),智商无能望见谅……
那么我就画了下四点为例的流程图,如下:
FFT四点流图
DFT四点流图
对比DFT和FFT的流图,思考了半天我才醒悟,原来关键词是“中间变量”。
何解?FFT产生了中间变量来得到最后的结果,而DFT直接全部计算得出结果。那么从流图中我们可以发现,FFT对产生的中间变量进行多次引用,也就是说中间变量只算了一次,而被反复利用多次,举个不恰当的例子:“1 + 1 + 1 = 3”,"1 + 1 = 2 ,2 + 1 = 3"这两个结果一样,但是过程2中的中间变量“2”还可以用在“2 + 2 =4”的算式中。这就是关键。所以对于数量级大的计算来说产生中间变量的好处就是避免了对于中间变量的重复运算,使运算过程加快。
对于流图我们发现四点FFT和DFT的运算一样多,都是16条线,那么8点的流图你就会轻易发现运算量就不同了:

FFT:8*3*2 = 48 条,DFT:8*8 = 64 条。对于更大数量级,效果就更明显了。回头看变换式,也能清晰看到在第一、二步:分奇偶,没有任何优化;最后一步:我们就可以看到优化过程:产生了中间变量。
反复思考:其实在DFT中我们也会计算得到相同结果,说明我们做了相同工作,所以我们工作量是一样的,只是我们把像FFT那样产生的中间变量多次计算,就像我上面举的例子,你把“1 + 1 =2”多次计算了,而这个明明已经算过了的,这就是我们的时间消耗点。
那么回头全局观察总结一下:我们在计算一个共同结果或完成一个共同的长远目标时,我们最好是分成多步完成。(这就是我最想说的一个从中悟到的思维问题。因为我探究这问题就是从“想弄明白为‘啥就能加速’,这个神奇的思维是什么”开始的,产生“中间变量”)。而且我信奉思维构造上层建筑,所以我很关注一些问题解决的本质思维问题,这个问题也是最近学FFT突然想到的,希望大家能和我一起学习交流,恳求您的悉心教导。
反观生活:其实我们发现我们点的“科技树”就是这样;我们写的API,写的库函数就是这样。它们都是这个思维的引用者,确实加快了速度,不是吗!
突发奇想:我以前准备举个多元化的例子,发现不行,不符合。这个例子是“一双鞋,鞋带中国制造,鞋底巴西,鞋上层美国”(此例胡说的,博主不懂具体,只是高中政治书回忆起的),这个例子的分步,但是并不是串行,是并行结构,这个方法的前提就是各部分大家都知道目标和底层运行过程,不知道有什么算法可以和这个思想一样。博主写到这自己发现说糊涂了,晕了,大家见谅着看吧,抱歉- - 。
快速傅里叶(FFT)的快速深度思考的更多相关文章
- 3星|《深度思考:不断逼近问题的本质》:香奈儿前CEO自传
深度思考:不断逼近问题的本质 作者是前香奈儿CEO,主要内容是作者的自传,从家庭说起,一直到卸任香奈儿CEO. 作者出生于上世纪六七十年代的一个美国中西部的犹太家庭,崇尚自由,讨厌标签.高中的一个暑假 ...
- 十分简明易懂的FFT(快速傅里叶变换)
https://blog.csdn.net/enjoy_pascal/article/details/81478582 FFT前言快速傅里叶变换 (fast Fourier transform),即利 ...
- 浅谈FFT(快速傅里叶变换)
前言 啊摸鱼真爽哈哈哈哈哈哈 这个假期努力多更几篇( 理解本算法需对一些< 常 用 >数学概念比较清楚,如复数.虚数.三角函数等(不会的自己查去(其实就是懒得写了(¬︿̫̿¬☆) 整理了一 ...
- Spark Streaming源码解读之JobScheduler内幕实现和深度思考
本期内容 : JobScheduler内幕实现 JobScheduler深度思考 JobScheduler 是整个Spark Streaming调度的核心,需要设置多线程,一条用于接收数据不断的循环, ...
- Spark Streaming源码解读之Job动态生成和深度思考
本期内容 : Spark Streaming Job生成深度思考 Spark Streaming Job生成源码解析 Spark Core中的Job就是一个运行的作业,就是具体做的某一件事,这里的JO ...
- hdu 4609 3-idiots(快速傅里叶FFT)
比较裸的FFT(快速傅里叶变换),也是为了这道题而去学的,厚的白书上有简单提到,不过还是推荐看算法导论,讲的很详细. 代码的话是照着别人敲的,推荐:http://www.cnblogs.com/kua ...
- MySQL 5.7 优化SQL提升100倍执行效率的深度思考(GO)
系统环境:微软云Linux DS12系列.Centos6.5 .MySQL 5.7.10.生产环境,step1,step2是案例,精彩的剖析部分在step3,step4. 1.慢sql语句大概需要13 ...
- FFT【快速傅里叶变换】FWT【快速沃尔什变换】
实在是 美丽的数学啊 关于傅里叶变换的博客 讲的很细致 图片非常易于理解http://blog.jobbole.com/70549/ 大概能明白傅里叶变换是干吗的了 但是还是不能明白为什么用傅里叶变换 ...
- FFT(快速傅里叶变换)
FFT(快速傅里叶变换) 前置知识 \(1.复数\) \(2.单位根\) \(3.循环结构\) \(4.C++\) 1.复数 \(定义:形如a+bi的数,其中i^2=-1\) \(计算:1.(a+bi ...
随机推荐
- [Django]网页中利用ajax实现批量导入数据功能
url.py代码: url(r'^workimport/$', 'keywork.views.import_keywork', name='import_keywork') view.py代码: fr ...
- hdu1521 排列组合(指数型母函数)
题意: 有n种物品,并且知道每种物品的数量ki.要求从中选出m件物品的排数. (全题文末) 知识点: 普通母函数 指数型母函数:(用来求解多重集的排列问题) n个元素,其中a1,a2, ...
- CSS/CSS3常用样式小结
1.强制文本单行显示: white-space:nowrap; 多行文本最后省略号: display: -webkit-box; -webkit-line-clamp:2; overflow: hid ...
- Python3实现TCP端口扫描
在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤.通过端口扫描我们可以了解到目标主机都开放了哪些服务,甚至能根据服务猜测可能存在某些漏洞. TCP端 ...
- Es6 箭头函数
1.单参数function cheng(a=3){ return a*a;}let cheng= (a=3)=>a*a;console.log(cheng(9));2.多参数functio ...
- Spring BeanUtils 的对象复制 copyProperties
Spring提供了一个非常棒的对象复制方法, 其参数的顺序和apache commons提供的同名方法是不一样的, 这个要小心. 源码 public static void copyPropertie ...
- 通过xshell远程连接ubuntu
ubuntu开启sshd服务SSH分客户端openssh-client和openssh-server如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果 ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(二)
前言:上篇 JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一) 介绍了下knockout.js的一些基础用法,由于篇幅的关系,所以只能分成两篇,望见谅!昨天就 ...
- 如何在个人博客引擎 Hexo 中添加 Swiftype 搜索组件
在您现在看到的我的博客站点,后台使用的是 Hexo 作为博客引擎,但是默认集成的搜索组件是进行 form 提交到 Google 进行搜索的,为了更好地体验,本文介绍如何在 Hexo 博客中集成 Swi ...
- 源码升级安装python
1.下载 python: https://www.python.org/downloads/release/python-2712/ 2.编译安装 sudo mkdir /usr/local/pyth ...