一步一步的无障碍理解快速傅立叶变换

本文详细介绍了傅立叶变换的基本原理,包括傅立叶级数、时域与频域的关系,以及连续傅立叶变换的概念。接着,重点探讨了离散傅立叶变换(DFT)和快速傅立叶变换(FFT),特别是FFT的原理和计算方法,揭示了其如何在O(n log n)的时间复杂度下完成卷积计算。此外,还讨论了FFT在ACM中的应用,如超大整数相乘和组合数学计数问题。
摘要由CSDN通过智能技术生成

///
作者:tt2767
声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0
查看本文更新与讨论请点击:http://blog.csdn.net/tt2767
链接被删请百度: CSDN tt2767
///


一. 傅立叶变换的原理

任何一种变换方法都是为了我们能够更简单的解决问题,傅立叶变换亦是如此。我们平时是如何去分解一个复杂的问题呢?一个经典的方法就是把这个复杂的问题分解成为多个简单的可操作的子问题。

让我详细说来:

1.傅立叶级数

对于任何一个函数的曲线,傅立叶认为任何一个复杂的曲线都可以分解为正弦函数与余弦函数的叠加!

s(n)=a02+Σn=1[ancos(nx)+bnsin(nx)]
wiki

函数的叠加:


1

而对于傅立叶级数的思想我们可以把一些复杂的曲线分解成这样:

2

2.时域与频域

刚才就说道傅立叶变换是一种变换,那到底由什么变成了什么呢?其实,傅里叶变换就是把时域中的函数转换成了频域中的函数,以方便我们做数据的处理,处理完之后,用同样的原理再做一次傅立叶逆变换就得到了我们所需的结果!

域的意思是范围也是一种视角,就如高中学过的定义域一样。时域的意思就是随着时间变化的视角观察到的变化,可以理解为直角坐标系中x轴的意义为时间;频域就是频率域,意义也同样如此。

对于上图矩形波分解出来的函数们,他们在频域中是这个样子的:


3

这两者之间的转换就是傅立叶变换!

3.再说傅立叶级数

还记得高中老师讲过的三角函数么?


4

动图请看: File:Fourier series square wave

我们通常认为在时域中的基本单位是 1 ,而由上图可以看到正弦波其实是圆在直线上的投影,所以我们可以认为在频域中的基本单位是一个圆扫过的周期。

他们两个的联系就是这样的:


5

从左面叠加看过去就是合成的时域图像,而从右面看过去投射出的就是频域图像了。

这样的好处就是用一个个的线段把每个波表示了出来,要是需要从复杂波中去掉某一个波的时候就十分方便了。

而在更深的层次,我们可以理解为把连续的函数抽象为了单个离散的点与线的集合!

4.连续傅立叶变换

在傅立叶级数中,我们把一个在时域连续的周期函数转化成了在频域离散的非周期函数,而连续傅立叶变换是把一个在时域连续的非周期函数转化为一个频域连续的非周期函数。(说着绕嘴,一个字一个字的读)


6

还记得傅立叶级数中分解的那幅图么:

7

被分解的曲线密度越来越密,让我想想一下,当曲线密集到一定程度的时候,一个曲线的左面无穷小处与右面无穷小处都存在另一个曲线的话,那么我们认为他们之间是相互连续的,他们的叠加就构成了连续傅立叶变换,不过这时由于无穷小处也存在需叠加的曲线,那么计算时的+号就应该变为积分符号了:

f(x)=Σn=cne2πi(n/T)x
wiki

二. 离散傅立叶变换(DFT)

傅立叶变换存在4种变体,它们都是线性积分变换:傅里叶级数,连续傅里叶变换,离散傅里叶变换,离散时域傅里叶变换。

我们来看一下4种变换的图样与特性:


8


9

大家都知道,计算机系统是离散的,所以离散傅立叶变换在计算机领域得到了很大的应用与改进。
DFT的图像上不是一条连续的曲线了,而是一个一个点组成的图像,所以说它的公式是这样的:

yk=Σn1j=0xj(e2πikn)j

这里也给出 逆离散傅立叶变换公式(IDFT):

xj=1nΣn1k=0yk(e2πijn)k

它最大的作用之一就是求卷积!

1.卷积

百度百科上讲的卷积很抽象,这里有一个“通俗“的例子:假如我打了你一拳,这一拳的痛感会在1个小时之内消失,但你这一个小时之内的感觉也不一样。我们记使用最轻的力打你一拳时,你在这一个小时内的疼痛感觉图像为2h(t),那么用两倍的力打你就是2h(t),3倍力3h(t)……f(n)倍力就为f(n)h(t)。如果我每秒打你一次,连续打你半分钟,那么你在一个小时零半分钟之内都会感到疼(每一次有新痛感来临时上一次痛感都会变化),那么怎么计算你在这一时间段内某一秒时的痛感呢?就是把之前的所有痛感叠加起来啊!Y(t) = 0 + …… + f(n)h(t-n),然而当你每次被打一拳的前无穷小时刻与后无穷小时刻都被打了一拳,那么我就认为打你是一件连续的行为,这时候就要把加和改写为积分了:

Y(t)=+f(n)h(tn)dt

而卷积定理指出:函数卷积的傅里叶变换是函数傅里叶变换后的乘积!
也就是说要求两个函数的卷积,我们就可以先把两个函数做傅立叶变换,之后算出它们的乘积,再做一次傅立叶逆变换就得出结果了!大学计算瞬间变成小学算术啊有木有!

2.点值表示法

可以粗略的理解为卷积是两个相关函数的乘积(这么说并不准确)

求多项式乘法的本质就是求卷积,像这样:
8x3+6x2+7×(4x8+x4+2x)
可是如果单单就是这样相乘就没有什么可优化的了,可是让我们想一下多项式其实也是一个函数,每一个x值都对应一个y值,那么就如两个点确定一条直线一样,我们也能用几个点确定一个多项式,这就是点值表示法。
如果多项式的最高次项的次数为n,那么在常数已知的情况下,我们只需要知道n个不同点就能联立求得多项式了,那么我就可以用这n个点的集合表示这个多项式了。只要把点值对应相乘就可以了,复杂度为O(n)。
那么问题来了,如果单纯的代值进去,运算量会非常大,复杂度为O(n²),这时候就需要用到快速傅立叶变换了。

三. 快速傅立叶变换(FFT)

快速傅立叶变换能在O(nlogn)时间内求出卷积的结果。

1.单位复根

FFT正是利用了单位复根作为旋转因子把DFT二分才获得了如此高的效率。

定义:若 Wn=1 ,则称W为1的复根,也称作单位复根。单位复根必有n过,它们是 n1k=0e

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值