FFT详解,通俗易懂便于自己理解

算法课最近讲到了递归分治的策略,留下了第一个有技术含量的作业:简化多项式计算的FFT算法,于是我打算在这里结合前人的分析解析一下这一算法。

FFT即fast Fourier transform,是快速傅立叶变换的简称,采用这种方法能采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。
FFT的基本思想是把原始的N点序列,依次分解成一系列的短序列。充分利用DFT计算式中指数因子 所具有的对称性质和周期性质,进而求出这些短序列相应的DFT并进行适当组合,达到删除重复计算,减少乘法运算和简化结构的目的。此后,在这思想基础上又开发了高基和分裂基等快速算法,随着数字技术的高速发展,1976年出现建立在数论和多项式理论基础上的维诺格勒傅里叶变换算法(WFTA)和素因子傅里叶变换算法。它们的共同特点是,当N是素数时,可以将DFT算转化为求循环卷积,从而更进一步减少乘法次数,提高速度。

首先介绍多项式的两种表示法:系数表示法和点值表示法:

系数表示法很简单,就是一般所见到的表示多项式的方法。点值表示法,顾名思义,就是利用点表示多项式,可以想象在坐标系内,一个函数用点值表示,只需要几个点以及点所对应点的函数值就可以将一个函数确定下来,这就是点值表示法的思路和原理。
那么,点值表示法有什么优点呢?
点值表示法的优点在做多项式乘法的时候体现的淋漓尽致:如果我们用是的系数表示法做两个多项式相乘的操作,需要将多项式A(x),B(x)的每一项系数轮流做乘法,这个过程是O(n^2)的复杂度,而如果使用点值表示法,则只是需要将x坐标相同的点的y坐标进行乘法,就能继续利用这个乘出来的点表示乘出来的多项式。这一过程,只需要O(n*log(n))的复杂度。

既然点值表示法有这种优点,我们如何使用点值表示法进行多项式相乘的操作呢?

首先,展示一下FFT的效果:设两个点值多项式分别为
f(x)={(x0,f(x0)),(x1,f(x1)),(x2,f(x2)),…,(xn−1,f(xn−1))}
g(x)={(x0,g(x0)),(x1,g(x1)),(x2,g(x2)),…,(xn−1,g(xn−1))}
设它们的乘积是h(x),那么
h(x)={(x0,f(x0)⋅g(x0)),(x1,f(x1)⋅g(x1)),…,(xn−1,f(xn−1)⋅g(xn−1))}
所以这里的时间复杂度只有一个枚举的O(n)。

如果我们选择一般的数据进行带入求值,复杂度依然很高,并没有得到改善,那么我们引入新的概念:单位根。

我们都学过复数,所以复数的概念和基本的加减乘除法,在此不多赘述了,只是介绍有关单位根的性质。由DFT(前置知识)得到了代入的点即为这些单位根。
复数w满足wn=1称作w是n次单位根,左下图包含了所有的8次单位根(图中圆的半径是1)
仔细观察这个图,可以得到单位根的性质:如右下图。这两个性质在FFT的实现中至关重要哦!

FFT详解,通俗易懂便于自己理解_第1张图片

FFT详解,通俗易懂便于自己理解_第2张图片

FFT详解,通俗易懂便于自己理解_第3张图片

在这里插入图片描述

FFT详解,通俗易懂便于自己理解_第4张图片

在这里插入图片描述

FFT详解,通俗易懂便于自己理解_第5张图片

在这里插入图片描述

FFT详解,通俗易懂便于自己理解_第6张图片

在这里插入图片描述FFT详解,通俗易懂便于自己理解_第7张图片

FFT详解,通俗易懂便于自己理解_第8张图片

在这里插入图片描述

FFT详解,通俗易懂便于自己理解_第9张图片

在这里插入图片描述

FFT详解,通俗易懂便于自己理解_第10张图片

你可能感兴趣的:(算法,FFT)