在进行信号处理的时候,我们经常会对时域或频域的数据进行补零操作,有在数据前/后补零的,也有在采样点中间补零的。那这些不同的补零方式本质上有什么差异呢?我们又该如何在合适的时候补上合适的零呢?本文告诉你。
现实世界遇到的信号是连续的,但是电脑能处理的信号必须是离散化的。所以需要利用ADC对连续信号进行离散化。离散化的过程本质上是采样的过程,即每隔一段时间从原来的连续信号中取出一个点。采样过程的示意图如下。虽然我们采样得到的是一系列代表波形幅度的值,但是需要明确的是,每一个幅度值其实都绑定了一个采样时刻,设采样间隔为
Δ
T
\Delta T
ΔT,则第一个幅度值的采样时刻为0,第2个幅度值的采样时刻为
Δ
T
\Delta T
ΔT,第
n
n
n个幅度值的采样时刻为
(
n
−
1
)
Δ
T
(n-1)\Delta T
(n−1)ΔT。
后面的补零操作均是在上图中的红色采样点基础上进行的。
(1) 波形首尾补零
如上图所示,在原始采样波形的后面补上一串零值。设原始采样序列为 s = [ s 0 , s 1 , . . . , s N − 1 ] \mathbf{s}=[s_0,s_1,...,s_{N-1}] s=[s0,s1,...,sN−1], 对应的采样时刻为 0 , Δ T , . . . , ( N − 1 ) Δ T 0,\Delta T,...,(N-1)\Delta T 0,ΔT,...,(N−1)ΔT。补零后的序列为 s ′ = [ s 0 , s 1 , . . . , s N − 1 , 0 , 0 , . . , 0 ] \mathbf{s'}=[s_0,s_1,...,s_{N-1},0,0,..,0] s′=[s0,s1,...,sN−1,0,0,..,0],对应的采样时刻为 0 , Δ T , . . . , ( N − 1 ) Δ T , N Δ T , . . . , ( N + M ) Δ T 0,\Delta T,...,(N-1)\Delta T,N\Delta T,...,(N+M)\Delta T 0,ΔT,...,(N−1)ΔT,NΔT,...,(N+M)ΔT,其中 M M M为补零的个数。显现上述补零方式,并未增加关于波形的任何有效信息,但是相当于增加了采样时间。它的效果是提高了频谱的计算分辨率,等效于对频谱进行了插值。详细推导和分析过程可见《FFT变换中的两种分辨率(物理分辨率和计算分辨率)》
若将上图中的补的零值放到波形的起始位置,其等效效果与放在波形末尾并无差异,都是提高了波形的计算分辨率。差异在于将零补在前面等效于对波形进行延迟,将在频谱中叠加一个固定的相移。
(2) 波形中间补零
如下图所示,设原始采样序列(图中红点)为
s
=
[
s
0
,
s
1
,
.
.
.
,
s
N
−
1
]
\mathbf{s}=[s_0,s_1,...,s_{N-1}]
s=[s0,s1,...,sN−1], 对应的采样时刻为
0
,
Δ
T
,
.
.
.
,
(
N
−
1
)
Δ
T
0,\Delta T,...,(N-1)\Delta T
0,ΔT,...,(N−1)ΔT。则补零后的序列(图中x点)为
s
′
=
[
s
0
,
0
,
0
,
s
1
,
0
,
0
,
.
.
.
,
0
,
0
,
s
N
−
1
]
\mathbf{s'}=[s_0,0,0,s_1,0,0,...,0,0, s_{N-1}]
s′=[s0,0,0,s1,0,0,...,0,0,sN−1],对应的采样时刻为
0
,
1
3
Δ
T
,
2
3
Δ
T
,
Δ
T
,
.
.
.
,
(
N
−
1
)
Δ
T
−
2
3
Δ
T
,
(
N
−
1
)
Δ
T
−
1
3
Δ
T
,
(
N
−
1
)
Δ
T
0,\frac{1}{3}\Delta T, \frac{2}{3}\Delta T, \Delta T,...,(N-1)\Delta T - \frac{2}{3}\Delta T,(N-1)\Delta T - \frac{1}{3}\Delta T,(N-1)\Delta T
0,31ΔT,32ΔT,ΔT,...,(N−1)ΔT−32ΔT,(N−1)ΔT−31ΔT,(N−1)ΔT。显然,这种补零方式并没有改变采样采样时长,它改变的是采样间隔,使得采样间隔变小,等效于提高了采样率。
从上面的分析可知,在采样点中间进行插值,等效于提高了系统采样率。显然,采样率提高,排除存储深度和计算量的考虑,终归是一件好事。但是很多人会好奇:从上面的示意图来看补零之后的波形完全和理想的波形不一致了,那补零还有什么意义呢?要达到提高采样率的目的还有很多其他插值方法可用,比如最简单的线性插值。线性插值再不济,它至少也是利用了前后采样点的信息,不像补零操作一样什么都不考虑,显得那么粗暴。那为什么补零插值这种操作还大行其道呢?确实,如果对波形的操作止步于此,那补零操作确实没有多大价值,但是我们通常会在补零操作后面接一个低通滤波器,这个时候补零操作相对于其他插值的优势就体现出来了,且听我慢慢道来!
将图3所示场景进行一般化处理,设补零前的序列为
x
[
m
]
,
0
≤
m
<
M
x[m],0\leq m<M
x[m],0≤m<M,在每两个采样点中间补上
a
−
1
a-1
a−1个零,则补零后的序列长度为
N
=
a
M
N=aM
N=aM,补零前后序列的关系为
x
′
[
n
]
=
{
x
[
n
/
a
]
,
m
o
d
(
n
,
a
)
=
0
0
,
o
t
h
e
r
s
,
0
≤
n
<
N
x'[n]= \left\{\begin{matrix} x[n/a], mod(n,a)=0 \\ 0,others \end{matrix}\right. ,0\leq n<N
x′[n]={x[n/a],mod(n,a)=00,others,0≤n<N
补零前的频谱为:
X
[
k
]
=
∑
m
=
0
M
−
1
x
[
m
]
e
x
p
(
−
j
2
π
M
k
m
)
,
0
≤
k
<
M
(1)
X[k]=\sum_{m=0}^{M-1}x[m]exp(-j\frac{2\pi}{M}km),0\leq k<M \tag{1}
X[k]=m=0∑M−1x[m]exp(−jM2πkm),0≤k<M(1)
补零后信号频谱可表示为:
X
′
[
k
]
=
∑
n
=
0
N
−
1
x
′
[
n
]
e
x
p
(
−
j
2
π
N
k
n
)
=
∑
m
=
0
M
−
1
x
[
m
]
e
x
p
(
−
j
2
π
N
k
a
m
)
=
∑
m
=
0
M
−
1
x
[
m
]
e
x
p
(
−
j
2
π
a
M
k
a
m
)
=
∑
m
=
0
M
−
1
x
[
m
]
e
x
p
(
−
j
2
π
M
k
m
)
,
0
≤
k
<
N
−
1
(2)
X'[k]=\sum_{n=0}^{N-1}x'[n]exp(-j\frac{2\pi}{N}kn)=\sum_{m=0}^{M-1}x[m]exp(-j\frac{2\pi}{N}kam)=\sum_{m=0}^{M-1}x[m]exp(-j\frac{2\pi}{aM}kam)\\=\sum_{m=0}^{M-1}x[m]exp(-j\frac{2\pi}{M}km),0\leq k<N-1 \tag{2}
X′[k]=n=0∑N−1x′[n]exp(−jN2πkn)=m=0∑M−1x[m]exp(−jN2πkam)=m=0∑M−1x[m]exp(−jaM2πkam)=m=0∑M−1x[m]exp(−jM2πkm),0≤k<N−1(2)
在式(2)中,令
k
=
i
M
+
k
′
,
0
≤
i
<
a
,
0
≤
k
′
<
M
k=iM+k',0\leq i<a,0\leq k'<M
k=iM+k′,0≤i<a,0≤k′<M,将其带入可得
X
′
[
k
]
=
X
′
[
i
M
+
k
′
]
=
X
′
[
i
,
k
′
]
=
∑
m
=
0
M
−
1
x
[
m
]
e
x
p
(
−
j
2
π
M
(
i
M
+
k
′
)
m
)
=
∑
m
=
0
M
−
1
x
[
m
]
e
x
p
(
−
j
2
π
i
m
)
e
x
p
(
−
j
2
π
M
k
′
m
)
=
∑
m
=
0
M
−
1
x
[
m
]
e
x
p
(
−
j
2
π
M
k
′
m
)
=
X
[
k
′
]
(3)
X'[k]=X'[iM+k']=X'[i,k']=\sum_{m=0}^{M-1}x[m]exp(-j\frac{2\pi}{M}(iM+k')m)\\=\sum_{m=0}^{M-1}x[m]exp(-j2\pi i m)exp(-j\frac{2\pi}{M}k'm)=\sum_{m=0}^{M-1}x[m]exp(-j\frac{2\pi}{M}k'm)=X[k']\tag{3}
X′[k]=X′[iM+k′]=X′[i,k′]=m=0∑M−1x[m]exp(−jM2π(iM+k′)m)=m=0∑M−1x[m]exp(−j2πim)exp(−jM2πk′m)=m=0∑M−1x[m]exp(−jM2πk′m)=X[k′](3)
从上面的表达式可知补零后的频谱是表现为补零前的频谱的周期延拓。下图以中间补一个0的场景说明补零前后的频谱情况。补零前的频谱以原始采样率
f
s
f_s
fs为周期进行左右延拓。在原始两个采样点中间插入一个0值,采样率提高为原来的2倍,此时如图中阴影区域所示,在新的采样率范围内,把原来
f
s
−
2
f
s
f_s-2f_s
fs−2fs范围内的频率成分也包含进去了,导致时域波形变形。(这边需要说明一下的是,在很多教科书里面说插值会导致信号频谱的压缩,这是在归一化频率(相对于采样率)的角度上说的,比如插值前信号的频率范围为0~10Hz,插值后信号的频率范围仍然为0-10Hz,这是不会发生变化的。但插值使得采样率提升为原来的
K
K
K倍,则插值前后信号频率相对于采样率的比值则缩小为原来的
1
/
K
1/K
1/K)。此时,若能设计一个低通滤波器把多余的频率成分滤掉,则理论上可以无误差地恢复出原始信号。从这里其实就能看出利用补零进行插值的妙处了:补零插值仅仅会造成频谱的周期延拓,并不会改变频谱的形态,所以通过合适的滤波器设计,理论上可以将插值后的信号无误差地恢复出来。
关于其他插值方式的详细描述,见下一篇博客!!!