赞
踩
在电赛中,使用FFT算法进行信号频谱分析极其常用,为了给大家科普FFT,本博客将从傅里叶级数到傅里叶变换,再到离散时间傅里叶变换、离散傅里叶变换,之后再简单讲解FFT中简单的按时间抽选的基 2–FFT 算法,主要目的在于为小白科普,如有不严谨或不正确的地方,还请大佬指出。本次博客大量参考其余大佬的博客,笔者只是拾人牙慧的小屁孩。
傅里叶级数展开告诉我们,任何一个函数
f
(
t
)
f(t)
f(t) ,都可以展开成如下形式的傅里叶级数:
f
(
t
)
=
1
2
a
0
+
∑
n
=
1
+
∞
[
a
n
c
o
s
(
n
w
t
)
+
b
n
s
i
n
(
n
w
t
)
]
w
=
2
π
T
a
n
=
2
T
∫
−
T
2
T
2
f
(
t
)
c
o
s
(
n
w
t
)
d
t
,
n
=
1
,
2
,
3...
b
n
=
2
T
∫
−
T
2
T
2
f
(
t
)
s
i
n
(
n
w
t
)
d
t
,
n
=
1
,
2
,
3...
f(t) = \frac{1}{2}a_{0} + \sum^{+\infty}_{n=1}[a_{n}cos(nwt) + b_{n}sin(nwt)]\\ w = \frac{2\pi}{T}\\ a_{n} = \frac{2}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}}f(t)cos(nwt)dt, n = 1, 2 ,3 ...\\ b_{n} = \frac{2}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}}f(t)sin(nwt)dt, n = 1, 2 ,3 ...
f(t)=21a0+n=1∑+∞[ancos(nwt)+bnsin(nwt)]w=T2πan=T2∫−2T2Tf(t)cos(nwt)dt,n=1,2,3...bn=T2∫−2T2Tf(t)sin(nwt)dt,n=1,2,3...
关于傅里叶级数待定系数的求解是利用的三角函数的正交性,详情可见这篇知乎。
我们利用欧拉公式得到(傅里叶变换里面有个
j
j
j,要考虑到这个复数和三角函数的关系):
c
o
s
(
n
w
t
)
=
e
j
n
w
t
+
e
−
j
n
w
t
2
s
i
n
(
n
w
t
)
=
e
j
n
w
t
−
e
−
j
n
w
t
2
j
cos(nwt) = \frac{e^{jnwt}+e^{-jnwt}}{2}\\ sin(nwt) = \frac{e^{jnwt}-e^{-jnwt}}{2j}
cos(nwt)=2ejnwt+e−jnwtsin(nwt)=2jejnwt−e−jnwt
代入傅里叶级数之中:
f
(
t
)
=
1
2
a
0
+
∑
n
=
1
+
∞
[
a
n
c
o
s
(
n
w
t
)
+
b
n
s
i
n
(
n
w
t
)
]
f
(
t
)
=
1
2
a
0
+
∑
n
=
1
+
∞
(
a
n
e
j
n
w
t
+
e
−
j
n
w
t
2
+
b
n
e
j
n
w
t
−
e
−
j
n
w
t
2
j
)
f
(
t
)
=
1
2
a
0
+
∑
n
=
1
+
∞
(
a
n
−
j
b
n
2
e
j
n
w
t
+
a
n
+
j
b
n
2
e
−
j
n
w
t
)
f(t) = \frac{1}{2}a_{0} + \sum^{+\infty}_{n=1}[a_{n}cos(nwt) + b_{n}sin(nwt)]\\ f(t) = \frac{1}{2}a_{0} + \sum^{+\infty}_{n=1}(a_{n} \frac{e^{jnwt}+e^{-jnwt}}{2}+ b_{n} \frac{e^{jnwt}-e^{-jnwt}}{2j})\\ f(t) = \frac{1}{2}a_{0} + \sum^{+\infty}_{n=1}( \frac{a_{n}-jb_{n}}{2}e^{jnwt}+ \frac{a_{n}+jb_{n}}{2}e^{-jnwt})
f(t)=21a0+n=1∑+∞[ancos(nwt)+bnsin(nwt)]f(t)=21a0+n=1∑+∞(an2ejnwt+e−jnwt+bn2jejnwt−e−jnwt)f(t)=21a0+n=1∑+∞(2an−jbnejnwt+2an+jbne−jnwt)
当
n
=
0
n=0
n=0时,
a
n
−
j
b
n
2
=
a
0
−
j
b
0
2
=
1
2
(
2
T
∫
−
T
2
T
2
f
(
t
)
d
t
−
0
)
=
1
T
∫
−
T
2
T
2
f
(
t
)
d
t
\frac{a_{n}-jb_{n}}{2} = \frac{a_{0}-jb_{0}}{2} = \frac{1}{2} (\frac{2}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}}f(t)dt - 0) = \frac{1}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}}f(t)dt
2an−jbn=2a0−jb0=21(T2∫−2T2Tf(t)dt−0)=T1∫−2T2Tf(t)dt
令
c
0
=
a
0
−
j
b
0
2
=
1
T
∫
−
T
2
T
2
f
(
t
)
d
t
c_{0} = \frac{a_{0}-jb_{0}}{2} = \frac{1}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}}f(t)dt
c0=2a0−jb0=T1∫−2T2Tf(t)dt,
猜想
c
n
=
a
n
−
j
b
n
2
=
1
T
∫
−
T
2
T
2
f
(
t
)
e
−
j
n
w
t
d
t
c_{n} = \frac{a_{n}-jb_{n}}{2} = \frac{1}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}}f(t)e^{-jnwt}dt
cn=2an−jbn=T1∫−2T2Tf(t)e−jnwtdt
假设我们猜想成立,
我们计算
c
−
n
c_{-n}
c−n:
c
−
n
=
1
T
∫
−
T
2
T
2
f
(
t
)
e
j
n
w
t
d
t
=
1
T
∫
−
T
2
T
2
f
(
t
)
[
c
o
s
(
n
w
t
)
+
j
s
i
n
(
n
w
t
)
]
d
t
=
1
2
[
2
T
∫
−
T
2
T
2
f
(
t
)
c
o
s
(
n
w
t
)
d
t
+
2
j
T
∫
−
T
2
T
2
f
(
t
)
s
i
n
(
n
w
t
)
d
t
]
=
a
n
+
j
b
n
2
综上,
c
−
n
=
1
T
∫
−
T
2
T
2
f
(
t
)
e
j
n
w
t
d
t
,
n
=
1
,
2
,
3...
c_{-n} = \frac{1}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}}f(t)e^{jnwt}dt, n = 1, 2 ,3 ...
c−n=T1∫−2T2Tf(t)ejnwtdt,n=1,2,3...
延拓为正整数
n
n
n,
c
n
=
1
T
∫
−
T
2
T
2
f
(
t
)
e
−
j
n
w
t
d
t
,
n
=
1
,
2
,
3...
c_{n} = \frac{1}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}}f(t)e^{-jnwt}dt, n = 1, 2 ,3 ...
cn=T1∫−2T2Tf(t)e−jnwtdt,n=1,2,3...
之后我们再将傅里叶级数的式子写成:
f
(
t
)
=
1
2
(
a
0
+
0
)
+
∑
n
=
1
+
∞
(
a
n
−
j
b
n
2
e
j
n
w
t
+
a
n
+
j
b
n
2
e
−
j
n
w
t
)
f
(
t
)
=
c
0
+
∑
n
=
1
+
∞
(
c
n
e
j
n
w
t
+
c
−
n
e
−
j
n
w
t
)
f
(
t
)
=
∑
n
=
−
∞
+
∞
c
n
e
j
n
w
t
又因为
c
n
=
1
T
∫
−
T
2
T
2
f
(
t
)
e
−
j
n
w
t
d
t
c_{n} = \frac{1}{T}\int^{\frac{T}{2}}_{-\frac{T}{2}}f(t)e^{-jnwt}dt
cn=T1∫−2T2Tf(t)e−jnwtdt
得到
f
(
t
)
=
∑
n
=
−
∞
+
∞
[
1
T
∫
−
T
2
T
2
f
(
τ
)
e
−
j
n
w
τ
d
τ
]
e
j
n
w
t
f
(
t
)
=
1
T
∑
n
=
−
∞
+
∞
[
∫
−
T
2
T
2
f
(
τ
)
e
−
j
n
w
τ
d
τ
]
e
j
n
w
t
请注意,这里的
n
n
n依然是一个整数,尽管它的范围为
−
∞
<
n
<
∞
-\infty < n < \infty
−∞<n<∞,所以接下来我们需要将其连续化。
傅里叶积分定理——当
T
→
+
∞
T \rightarrow +\infty
T→+∞,任何一个非周期函数
f
(
t
)
f(t)
f(t)都可以看成某个周期函数
f
T
(
t
)
f_{T}(t)
fT(t)转换而来,数学表示即:
lim
T
→
+
∞
f
T
(
t
)
=
f
(
t
)
\lim_{T \rightarrow +\infty}f_{T}(t) = f(t)
T→+∞limfT(t)=f(t)
故,当我们取极限时,
lim
T
→
+
∞
Δ
(
n
w
)
=
lim
T
→
+
∞
[
n
w
−
(
n
−
1
)
w
]
=
lim
T
→
+
∞
w
=
lim
T
→
+
∞
2
π
T
=
0
i
.
e
.
lim
T
→
+
∞
Δ
(
n
w
)
=
0
=
lim
T
→
+
∞
d
(
n
w
)
\lim_{T \rightarrow +\infty}\Delta(nw) =\lim_{T \rightarrow +\infty}[ nw - (n-1) w]=\lim_{T \rightarrow +\infty}w\\ = \lim_{T \rightarrow +\infty}\frac{2\pi}{T} = 0\\ i.e. \text{ } \lim_{T \rightarrow +\infty}\Delta(nw) = 0 = \lim_{T \rightarrow +\infty}d(nw)
T→+∞limΔ(nw)=T→+∞lim[nw−(n−1)w]=T→+∞limw=T→+∞limT2π=0i.e. T→+∞limΔ(nw)=0=T→+∞limd(nw)
这样,只要
T
→
+
∞
T \rightarrow +\infty
T→+∞,
Δ
(
n
w
)
→
d
(
n
w
)
→
0
\Delta(nw) \rightarrow d(nw) \rightarrow 0
Δ(nw)→d(nw)→0,这样的话,岂不是
n
w
nw
nw的间距就变得非常小了,离散的
Δ
(
n
w
)
\Delta(nw)
Δ(nw)就变成了连续的
d
(
n
w
)
d(nw)
d(nw),求和号就变成了积分号。
我们刚刚的式子也可以写成,
f
(
t
)
=
1
T
∑
n
=
−
∞
+
∞
[
∫
−
T
2
T
2
f
(
τ
)
e
−
j
n
w
τ
d
τ
]
e
j
n
w
t
f
(
t
)
=
lim
T
→
+
∞
1
2
π
d
w
∫
−
∞
+
∞
[
∫
−
∞
+
∞
f
(
τ
)
e
−
j
w
τ
d
τ
]
e
j
w
t
f
(
t
)
=
lim
T
→
+
∞
1
2
π
∫
−
∞
+
∞
[
∫
−
∞
+
∞
f
(
τ
)
e
−
j
w
τ
d
τ
]
e
j
w
t
d
w
如果我们把
∫
−
T
2
T
2
f
(
τ
)
e
−
j
w
τ
d
τ
\int^{\frac{T}{2}}_{-\frac{T}{2}}f(\tau)e^{-jw\tau}d\tau
∫−2T2Tf(τ)e−jwτdτ设为是傅里叶变换,那它可以得到一个含
w
w
w的式子,用于外层积分。于是我们把这个一个函数写成两步:
F
(
w
)
=
∫
−
∞
+
∞
f
(
t
)
e
−
j
w
t
d
t
f
(
t
)
=
1
2
π
∫
−
∞
+
∞
F
(
w
)
e
j
w
t
d
w
F(w) = \int^{+\infty}_{-\infty}f(t)e^{-jwt}dt\\ f(t) = \frac{1}{2\pi} \int^{+\infty}_{-\infty}F(w)e^{jwt}dw
F(w)=∫−∞+∞f(t)e−jwtdtf(t)=2π1∫−∞+∞F(w)ejwtdw
这便是傅里叶变化和逆傅里叶变换。
有了傅里叶变换
F
(
w
)
=
∫
−
∞
+
∞
f
(
t
)
e
−
j
w
t
d
t
F(w) = \int^{+\infty}_{-\infty}f(t)e^{-jwt}dt
F(w)=∫−∞+∞f(t)e−jwtdt
我们把时间离散化,便有了离散时间傅里叶变换(DTFT):
F
(
w
)
=
∫
−
∞
+
∞
f
(
t
)
e
−
j
w
n
d
n
,
n
∈
Z
F(w) = \int^{+\infty}_{-\infty}f(t)e^{-jwn}dn, n \in Z
F(w)=∫−∞+∞f(t)e−jwndn,n∈Z
不过,在这里的
n
n
n是从
−
∞
-\infty
−∞到
∞
\infty
∞的整数,而且
w
w
w是连续的。该函数在时域上离散,在频域上则是周期的,它一般用来对离散时间信号进行频谱分析。
为了在科学计算和数字信号处理等领域使用计算机进行傅里叶变换,必须将函数定义在离散点上而非连续域内,且须满足有限性或周期性条件,即离散傅里叶变换(DFT)。
把
0
0
0-
N
N
N个点的波形,周期填充到
−
∞
-\infty
−∞到
∞
\infty
∞,即为DFT的核心思想。
w
t
=
2
π
f
t
=
2
π
t
T
wt = 2\pi f t = 2\pi \frac{t}{T}
wt=2πft=2πTt,这代表着
t
t
t从
0
0
0到
T
T
T中有一个周期的波形,
而
0
≤
n
N
<
1
0
≤
2
π
n
N
<
2
π
这代表着0-N中有一个周期的波形
0
≤
2
π
k
n
N
<
2
k
π
这代表着0-N中有k个周期的波形
0 \leq \frac{n}{N} < 1\\ 0 \leq 2\pi \frac{n}{N} < 2\pi \text{ 这代表着0-N中有一个周期的波形}\\ 0 \leq 2\pi \frac{kn}{N} < 2k\pi \text{ 这代表着0-N中有k个周期的波形}
0≤Nn<10≤2πNn<2π 这代表着0-N中有一个周期的波形0≤2πNkn<2kπ 这代表着0-N中有k个周期的波形
于是我们把DTFT的
w
n
wn
wn改写成
2
π
k
n
N
\frac{2\pi kn}{N}
N2πkn,它们都具有相同的含义。
于是我们感性的得到了DFT(本博客重点不是讲明如何严谨证明,而是通俗易懂解释):
F
(
k
)
=
∑
n
=
0
N
−
1
x
n
e
−
j
2
π
k
n
/
N
F(k) = \sum^{N-1}_{n=0}x_{n}e^{-j2 \pi kn / N}
F(k)=n=0∑N−1xne−j2πkn/N
DFT 运算量从
N
2
N^2
N2,因为复数乘法的运算量为:
(
a
+
j
b
)
(
c
+
j
d
)
=
(
a
b
−
b
d
)
+
j
(
b
c
+
a
d
)
(a+jb)(c+jd)=(ab-bd)+j(bc+ad)
(a+jb)(c+jd)=(ab−bd)+j(bc+ad)。
在多点数的DFT运算中,常常会有很长的执行时间。
于是,在 1965 年Cooley 和 Tukey 在《计算机科学 》发表著名的《机器计算傅立叶级数的一种算法》论文后,FFT 开始大规模应用。
FFT也就是Fast Fourier Transform。FFT 充分利用了 DFT 运算中的对称性和周期性,从而将 DFT 运算量从
N
2
N^2
N2 减少到
log
2
N
\log_{2}{N}
log2N。
在式子中,
F
(
k
)
=
∑
n
=
0
N
−
1
f
(
n
)
e
−
j
2
π
k
n
/
N
F(k) = \sum^{N-1}_{n=0}f(n)e^{-j2 \pi kn / N}
F(k)=n=0∑N−1f(n)e−j2πkn/N
我们一般将
e
−
j
2
π
k
n
/
N
e^{-j2 \pi kn / N}
e−j2πkn/N写成
W
N
k
n
W^{kn}_{N}
WNkn
DFT也可以写成
F
(
k
)
=
∑
n
=
0
N
−
1
f
(
n
)
W
N
k
n
F(k) = \sum^{N-1}_{n=0}f(n)W^{kn}_{N}
F(k)=n=0∑N−1f(n)WNkn
为什么要这么做,因为
W
N
k
n
W^{kn}_{N}
WNkn具有很多性质,可以改善DFT 的运算效率,故为了我们方便研究
W
N
k
n
W^{kn}_{N}
WNkn。
对称性
(
W
N
k
n
)
∗
=
(
cos
(
−
2
π
k
n
/
N
)
+
j
sin
(
−
2
π
k
n
/
N
)
)
∗
=
(
cos
(
2
π
k
n
/
N
)
−
j
sin
(
2
π
k
n
/
N
)
)
∗
=
cos
(
2
π
k
n
/
N
)
−
j
sin
(
2
π
k
n
/
N
)
=
W
N
−
k
n
(W^{kn}_{N})^{*} = (\cos{(-2 \pi kn / N)} + j\sin{(-2 \pi kn / N)})^{*} = (\cos{(2 \pi kn / N)} - j\sin{(2 \pi kn / N)})^{*} = \cos{(2 \pi kn / N)} - j\sin{(2 \pi kn / N)} = W^{-kn}_{N}
(WNkn)∗=(cos(−2πkn/N)+jsin(−2πkn/N))∗=(cos(2πkn/N)−jsin(2πkn/N))∗=cos(2πkn/N)−jsin(2πkn/N)=WN−kn
W
N
k
n
=
W
N
k
n
×
1
=
W
N
k
n
×
cos
(
−
2
π
k
N
/
N
)
+
j
sin
(
−
2
π
k
N
/
N
)
=
W
N
k
n
×
W
N
k
N
=
W
N
k
(
n
+
N
)
W^{kn}_{N} = W^{kn}_{N} \times 1 =W^{kn}_{N} \times \cos{(-2 \pi kN / N)} + j\sin{(-2 \pi kN / N)} = W^{kn}_{N} \times W^{kN}_{N}=W^{k(n+N)}_{N}
WNkn=WNkn×1=WNkn×cos(−2πkN/N)+jsin(−2πkN/N)=WNkn×WNkN=WNk(n+N)
W
N
k
n
=
W
N
k
n
×
1
=
W
N
k
n
×
cos
(
−
2
π
N
n
/
N
)
+
j
sin
(
−
2
π
N
n
/
N
)
=
W
N
k
n
×
W
N
N
n
=
W
N
n
(
k
+
N
)
W^{kn}_{N} = W^{kn}_{N} \times 1 =W^{kn}_{N} \times \cos{(-2 \pi Nn / N)} + j\sin{(-2 \pi Nn / N)} = W^{kn}_{N} \times W^{Nn}_{N}=W^{n(k+N)}_{N}
WNkn=WNkn×1=WNkn×cos(−2πNn/N)+jsin(−2πNn/N)=WNkn×WNNn=WNn(k+N)
周期性
W
N
k
n
=
W
N
(
n
+
N
)
k
W^{kn}_{N} = W^{(n + N)k}_{N}
WNkn=WN(n+N)k
可约性
W
N
k
n
=
W
m
N
m
k
n
W^{kn}_{N} = W^{mkn}_{mN}
WNkn=WmNmkn
特殊点
W
N
0
=
1
W^{0}_{N} = 1
WN0=1
W
N
N
/
2
=
−
1
W^{N/2}_{N} = -1
WNN/2=−1
W
N
k
+
N
/
2
=
−
W
N
k
W^{k+N/2}_{N} = -W^{k}_{N}
WNk+N/2=−WNk
FFT 算法的基本思想:
➢ 利用 DFT 系数的特性,合并 DFT 运算中的某些项。
➢ 把长序列 DFT→短序列 DFT,从而减少运算量。
将一个大点数 N 的 DFT 能分解为若干小点数 DFT 的组合,则显然可以达到减少运算工作量的效果。
设输入序列长度为 N =
2
M
2^M
2M(M 为正整数),将该序列按时间顺序的奇偶分解为越来越短的子序列,称为基 2 按时间抽取的 FFT 算法。也称为 Coolkey-Tukey 算法。
其中基 2 表示:N =
2
M
2^M
2M,M 为整数。若不满足这个条件,可以人为地加上若干零值(加零补长)使其达到 N =
2
M
2^M
2M。
下面我们来细说,
F
(
k
)
=
D
F
T
[
f
(
n
)
]
=
∑
n
=
0
N
−
1
f
(
n
)
W
N
k
n
=
∑
r
=
0
N
/
2
−
1
f
(
2
r
)
W
N
k
2
r
+
∑
r
=
0
N
/
2
−
1
f
(
2
r
+
1
)
W
N
k
(
2
r
+
1
)
把式子分成奇数项和偶数项,接着开始变换,
=
∑
r
=
0
N
/
2
−
1
f
(
2
r
)
W
N
k
2
r
+
∑
r
=
0
N
/
2
−
1
f
(
2
r
+
1
)
W
N
k
(
2
r
+
1
)
=
∑
r
=
0
N
/
2
−
1
f
(
2
r
)
W
N
k
2
r
+
W
N
k
∑
r
=
0
N
/
2
−
1
f
(
2
r
+
1
)
W
N
k
2
r
=
∑
r
=
0
N
/
2
−
1
f
(
2
r
)
W
N
/
2
k
r
+
W
N
k
∑
r
=
0
N
/
2
−
1
f
(
2
r
+
1
)
W
N
/
2
k
r
=
F
1
(
k
)
+
W
N
k
F
2
(
k
)
我们便将一个DFT拆分成了两个DFT运算的相加。
我们再利用对称性
W
N
k
n
=
W
N
k
(
n
+
N
)
W^{kn}_{N} = W^{k(n+N)}_{N}
WNkn=WNk(n+N),可以得到,
=
∑
r
=
0
N
/
2
−
1
f
(
2
r
)
W
N
/
2
k
r
+
W
N
k
∑
r
=
0
N
/
2
−
1
f
(
2
r
+
1
)
W
N
/
2
k
r
=
∑
r
=
0
N
/
2
−
1
f
(
2
r
)
W
N
/
2
k
(
r
+
N
/
2
)
+
W
N
k
∑
r
=
0
N
/
2
−
1
f
(
2
r
+
1
)
W
N
/
2
k
(
r
+
N
/
2
)
=
F
1
(
k
+
N
/
2
)
+
W
N
k
F
2
(
k
+
N
/
2
)
做一些变换,
F
(
k
)
=
F
1
(
k
+
N
/
2
)
+
W
N
k
F
2
(
k
+
N
/
2
)
F
(
k
+
N
/
2
)
=
F
1
(
k
+
N
)
+
W
N
k
+
N
/
2
F
2
(
k
+
N
)
F
(
k
+
N
/
2
)
=
F
1
(
k
)
+
W
N
k
×
W
N
N
/
2
F
2
(
k
)
周期性
F
(
k
+
N
/
2
)
=
F
1
(
k
)
−
W
N
k
F
2
(
k
)
特殊点
于是我们有了两个计算结果,分别结算FFT的前半部分和后半部分
F
(
k
)
=
F
1
(
k
)
+
W
N
k
F
2
(
k
)
F
(
k
+
N
/
2
)
=
F
1
(
k
)
−
W
N
k
F
2
(
k
)
F(k) = F_{1}(k) +W^{k}_{N}F_{2}(k) \\ F(k + N/2) = F_{1}(k) -W^{k}_{N} F_{2}(k)
F(k)=F1(k)+WNkF2(k)F(k+N/2)=F1(k)−WNkF2(k)
有了上面的计算结果后,我们可以得到如下的蝶形运算流图符号:
分解后的运算量减少了近一半。
我们举个例子:
N=
2
3
2^3
23=8,
我们如果只分两组,
确实能得到答案,不过还可以继续分下去,提高性能。
再继续分下去的时候,要注意新的奇偶次序,
理清次序之后,我们分四组,进行2点DFT:
下图是按 8 点抽取的 FFT 运算流图:
和我们绘制的本质一致,我们只需增加第一级蝶形即可。
至此,我们成功完成了按时间抽选的基 2–FFT 算法的8点FFT。
一个模拟信号,经过 ADC 采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍(要满足奈奎斯特采样定律)。
现在ADC的采样率为Fs,对峰值为A的信号进行采样,采样点个数为N,我们得到的数字信号就是一个N点数数组。我们对其进行FFT变换,获得N点数FFT结果。(为了方便FFT 运算,通常 N 取 2 的整数次方)
现在我们必须知道FFT 变换结果的物理意义:
可以得出结论,采样时间越长,点数越多,分辨率越高。
但请注意要满足奈奎斯特采样定律(采样频率要大于信号
频率的两倍),当然实际应用中,往往高于两倍。
还记得我们计算信号频率时,是将0-Fs被分成了N份,而每个数组下标对应的频率是一个Fs/N的整数倍。
但是实际中没有这么巧合的情况,我们在进行离散化处理的时候,难免会出现截断。
对于频率为 fs 的正弦序列,它的频谱应该只是在 fs 处有离散谱。但是,在利用 DFT 求它的频谱做了截短,结果使信号的频谱不只是在 fs 处有离散谱,而是在以 fs 为中心的频带范围内都有谱线出现,它们可以理解为是从 fs 频率上“泄露”出去的,这种现象称 为频谱“泄露"。
所以在刚刚的图中,正弦的频谱应该是一条直线,但笔者却绘制了一个粗粗的刺,这就是频谱泄露的体现之一。
在实际问题中遇到的离散时间序列f(n)通常是无限长序列(前文提到的DTFT),因而处理这个序列的时候需要将它截断(计算器无法处理无限长序列)。截断相当于将序列乘以窗函数 w(n)。(时域中 f(n)和 w(n)相乘对应于频域中它们的离散傅立叶变换 F(jw)和 W(jw)的卷积)
为了减小频谱“泄露”的影响,往往在 FFT 处理中采用加窗技术,典型的加窗序列有 Hamming、Blackman、Gaussian 等窗序列。此外,增加窗序列的长度(增加采样个数)也可以减少频谱“泄露”。
基础知识补充链接——什么是窗函数?
时域上乘上窗函数,相当于频域进行卷积。长度为无穷长的常数窗函数,频域为 delta 函数,卷积后的结果和原来一样。窗的频谱,越像 delta 函数(主瓣越窄,旁瓣越小),频谱的还原度越高。加窗就不可避免频谱泄漏,典型的加权序列有 Hamming、Blackman、Gaussian 等窗序列主要是为了降低降低旁瓣,对于降低频谱泄漏效果远不如增加窗序列的长度明显。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。