7-3 离散傅里叶变换与快速傅里叶变换
\qquad 周期为 N N N的信号空间是 N N N维欧几里得空间(内积空间),若 f , g f,g f,g是两个信号,则他们的内积定义为 < f , g > = ∑ n = 0 N − 1 f [ n ] g ∗ [ n ] <f,g>=\sum_{n=0}^{N-1}f[n]g^*[n] <f,g>=n=0∑N−1f[n]g∗[n]
1. 循环卷积
\qquad
有限域
0
≤
n
<
N
0\leq n<N
0≤n<N上的离散信号
f
[
n
]
f[n]
f[n]的边界
(
n
=
0
o
r
n
=
N
−
1
)
(n=0 or n=N-1)
(n=0orn=N−1)的卷积往往需要修正.首先需要引入循环卷积的概念。
\qquad
设
f
~
,
h
~
\widetilde f,\widetilde h
f
,h
是有
N
N
N个样本值的信号。为计算卷积
f
~
∗
h
~
[
n
]
=
∑
p
=
−
∞
+
∞
f
~
[
p
]
h
~
[
n
−
p
]
,
0
≤
n
<
N
\widetilde f*\widetilde h[n]=\sum_{p=-\infty}^{+\infty}\widetilde f[p]\widetilde h[n-p],0\leq n<N
f
∗h
[n]=p=−∞∑+∞f
[p]h
[n−p],0≤n<N我们必须利用
[
0
,
N
]
[0,N]
[0,N]之外的
f
~
[
n
]
,
h
~
[
n
]
\widetilde f[n],\widetilde h[n]
f
[n],h
[n]的值,一个办法是将
f
~
[
n
]
,
h
~
[
n
]
\widetilde f[n],\widetilde h[n]
f
[n],h
[n]作周期扩充,当
n
>
N
n>N
n>N时,
f
[
n
]
=
f
~
[
n
(
m
o
d
)
N
]
,
h
[
n
]
=
h
~
[
n
(
m
o
d
)
N
]
f[n]=\widetilde f[n(mod)N],h[n]=\widetilde h[n(mod)N]
f[n]=f
[n(mod)N],h[n]=h
[n(mod)N]对于周期为N的两个函数
f
~
[
n
]
,
h
~
[
n
]
\widetilde f[n],\widetilde h[n]
f
[n],h
[n]它们的循环卷积定义为
f
∗
h
[
n
]
=
∑
p
=
0
N
−
1
f
[
p
]
h
[
n
−
p
]
=
∑
p
=
0
N
−
1
f
[
n
−
p
]
h
[
p
]
f * h[n]=\sum_{p=0}^{N-1}f[p]h[n-p]=\sum_{p=0}^{N-1}f[n-p]h[p]
f∗h[n]=p=0∑N−1f[p]h[n−p]=p=0∑N−1f[n−p]h[p].
定理: 向量集
{
e
k
[
n
]
=
e
i
2
k
π
n
N
}
0
≤
k
<
N
\{e_k[n]=e^{i2k\pi \frac{n}{N}}\}_{0\leq k<N}
{ek[n]=ei2kπNn}0≤k<N是
N
N
N周期信号空间的正交基。
\qquad 若 f , h f,h f,h是周期的,它们的循环卷积 g = f ∗ h g=f*h g=f∗h的离散傅里叶变换为 g ^ ( k ) = f ^ ( k ) h ^ ( k ) \hat g(k)=\hat f(k)\hat h(k) g^(k)=f^(k)h^(k).
2.离散傅里叶变换
\qquad 上面定理给出了 N N N周期信号空间的正交基,则任意的 f f f为N周期函数可表示为 f = ∑ k = 0 N − 1 < f , e k > ∥ e k ∥ 2 e k f=\sum_{k=0}^{N-1}\frac{<f,e_k>}{\Vert e_k\Vert^2}e_k f=k=0∑N−1∥ek∥2<f,ek>ek f f f的离散傅里叶变换(DFT)为 f ^ [ k ] = < f , e k > = ∑ n = 0 N − 1 f [ n ] e − i 2 k π n N \hat f[k]=<f,e_k>=\sum_{n=0}^{N-1}f[n]e^{-i2k\pi \frac{n}{N}} f^[k]=<f,ek>=n=0∑N−1f[n]e−i2kπNn因为 e k : k = 0 , . . . , N − 1 {e_k:k=0,...,N-1} ek:k=0,...,N−1是正交的,所以 ∥ e k ∥ = N \Vert e_k\Vert=N ∥ek∥=N于是 f f f的傅里叶逆变换为 f [ n ] = 1 N ∑ n = 0 N − 1 f ^ [ k ] e i 2 k π n N f[n]=\frac{1}{N}\sum_{n=0}^{N-1}\hat f[k] e^{i2k\pi\frac{n}N} f[n]=N1n=0∑N−1f^[k]ei2kπNn
3.快速傅里叶变换 F F T FFT FFT
\qquad
对于有
N
N
N个点的信号
f
f
f,直接计算其离散傅里叶变换
f
^
[
k
]
=
<
f
,
e
k
>
=
∑
n
=
0
N
−
1
f
[
n
]
e
−
i
2
k
π
n
N
,
0
≤
k
<
N
\hat f[k]=<f,e_k>=\sum_{n=0}^{N-1}f[n]e^{-i2k\pi \frac{n}{N}},0\leq k<N
f^[k]=<f,ek>=n=0∑N−1f[n]e−i2kπNn,0≤k<N需要
N
2
N^2
N2次乘法与加法运算,通过重新组织计算,
F
F
t
FFt
FFt可将计算复杂度降至
O
(
N
log
2
N
)
O(N\log_2N)
O(Nlog2N).具体分组如下:
\qquad
当频率指标为偶数时,将
f
f
f按
N
N
N与
n
+
2
N
n+\frac 2 N
n+N2分组
f
^
[
2
k
]
=
∑
n
=
0
2
N
−
1
(
f
[
n
]
+
f
[
n
+
2
N
]
)
e
−
i
2
k
π
n
N
/
2
(1)
\hat f[2k]=\sum_{n=0}^{\frac 2 N-1}(f[n]+f[n+\frac 2 N])e^{-i2k\pi \frac{n}{N/2}}\tag1
f^[2k]=n=0∑N2−1(f[n]+f[n+N2])e−i2kπN/2n(1)当频率指标为奇数时,同样分组可得
f
^
[
2
k
+
1
]
=
∑
n
=
0
2
N
−
1
e
−
i
2
π
n
N
(
f
[
n
]
+
f
[
n
+
2
N
]
)
e
−
i
2
k
π
n
N
/
2
(2)
\hat f[2k+1]=\sum_{n=0}^{\frac 2 N-1}e^{-i2\pi \frac{n}{N}}(f[n]+f[n+\frac 2 N])e^{-i2k\pi \frac{n}{N/2}}\tag2
f^[2k+1]=n=0∑N2−1e−i2πNn(f[n]+f[n+N2])e−i2kπN/2n(2)由
(
1
)
(
2
)
(1)(2)
(1)(2)可知,偶频率可由
f
e
[
n
]
=
f
[
n
]
+
f
[
n
+
2
N
]
(3)
f_e[n]=f[n]+f[n+\frac 2 N]\tag3
fe[n]=f[n]+f[n+N2](3)的离散傅里叶变换计算,奇频率可由
f
o
[
n
]
=
e
−
i
2
π
n
N
/
2
(
f
[
n
]
+
f
[
n
+
2
N
]
)
)
(4)
f_o[n]=e^{-i2\pi \frac{n}{N/2}}(f[n]+f[n+\frac 2 N]))\tag4
fo[n]=e−i2πN/2n(f[n]+f[n+N2]))(4)的离散傅里叶变换计算。于是,
N
N
N个点信号值的离散傅里叶变换可由两个
N
2
\frac N 2
2N信号点的离散傅里叶变换加上
O
(
N
)
O(N)
O(N)个加法运算计算得出。利用
f
∗
[
n
]
=
1
N
∑
n
=
0
N
−
1
f
^
∗
[
n
]
e
−
i
2
k
π
n
N
f^*[n]=\frac{1}{N}\sum_{n=0}^{N-1}\hat f*[n] e^{-i2k\pi\frac{n}N}
f∗[n]=N1n=0∑N−1f^∗[n]e−i2kπNn可以计算
f
^
\hat f
f^的复共轭
f
^
∗
\hat f^*
f^∗的逆
F
F
T
FFT
FFT.
注:
F
F
T
FFT
FFT的复杂度。记快速傅里叶变换的空间复杂度为
C
(
N
)
\mathcal C(N)
C(N),由(3)(4)式可知,计算
f
e
,
f
o
f_e,f_o
fe,fo分别需要计算N次复数加法和
N
2
\frac N 2
2N次复数乘法,记
K
N
KN
KN是其基本运算次数,则有
C
(
N
)
=
2
C
(
N
/
2
)
+
K
N
(5)
\mathcal C(N)=2C(N/2)+KN\tag5
C(N)=2C(N/2)+KN(5)令
l
=
log
2
N
l=\log_2 N
l=log2N,令
T
(
l
)
=
C
(
N
)
N
T(l)=\frac {\mathcal C(N)} N
T(l)=NC(N),则由(5)可得
C
(
N
)
N
=
2
C
(
N
/
2
)
N
+
K
\frac{\mathcal C(N)}{N}=\frac{2\mathcal C(N/2)}{N}+K
NC(N)=N2C(N/2)+K于是
T
(
l
)
=
T
(
l
−
1
)
+
K
T(l)=T(l-1)+K
T(l)=T(l−1)+K由于
C
(
1
)
=
0
\mathcal C(1)=0
C(1)=0,所以
T
(
0
)
=
0
T(0)=0
T(0)=0,故迭代可得
T
(
l
)
=
K
l
⟺
C
(
N
)
=
K
N
log
2
N
T(l)=Kl\iff\mathcal C(N)=KN\log_2N
T(l)=Kl⟺C(N)=KNlog2N由上式可知KKT的复杂度要小于离散傅里叶变换的复杂度
N
2
N^2
N2