FFT算法
快速傅里叶变换 (Fast Fourier Transform), 即利用计算机计算离散傅里叶变换DFT的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。
学习FFT前需要先掌握复数,单位根和多项式
复数
复数z=a+bi,a和b都是实数, i = − 1 i=\sqrt{-1} i=−1,z可以写成 z = r e i θ z=re^{i\theta} z=reiθ,r是z的模, θ \theta θ为z的幅角,其中 e i θ = c o s θ + i s i n θ e^{i\theta}=cos\theta +isin\theta eiθ=cosθ+isinθ,任意的a+bi对应复平面上的(a,b),a被称为实部,b被称为虚部
单位根
对于 z = r e i θ z=re^{i\theta} z=reiθ,有:

单位根的定义是
z
n
=
1
z^{n}=1
zn=1在复数域内的n个根,即
r
n
e
i
θ
n
=
1
r^{n}e^{i\theta n}=1
rneiθn=1,容易看出,
r
=
1
,
θ
=
2
k
π
n
r=1,\theta=\frac{2k\pi}{n}
r=1,θ=n2kπ,所以
z
n
=
1
z^{n}=1
zn=1的n个根为:
w
n
k
=
e
i
2
k
π
n
=
c
o
s
2
k
π
n
+
i
s
i
n
2
k
π
n
w_{n}^{k}=e^{i\frac{2k\pi}{n}}=cos\frac{2k\pi}{n}+isin\frac{2k\pi}{n}
wnk=ein2kπ=cosn2kπ+isinn2kπ
其中,
k
=
0
,
1
,
2
,
.
.
.
,
n
−
1
k=0,1,2,...,n-1
k=0,1,2,...,n−1,
w
n
1
=
e
i
2
π
n
w_{n}^{1}=e^{i\frac{2\pi}{n}}
wn1=ein2π称为主单位根
单位根的3个引理
- 消去引理:
w
d
n
d
k
=
w
n
k
w_{dn}^{dk}=w_{n}^{k}
wdndk=wnk,比如
w
n
n
2
=
w
2
1
=
−
1
w_{n}^{\frac{n}{2}}=w_{2}^{1}=-1
wn2n=w21=−1
证明:
w d n d k = ( e i 2 π d n ) d k = e i 2 π k n = w n k w_{dn}^{dk}=(e^{i\frac{2\pi}{dn}})^{dk}=e^{i\frac{2\pi k}{n}}=w_{n}^{k} wdndk=(eidn2π)dk=ein2πk=wnk - 折半引理----FFT的核心
( w n k + n 2 ) 2 = ( w n k ) 2 = w n 2 k (w_{n}^{k+\frac{n}{2}})^{2}=(w_{n}^{k})^{2}=w_{\frac{n}{2}}^{k} (wnk+2n)2=(wnk)2=w2nk
证明:
w n k + n 2 = w n k w n n 2 = − w n k w_{n}^{k+\frac{n}{2}}=w_{n}^{k}w_{n}^{\frac{n}{2}}=-w_{n}^{k} wnk+2n=wnkwn2n=−wnk
( − w n k ) 2 = w n 2 k = w n 2 k (-w_{n}^{k})^{2}=w_{n}^{2k}=w_{\frac{n}{2}}^{k} (−wnk)2=wn2k=w2nk - 求和引理
∑ i = 0 n − 1 ( w n k ) i = 0 \sum_{i=0}^{n-1}(w_{n}^{k})^{i}=0 i=0∑n−1(wnk)i=0
证明:
根据等比数列求和公式有:
∑ i = 0 n − 1 ( w n k ) i = ( w n k ) n − 1 w n k − 1 \sum_{i=0}^{n-1}(w_{n}^{k})^{i}=\frac{(w_{n}^{k})^{n}-1}{w_{n}^{k}-1} i=0∑n−1(wnk)i=wnk−1(wnk)n−1
= ( w n n ) k − 1 w n k − 1 = ( 1 ) k − 1 w n k − 1 = 0 =\frac{(w_{n}^{n})^{k}-1}{w_{n}^{k}-1}=\frac{(1)^{k}-1}{w_{n}^{k}-1}=0 =wnk−1(wnn)k−1=wnk−1(1)k−1=0
多项式
在实际应用中,FFT也常用于处理多项式乘法;假设有一个多项式 F ( x ) = a 0 + a 1 x + . . . + a n x n = ∑ i = 0 n a i x i F(x)=a_{0}+a_{1}x+...+a_{n}x^{n}=\sum_{i=0}^{n}a_{i}x^{i} F(x)=a0+a1x+...+anxn=∑i=0naixi,则次数为 d e g r e e ( F ) = n degree(F)=n degree(F)=n,次数界为大于次数的整数,因此次数界 > n >n >n;
多项式加法
现在有两个多项式
A
(
x
)
=
∑
i
=
0
n
a
i
x
i
A(x)=\sum_{i=0}^{n}a_{i}x^{i}
A(x)=∑i=0naixi和
B
(
x
)
=
∑
i
=
0
n
b
i
x
i
B(x)=\sum_{i=0}^{n}b_{i}x^{i}
B(x)=∑i=0nbixi;
则
A
(
x
)
+
B
(
x
)
A(x)+B(x)
A(x)+B(x)为:
C
(
x
)
=
∑
i
=
0
n
c
i
x
i
,
c
i
=
a
i
+
b
i
C(x)=\sum_{i=0}^{n}c_{i}x^{i},c_{i}=a_{i}+b_{i}
C(x)=i=0∑ncixi,ci=ai+bi
多项式乘法
先假设有多项式M:
6
x
3
+
7
x
2
−
10
x
+
9
6x^{3}+7x^{2}-10x+9
6x3+7x2−10x+9;
多项式N:
−
2
x
3
+
4
x
−
5
-2x^{3}+4x-5
−2x3+4x−5;
多项式M乘多项式N,需要用多项式N的每一项乘多项式M,得到3个多项式,结果则是这3个多项式相加,经过观察发现结果的次数为
d
e
g
r
e
e
(
M
)
+
d
e
g
r
e
e
(
N
)
degree(M)+degree(N)
degree(M)+degree(N);
如果推广到同次多项式
A
(
x
)
A(x)
A(x)和
B
(
x
)
B(x)
B(x),则有:
C
(
x
)
=
A
(
x
)
B
(
x
)
=
∑
i
=
0
2
n
c
i
x
i
C(x)=A(x)B(x)=\sum_{i=0}^{2n}c_{i}x^{i}
C(x)=A(x)B(x)=i=0∑2ncixi
而
c
i
=
∑
j
=
0
i
a
j
b
i
−
j
c_{i}=\sum_{j=0}^{i}a_{j}b_{i-j}
ci=∑j=0iajbi−j,如果记
c
c
c为
c
i
c_{i}
ci构成的序列,
a
a
a为
a
i
a_{i}
ai构成的序列,
b
b
b为
b
i
b_{i}
bi构成的序列,则
c
c
c为
a
a
a与
b
b
b进行卷积:
c
=
a
⊗
b
c=a\otimes b
c=a⊗b
对于degree不同的两个多项式,可通过添加0系数上升至同一次数n
多项式的表示
系数表示
用多项式的系数表示多项式:
a
=
[
a
0
,
a
1
,
.
.
.
,
a
n
]
T
a=[a_{0},a_{1},...,a_{n}]^{T}
a=[a0,a1,...,an]T
可见,加法的时间复杂度为
O
(
n
)
O(n)
O(n),乘法的时间复杂度为
O
(
n
2
)
O(n^{2})
O(n2);
点值表示
用至少n个多项式上的点表示,即:
{
(
x
0
,
A
(
x
0
)
,
(
x
1
,
A
(
x
1
)
)
,
.
.
.
,
(
x
n
,
A
(
x
n
)
}
\left \{ (x_{0},A(x_{0}),(x_{1},A(x_{1})),...,(x_{n},A(x_{n}) \right \}
{(x0,A(x0),(x1,A(x1)),...,(xn,A(xn)}
A
(
x
0
)
A(x_{0})
A(x0)只是多项式
A
(
x
)
A(x)
A(x)在
x
0
x_{0}
x0处的取值;
点值表示的多项式运算应确保
x
i
x_{i}
xi对应:
加法:
C
(
x
i
)
=
A
(
x
i
)
+
B
(
x
i
)
C(x_{i})=A(x_{i})+B(x_{i})
C(xi)=A(xi)+B(xi),时间复杂度为
O
(
n
)
O(n)
O(n);
乘法:
C
(
x
i
)
=
A
(
x
i
)
B
(
x
i
)
C(x_{i})=A(x_{i})B(x_{i})
C(xi)=A(xi)B(xi),时间复杂度为
O
(
n
)
O(n)
O(n);
插值
已知点值,给出一个
x
x
x求值
A
(
x
)
A(x)
A(x)叫插值,插值一般由拉格朗日插值公式计算:
A
(
x
)
=
∑
i
=
0
n
A
(
x
i
)
∏
j
≠
i
(
x
−
x
j
)
∏
j
≠
i
(
x
i
−
x
j
)
A(x)=\sum_{i=0}^{n}A(x_{i})\frac{\prod_{j\neq i}^{}(x-x_{j})}{\prod_{j\neq i}^{}(x_{i}-x_{j})}
A(x)=i=0∑nA(xi)∏j=i(xi−xj)∏j=i(x−xj)
时间复杂度为
O
(
n
2
)
O(n^{2})
O(n2);
比如多项式有两个点值
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
}
\left \{ (x_{1},y_{1}),(x_{2},y_{2}) \right \}
{(x1,y1),(x2,y2)},插值得到
(
x
,
y
)
(x,y)
(x,y)为:
y
=
y
1
x
−
x
2
x
1
−
x
2
+
y
2
x
−
x
1
x
2
−
x
1
y=y_{1}\frac{x-x_{2}}{x_{1}-x_{2}}+y_{2}\frac{x-x_{1}}{x_{2}-x_{1}}
y=y1x1−x2x−x2+y2x2−x1x−x1
DFT离散傅里叶变换
DFT即Discrete Fourier Transform,DFT是对一个序列进行变换,假设有多项式
A
(
x
)
=
∑
i
=
0
n
−
1
a
i
x
i
A(x)=\sum_{i=0}^{n-1}a_{i}x^{i}
A(x)=∑i=0n−1aixi,现在把单位根
w
n
0
,
w
n
1
,
.
.
.
,
w
n
n
−
1
w_{n}^{0},w_{n}^{1},...,w_{n}^{n-1}
wn0,wn1,...,wnn−1代入多项式得到:
y
=
[
y
0
,
y
1
,
.
.
.
,
y
n
−
1
]
y=[y_{0},y_{1},...,y_{n-1}]
y=[y0,y1,...,yn−1]
其中:
y
i
=
A
(
w
n
i
)
=
∑
j
=
0
n
−
1
a
j
(
w
n
i
)
j
y_{i}=A(w_{n}^{i})=\sum_{j=0}^{n-1}a_{j}(w_{n}^{i})^{j}
yi=A(wni)=j=0∑n−1aj(wni)j
记
y
=
D
F
T
n
(
a
)
y=DFT_{n}(a)
y=DFTn(a);
可见,由于单位根是已知的,只要给出序列a,就能得到y,而计算一次
y
i
y_{i}
yi的时间复杂度为
O
(
n
)
O(n)
O(n),
y
i
y_{i}
yi共n个,所以时间复杂度为
O
(
n
2
)
O(n^{2})
O(n2)
IDFT离散傅里叶逆变换
DFT中,
y
i
=
∑
j
=
0
n
−
1
a
j
(
w
n
i
)
j
=
∑
j
=
0
n
−
1
a
j
w
n
i
j
y_{i}=\sum_{j=0}^{n-1}a_{j}(w_{n}^{i})^{j}=\sum_{j=0}^{n-1}a_{j}w_{n}^{ij}
yi=∑j=0n−1aj(wni)j=∑j=0n−1ajwnij,如果用矩阵表示可以写出:
y
=
V
n
a
y=V_{n}a
y=Vna
(
V
n
)
i
,
j
=
w
n
i
j
(V_{n})_{i,j}=w_{n}^{ij}
(Vn)i,j=wnij
因此有:
a
=
V
n
−
1
y
a=V_{n}^{-1}y
a=Vn−1y
即:
a
i
=
1
n
∑
j
=
0
n
−
1
w
n
−
i
j
y
j
a_{i}=\frac{1}{n}\sum_{j=0}^{n-1}w_{n}^{-ij}y_{j}
ai=n1j=0∑n−1wn−ijyj
FFT快速傅里叶变换
FFT即Fast Fourier Transform,通过单位根的引理将时间复杂度从DFT的 O ( n 2 ) O(n^{2}) O(n2)降为 O ( n l o g n ) O(nlogn) O(nlogn)
证明
在DFT中,有序列a:
a
=
[
a
0
,
a
1
,
.
.
.
,
a
n
−
1
]
a=[a_{0},a_{1},...,a_{n-1}]
a=[a0,a1,...,an−1]
将a拆开为:
a
[
0
]
=
[
a
0
,
a
2
,
.
.
.
,
a
n
−
2
]
a^{[0]}=[a_{0},a_{2},...,a_{n-2}]
a[0]=[a0,a2,...,an−2]
a
[
1
]
=
[
a
1
,
a
3
,
.
.
.
,
a
n
−
1
]
a^{[1]}=[a_{1},a_{3},...,a_{n-1}]
a[1]=[a1,a3,...,an−1]
偶数项
a
[
0
]
a^{[0]}
a[0]和奇数项
a
[
1
]
a^{[1]}
a[1]分别对应多项式
A
[
0
]
(
x
)
,
A
[
1
]
(
x
)
A^{[0]}(x),A^{[1]}(x)
A[0](x),A[1](x);
现在写出:
A
(
x
)
=
a
0
+
a
1
x
+
.
.
.
+
a
n
−
1
x
n
−
1
A(x)=a_{0}+a_{1}x+...+a_{n-1}x^{n-1}
A(x)=a0+a1x+...+an−1xn−1
A
[
0
]
(
x
)
=
a
0
+
a
2
x
+
a
4
x
2
+
.
.
.
+
a
n
−
2
x
n
2
−
1
A^{[0]}(x)=a_{0}+a_{2}x+a_{4}x^{2}+...+a_{n-2}x^{\frac{n}{2}-1}
A[0](x)=a0+a2x+a4x2+...+an−2x2n−1
A
[
1
]
(
x
)
=
a
1
+
a
3
x
+
a
5
x
2
+
.
.
.
+
a
n
−
1
x
n
2
−
1
A^{[1]}(x)=a_{1}+a_{3}x+a_{5}x^{2}+...+a_{n-1}x^{\frac{n}{2}-1}
A[1](x)=a1+a3x+a5x2+...+an−1x2n−1
如何关联三者?
先写出:
A
[
0
]
(
x
2
)
=
a
0
+
a
2
x
2
+
a
4
x
4
+
.
.
.
+
a
n
−
2
x
n
−
2
A^{[0]}(x^{2})=a_{0}+a_{2}x^{2}+a_{4}x^{4}+...+a_{n-2}x^{n-2}
A[0](x2)=a0+a2x2+a4x4+...+an−2xn−2
x
A
[
1
]
(
x
2
)
=
(
a
1
+
a
3
x
2
+
a
5
x
4
+
.
.
.
+
a
n
−
1
x
n
−
2
)
x
xA^{[1]}(x^{2})=(a_{1}+a_{3}x^{2}+a_{5}x^{4}+...+a_{n-1}x^{n-2})x
xA[1](x2)=(a1+a3x2+a5x4+...+an−1xn−2)x
=
a
1
+
a
3
x
3
+
a
5
x
5
+
.
.
.
+
a
n
−
1
x
n
−
1
=a_{1}+a_{3}x^{3}+a_{5}x^{5}+...+a_{n-1}x^{n-1}
=a1+a3x3+a5x5+...+an−1xn−1
所以有:
A
(
x
)
=
A
[
0
]
(
x
2
)
+
x
A
[
1
]
(
x
2
)
A(x)=A^{[0]}(x^{2})+xA^{[1]}(x^{2})
A(x)=A[0](x2)+xA[1](x2)
此时,
y
k
y_{k}
yk为:
y
k
=
A
(
w
n
k
)
=
A
[
0
]
(
(
w
n
k
)
2
)
+
w
n
k
A
[
1
]
(
(
w
n
k
)
2
)
y_{k}=A(w_{n}^{k})=A^{[0]}((w_{n}^{k})^{2})+w_{n}^{k}A^{[1]}((w_{n}^{k})^{2})
yk=A(wnk)=A[0]((wnk)2)+wnkA[1]((wnk)2)
同理,对于:
A
(
w
n
k
+
n
2
)
=
A
[
0
]
(
(
w
n
k
+
n
2
)
2
)
+
w
n
k
+
n
2
A
[
1
]
(
(
w
n
k
+
n
2
)
2
)
A(w_{n}^{k+\frac{n}{2}})=A^{[0]}((w_{n}^{k+\frac{n}{2}})^{2})+w_{n}^{k+\frac{n}{2}}A^{[1]}((w_{n}^{k+\frac{n}{2}})^{2})
A(wnk+2n)=A[0]((wnk+2n)2)+wnk+2nA[1]((wnk+2n)2)
根据折半引理
(
w
n
k
+
n
2
)
2
=
w
n
2
k
(w_{n}^{k+\frac{n}{2}})^{2}=w_{\frac{n}{2}}^{k}
(wnk+2n)2=w2nk有:
A
(
w
n
k
+
n
2
)
=
A
[
0
]
(
w
n
2
k
)
+
w
n
k
+
n
2
A
[
1
]
(
w
n
2
k
)
A(w_{n}^{k+\frac{n}{2}})=A^{[0]}(w_{\frac{n}{2}}^{k})+w_{n}^{k+\frac{n}{2}}A^{[1]}(w_{\frac{n}{2}}^{k})
A(wnk+2n)=A[0](w2nk)+wnk+2nA[1](w2nk)
在证明折半引理时,有一个中间结论:
w
n
k
+
n
2
=
−
w
n
k
w_{n}^{k+\frac{n}{2}}=-w_{n}^{k}
wnk+2n=−wnk,因此可以化简为:
A
(
w
n
k
+
n
2
)
=
A
(
−
w
n
k
)
=
A
[
0
]
(
w
n
2
k
)
−
w
n
k
A
[
1
]
(
w
n
2
k
)
A(w_{n}^{k+\frac{n}{2}})=A(-w_{n}^{k})=A^{[0]}(w_{\frac{n}{2}}^{k})-w_{n}^{k}A^{[1]}(w_{\frac{n}{2}}^{k})
A(wnk+2n)=A(−wnk)=A[0](w2nk)−wnkA[1](w2nk)
反过来得到:
y
k
=
A
(
w
n
k
)
=
A
[
0
]
(
w
n
2
k
)
+
w
n
k
A
[
1
]
(
w
n
2
k
)
y_{k}=A(w_{n}^{k})=A^{[0]}(w_{\frac{n}{2}}^{k})+w_{n}^{k}A^{[1]}(w_{\frac{n}{2}}^{k})
yk=A(wnk)=A[0](w2nk)+wnkA[1](w2nk)
此时,分别在
a
[
0
]
a^{[0]}
a[0]和
a
[
1
]
a^{[1]}
a[1]上计算
n
2
\frac{n}{2}
2n次多项式即可;
FFT的高效之处
在前面已经知道:
y
k
=
A
(
w
n
k
)
=
A
[
0
]
(
w
n
2
k
)
+
w
n
k
A
[
1
]
(
w
n
2
k
)
y_{k}=A(w_{n}^{k})=A^{[0]}(w_{\frac{n}{2}}^{k})+w_{n}^{k}A^{[1]}(w_{\frac{n}{2}}^{k})
yk=A(wnk)=A[0](w2nk)+wnkA[1](w2nk)
另外:
A
(
w
n
k
+
n
2
)
=
A
[
0
]
(
w
n
2
k
)
−
w
n
k
A
[
1
]
(
w
n
2
k
)
A(w_{n}^{k+\frac{n}{2}})=A^{[0]}(w_{\frac{n}{2}}^{k})-w_{n}^{k}A^{[1]}(w_{\frac{n}{2}}^{k})
A(wnk+2n)=A[0](w2nk)−wnkA[1](w2nk)
注意到:
y
k
+
n
2
=
A
(
w
n
k
+
n
2
)
y_{k+\frac{n}{2}}=A(w_{n}^{k+\frac{n}{2}})
yk+2n=A(wnk+2n),也就是说,
y
k
+
n
2
y_{k+\frac{n}{2}}
yk+2n和
y
k
y_{k}
yk在计算上仅相差
w
n
k
w_{n}^{k}
wnk的正负,所以可以保存
A
[
0
]
(
w
n
2
k
)
A^{[0]}(w_{\frac{n}{2}}^{k})
A[0](w2nk)和
A
[
1
]
(
w
n
2
k
)
A^{[1]}(w_{\frac{n}{2}}^{k})
A[1](w2nk),即空间换时间,因此
w
n
k
w_{n}^{k}
wnk的计算规模缩小为从0到
n
2
\frac{n}{2}
2n,即
D
F
T
n
(
a
)
DFT_{n}(a)
DFTn(a)可以转移为计算
D
F
T
n
2
(
a
[
0
]
)
DFT_{\frac{n}{2}}(a^{[0]})
DFT2n(a[0])和
D
F
T
n
2
(
a
[
1
]
)
DFT_{\frac{n}{2}}(a^{[1]})
DFT2n(a[1])
时间复杂度
基于FFT,原来的
D
F
T
n
(
a
)
DFT_{n}(a)
DFTn(a)可以转移为
D
F
T
n
2
(
a
[
0
]
)
DFT_{\frac{n}{2}}(a^{[0]})
DFT2n(a[0])和
D
F
T
n
2
(
a
[
1
]
)
DFT_{\frac{n}{2}}(a^{[1]})
DFT2n(a[1]):

而
D
F
T
n
2
(
a
[
0
]
)
DFT_{\frac{n}{2}}(a^{[0]})
DFT2n(a[0])或者
D
F
T
n
2
(
a
[
1
]
)
DFT_{\frac{n}{2}}(a^{[1]})
DFT2n(a[1])又可以分别进一步缩小规模(递归):
比如
D
F
T
n
2
(
a
[
0
]
)
DFT_{\frac{n}{2}}(a^{[0]})
DFT2n(a[0])转移为
D
F
T
n
4
(
a
[
0
]
[
0
]
)
DFT_{\frac{n}{4}}(a^{[0][0]})
DFT4n(a[0][0])和
D
F
T
n
4
(
a
[
0
]
[
1
]
)
DFT_{\frac{n}{4}}(a^{[0][1]})
DFT4n(a[0][1]);
因此时间复杂度
T
(
n
)
T(n)
T(n)应表示为,总的时间等于二倍子问题时间加上
n
n
n个结果的合并时间:
T
(
n
)
=
2
T
(
n
2
)
+
O
(
n
)
T(n)=2T(\frac{n}{2})+O(n)
T(n)=2T(2n)+O(n)
详细解释:
n
n
n个结果的合并时间
这里递归的目的是返回{
A
[
0
]
(
w
n
2
k
)
,
A
[
1
]
(
w
n
2
k
)
A^{[0]}(w_{\frac{n}{2}}^{k}),A^{[1]}(w_{\frac{n}{2}}^{k})
A[0](w2nk),A[1](w2nk)},
k
=
0
,
1
,
.
.
,
n
2
−
1
k=0,1,..,\frac{n}{2}-1
k=0,1,..,2n−1;
获取完整的DFT还需要在
A
[
1
]
(
w
n
2
k
)
A^{[1]}(w_{\frac{n}{2}}^{k})
A[1](w2nk)前乘
w
n
k
w_{n}^{k}
wnk,在FFT的高效之处提过
w
n
k
w_{n}^{k}
wnk的系数:
前
n
2
\frac{n}{2}
2n的
w
n
k
w_{n}^{k}
wnk系数为+,后
n
2
\frac{n}{2}
2n的
w
n
k
w_{n}^{k}
wnk系数为-,所以完整的结果
y
y
y还需要做n次合并处理:
A
[
0
]
(
w
n
2
k
)
+
w
n
k
A
[
1
]
(
w
n
2
k
)
A^{[0]}(w_{\frac{n}{2}}^{k})+w_{n}^{k}A^{[1]}(w_{\frac{n}{2}}^{k})
A[0](w2nk)+wnkA[1](w2nk)
和:
A
[
0
]
(
w
n
2
k
)
−
w
n
k
A
[
1
]
(
w
n
2
k
)
A^{[0]}(w_{\frac{n}{2}}^{k})-w_{n}^{k}A^{[1]}(w_{\frac{n}{2}}^{k})
A[0](w2nk)−wnkA[1](w2nk)
时间复杂度为:
T
(
n
)
=
2
T
(
n
2
)
+
O
(
n
)
T(n)=2T(\frac{n}{2})+O(n)
T(n)=2T(2n)+O(n)
重复代入T(n)化简:
T
(
n
)
=
2
(
2
T
(
n
4
)
+
O
(
n
2
)
)
+
O
(
n
)
=
4
T
(
n
4
)
+
2
O
(
n
)
T(n)=2(2T(\frac{n}{4})+O(\frac{n}{2}))+O(n)=4T(\frac{n}{4})+2O(n)
T(n)=2(2T(4n)+O(2n))+O(n)=4T(4n)+2O(n)
归纳为:
T
(
n
)
=
2
k
T
(
n
2
k
)
+
k
O
(
n
)
T(n)=2^{k}T(\frac{n}{2^{k}})+kO(n)
T(n)=2kT(2kn)+kO(n)
令
n
=
2
k
n=2^{k}
n=2k得到:
T
(
n
)
=
n
T
(
n
n
)
+
l
o
g
2
n
O
(
n
)
=
n
+
n
l
o
g
n
T(n)=nT(\frac{n}{n})+log_{2}nO(n)=n+nlogn
T(n)=nT(nn)+log2nO(n)=n+nlogn
所以时间复杂度为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
FFT的应用
多项式部分提到,多项式相乘实际上是两个系数向量作卷积,信号系统里有时域的卷积等于频域相乘,根据DFT和IDFT的内容,可以得到:
a
⊗
b
=
I
D
F
T
2
n
(
D
F
T
2
n
(
a
)
∘
D
F
T
2
n
(
b
)
)
a\otimes b=IDFT_{2n}(DFT_{2n}(a)\circ DFT_{2n}(b))
a⊗b=IDFT2n(DFT2n(a)∘DFT2n(b))
符号
∘
\circ
∘代表两序列的元素对应相乘,可以理解为python内置高阶函数中的map;使用FFT去作DFT,将可以节省时间的开销
5750

被折叠的 条评论
为什么被折叠?



