DFT,即离散傅里叶变换,假设我们有长为N的序列x[0],x[1],…,x[N-1],那么DFT计算过程如下 X [ k ] = ∑ n = 0 N − 1 x [ n ] W N n k , ( W N = e − j 2 π N ) X[k]=\sum_{n=0}^{N-1}x[n]W_N^{nk},(W_N^{}=e^{-j\frac{2\pi}{N}}) X[k]=∑n=0N−1x[n]WNnk,(WN=e−jN2π) 而IDFT(离散傅里叶逆变换)计算过程为 x [ k ] = ∑ n = 0 N − 1 X [ n ] W N − n k x[k]=\sum_{n=0}^{N-1}X[n]W_{N}^{-nk} x[k]=∑n=0N−1X[n]WN−nk
多项式的两种表示方法知道了DFT和IDFT的数学表达式,下面考虑一个多项式乘法的例子 A ( x ) = a 0 + a 1 x + . . . + a n − 1 x n − 1 A(x)=a_0+a_1x+...+a_{n-1}x^{n-1} A(x)=a0+a1x+...+an−1xn−1 B ( x ) = b 0 + b 1 x + . . . + b n − 1 x n − 1 B(x)=b_0+b_1x+...+b_{n-1}x^{n-1} B(x)=b0+b1x+...+bn−1xn−1 我们知道,我们可以用序列 ( a 0 , a 1 , . . . , a n − 1 ) 和 序 列 ( b 0 , b 1 , . . . , b n − 1 ) 来 表 示 A ( x ) 和 B ( x ) (a_0,a_1,...,a_{n-1})和序列(b_0,b_1,...,b_{n-1})来表示A(x)和B(x) (a0,a1,...,an−1)和序列(b0,b1,...,bn−1)来表示A(x)和B(x)两个多项式,这也是最容易让人想到的表示方法,那么是否还有其他的表示多项式的方法呢? 答案是肯定的,首先,让我们来看一个代数学中的基本定理: 平 面 上 n 个 不 同 的 点 唯 一 确 定 一 个 n − 1 次 多 项 式 平面上n个不同的点唯一确定一个n-1次多项式 平面上n个不同的点唯一确定一个n−1次多项式 该定理的证明在此处略去(事实上就是一个矩阵方程求解的问题) 有了该定理的支撑,我们就可以用n个点,来表示A(x)和B(x)了,我们取序列 t 0 , t 1 , . . . , t n − 1 t_0,t_1,...,t_{n-1} t0,t1,...,tn−1,并计算 A ( t 0 ) , A ( t 1 ) , . . . , A ( t n − 1 ) A(t_0),A(t_1),...,A(t_{n-1}) A(t0),A(t1),...,A(tn−1)和 B ( t 0 ) , B ( t 1 ) , . . . , B ( t n − 1 ) B(t_0),B(t_1),...,B(t_{n-1}) B(t0),B(t1),...,B(tn−1) 那么点列 ( ( t 0 , A ( t 0 ) ) , . . . , ( t n − 1 , A ( t n − 1 ) ) ) ((t_0,A(t_0)),...,(t_{n-1},A(t_{n-1}))) ((t0,A(t0)),...,(tn−1,A(tn−1)))可以唯一的表示多项式 A ( x ) A(x) A(x),点列 ( ( t 0 , B ( t 0 ) ) , . . . , ( t n − 1 , B ( t n − 1 ) ) ) ((t_0,B(t_0)),...,(t_{n-1},B(t_{n-1}))) ((t0,B(t0)),...,(tn−1,B(tn−1)))可以唯一的表示多项式 B ( x ) B(x) B(x)
FFT准备知识 n次单位根: ω n k \omega_n^k ωnk 考虑方程 x n = 1 x^n=1 xn=1在复数域的解,由代数学基本定理可知,该方程在复数域上共有n个复数根,进一步的,这n个根为: e j 2 k π n , k = 0 , 1 , 2 , . . , n − 1 e^{j\frac{2k\pi}{n}}, k=0,1,2,..,n-1 ejn2kπ,k=0,1,2,..,n−1 我们记 ω n k = e j 2 k π n \omega_n^k=e^{j\frac{2k\pi}{n}} ωnk=ejn2kπ,下面来看看它的性质 1. ω 2 n 2 k = ω n k \omega_{2n}^{2k}=\omega_n^k ω2n2k=ωnk 2. ω n k = ω n k + n \omega_n^k=\omega_n^{k+n} ωnk=ωnk+n 3. ω n k + n / 2 = − ω n k \omega_n^{k+n/2}=-\omega_n^k ωnk+n/2=−ωnk 这些性质都是容易证明的,这里不再赘述。 再来看 A ( x ) A(x) A(x) A ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + . . . + a n − 1 x n − 1 = ( a 0 + a 2 x 2 + a 4 x 4 + . . . + a n − 2 x n − 2 ) + ( a 1 x + a 3 x 3 + . . . + a n − 1 x n − 1 ) = ( a 0 + a 2 x 2 + a 4 x 4 + . . . + a n − 2 x n − 2 ) + x ( a 1 + a 3 x 2 + . . . + a n − 1 x n − 2 ) A(x)=a_0+a_1x+a_2x^2+a_3x^3+...+a_{n-1}x^{n-1}\\=(a_0+a_2x^2+a_4x^4+...+a_{n-2}x^{n-2})+(a_1x+a_3x^3+...+a_{n-1}x^{n-1})\\=(a_0+a_2x^2+a_4x^4+...+a_{n-2}x^{n-2})+x(a_1+a_3x^2+...+a_{n-1}x^{n-2}) A(x)=a0+a1x+a2x2+a3x3+...+an−1xn−1=(a0+a2x2+a4x4+...+an−2xn−2)+(a1x+a3x3+...+an−1xn−1)=(a0+a2x2+a4x4+...+an−2xn−2)+x(a1+a3x2+...+an−1xn−2) 我们令 A 1 ( x ) = a 0 + a 2 x + . . . + a n − 2 x n / 2 − 1 A_1(x)=a_0+a_2x+...+a_{n-2}x^{n/2-1} A1(x)=a0+a2x+...+an−2xn/2−1 A 2 ( x ) = a 1 + a 3 x + . . . + a n − 1 x n / 2 − 1 A_2(x)=a_1+a_3x+...+a_{n-1}x^{n/2-1} A2(x)=a1+a3x+...+an−1xn/2−1 则上式可以化简为 A ( x ) = A 1 ( x 2 ) + x A 2 ( x 2 ) A(x)=A_1(x^2)+xA_2(x^2) A(x)=A1(x2)+xA2(x2) 设 k < n / 2 k
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?