关于按时间抽取快速傅里叶(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)的快速深度思考的更多相关文章

  1. 3星|《深度思考:不断逼近问题的本质》:香奈儿前CEO自传

    深度思考:不断逼近问题的本质 作者是前香奈儿CEO,主要内容是作者的自传,从家庭说起,一直到卸任香奈儿CEO. 作者出生于上世纪六七十年代的一个美国中西部的犹太家庭,崇尚自由,讨厌标签.高中的一个暑假 ...

  2. 十分简明易懂的FFT(快速傅里叶变换)

    https://blog.csdn.net/enjoy_pascal/article/details/81478582 FFT前言快速傅里叶变换 (fast Fourier transform),即利 ...

  3. 浅谈FFT(快速傅里叶变换)

    前言 啊摸鱼真爽哈哈哈哈哈哈 这个假期努力多更几篇( 理解本算法需对一些< 常 用 >数学概念比较清楚,如复数.虚数.三角函数等(不会的自己查去(其实就是懒得写了(¬︿̫̿¬☆) 整理了一 ...

  4. Spark Streaming源码解读之JobScheduler内幕实现和深度思考

    本期内容 : JobScheduler内幕实现 JobScheduler深度思考 JobScheduler 是整个Spark Streaming调度的核心,需要设置多线程,一条用于接收数据不断的循环, ...

  5. Spark Streaming源码解读之Job动态生成和深度思考

    本期内容 : Spark Streaming Job生成深度思考 Spark Streaming Job生成源码解析 Spark Core中的Job就是一个运行的作业,就是具体做的某一件事,这里的JO ...

  6. hdu 4609 3-idiots(快速傅里叶FFT)

    比较裸的FFT(快速傅里叶变换),也是为了这道题而去学的,厚的白书上有简单提到,不过还是推荐看算法导论,讲的很详细. 代码的话是照着别人敲的,推荐:http://www.cnblogs.com/kua ...

  7. MySQL 5.7 优化SQL提升100倍执行效率的深度思考(GO)

    系统环境:微软云Linux DS12系列.Centos6.5 .MySQL 5.7.10.生产环境,step1,step2是案例,精彩的剖析部分在step3,step4. 1.慢sql语句大概需要13 ...

  8. FFT【快速傅里叶变换】FWT【快速沃尔什变换】

    实在是 美丽的数学啊 关于傅里叶变换的博客 讲的很细致 图片非常易于理解http://blog.jobbole.com/70549/ 大概能明白傅里叶变换是干吗的了 但是还是不能明白为什么用傅里叶变换 ...

  9. FFT(快速傅里叶变换)

    FFT(快速傅里叶变换) 前置知识 \(1.复数\) \(2.单位根\) \(3.循环结构\) \(4.C++\) 1.复数 \(定义:形如a+bi的数,其中i^2=-1\) \(计算:1.(a+bi ...

随机推荐

  1. php使用$_SERVER["REMOTE_ADDR"]获取访问IP地址

    print "您的IP地址是:"; if(!empty($_SERVER["HTTP_CLIENT_IP"])){  $cip = $_SERVER[" ...

  2. [django]利用xlwt实现文件下载功能

    代码: url.py: url(r'^importmould/$', 'keywork.views.xls_mould', name='xls_mould'), view.py: from djang ...

  3. 理解Docker(2):Docker 镜像

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  4. ::before和::after伪元素的用法

    一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:target,:not(),:focus. 常见伪元素——::first-let ...

  5. 【2016-11-7】【坚持学习】【Day22】【C# 委托的应用】

    我觉得我对委托的概念还没有完全掌握,于是,我需要继续思考,学习它的应用实现.

  6. CH Round #52 还教室[线段树 方差]

    还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教 ...

  7. 使用JSP开发动态网站基础

    1. 什么是动态网页? 动态网页是指在服务器端运行的程序或者网页,它们会随不同客户.不同时间,返回不同的网页. 注意:在静态网页中插入flash ,虽然flash是在动的,但是并不是说这个网页就是动态 ...

  8. BZOJ 2115 【Wc2011】 Xor

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  9. 17-前端开发之jQuery

    什么是 jQuery ? jQuery 是一个 JavaScript 库,它极大地简化了 JavaScript 编程. jQuery是一个兼容多浏览器的javascript库,核心理念是write l ...

  10. IO(六)--- 编码和解码

    编码: 把看得懂的字符变成看不懂码值这个过程我们称作为编码. 解码: 把码值查找对应的字符,我们把这个过程称作为解码. 注意: 以后编码与解码一般我们都使用统一的码表.否则非常容易出乱码. 常用码表: ...