1.圆周卷积(circular convolution)
圆周卷积,也叫循环卷积,两个长度为N的有限场序列 x ( n ) x(n) x(n)和 h ( n ) h(n) h(n)的循环卷积定义为
即循环卷积相当于周期延拓后的序列 x ~ ( n ) \widetilde{x}(n) x (n)和 h ~ ( n ) \widetilde{h}(n) h (n)做周期卷积后再取主值区间,若x(n)和h(n)的离散傅里叶变换为 X ( K ) X(K) X(K)和 H ( K ) H(K) H(K),则有
即时域中的循环卷积对应于其离散傅里叶变换的乘积,循环卷积的结果y(n)长度为N
关于圆周卷积的计算,可以看另一篇的图解计算
2.线性卷积(linear convolution)
通常所说的卷积就是指线性卷积,设x(n)、h(n)长度分别为M和N,则它们的线性卷积结果为
得到的y(n)长度为M+N-1,同样,根据卷积定理可以知道,时域卷积等于频域相乘
注意,现在只是频域DTFT相乘相等,而离散傅里叶变换相乘并不相等,DFT是在DTFT基础上再进行了频域采样,即对
ω
\omega
ω 离散化。
要让线性卷积的时域结果与频域相乘的逆变换相等,首先容易想到的就是对H(
ω
\omega
ω )和X(
ω
\omega
ω)做相同的频域采样,也就是对x(n)、h(n)做相同点数的DFT,即让两序列在时域做圆周卷积,那么现在问题是,做多少点数的DFT能让圆周卷积等于线性卷积呢?
线性卷积最常见,直接套用公式计算,这里就不图解。
结论:利用循环卷积计算线性卷积的条件为循环卷积长度
L
⩾
M
+
N
−
1
L\geqslant M+N-1
L⩾M+N−1。
利用循环卷积计算线性卷积的具体步骤为:
1. 将序列
x
(
n
)
x(n)
x(n)和
h
(
n
)
h(n)
h(n)补零延长,使其长度
L
⩾
N
1
=
N
+
M
−
1
L\geqslant N_1 = N+M-1
L⩾N1=N+M−1,若采用基-2 FFT,还应使
L
L
L为不小于
N
1
N_1
N1的2的最小整数次幂;
2. 做
x
(
n
)
x(n)
x(n)和
h
(
n
)
h(n)
h(n)的长度为
L
L
L的FFT得到
X
(
k
)
X(k)
X(k)和
H
(
k
)
H(k)
H(k),并求它们的积
Y
(
k
)
=
X
(
k
)
H
(
k
)
Y(k) = X(k)H(k)
Y(k)=X(k)H(k);
3. 求
Y
(
k
)
Y(k)
Y(k)的iFFT并取前
N
1
N_1
N1点,获得线性卷积的结果
y
(
n
)
=
I
F
F
T
[
Y
(
k
)
]
,
0
⩽
n
⩽
N
1
y(n) = IFFT[Y(k)],0\leqslant n\leqslant N_1
y(n)=IFFT[Y(k)],0⩽n⩽N1
说的好像很简单的样子,那就用代码验证下
x1 = [1,7,8,9,5,4,6,3,2];
x2 = [5,8,9,6,3,4,8,2,1,7,5,6,7];
conv(x1,x2)
# 5 43 105 178 214 214 221 246 242 213 190 193 231 225 191 162 112 93 70 33 14
L = 13;
ifft(fft(x1,L).*fft(x2,L))
# 230 234 267 290 307 284 254 260 242 213 190 193 231
上面程序中x1的长度为9,x2的长度为13,用matlab的conv函数直接计算出时域线性卷积,然后我们再验证下频域相乘,改变L值使分别L=13、21、23看看,与conv的结果对比,可以验证,只有当L>=9+13 -1时才会得到与conv一样的结果。这里也记一下结论:
- 当圆周卷积长度 L > = N + M − 1 时 L>=N + M - 1时 L>=N+M−1时,没有混叠,圆周卷积的前 N + M − 1 N + M - 1 N+M−1个值为有效值,且与线性卷积相同
- 当圆周卷积长度 L < N + M − 1 时 L<N + M - 1时 L<N+M−1时,产生混叠,圆周卷积的前 ( N + M − 1 ) − L (N+M-1) - L (N+M−1)−L个值有混叠,因此只有后 ∣ L − ( ( N + M − 1 ) − L ) ∣ = ∣ 2 L − ( N + M − 1 ) ∣ |L - ((N+M-1) - L)| = |2L-(N+M−1)| ∣L−((N+M−1)−L)∣=∣2L−(N+M−1)∣ 是有效值,
画一个简单示意图说明一下
- 为什么会产生混叠?
根据圆周卷积的定义,是周期信号卷积后再取主值区间,如下图,蓝框为x(n)以圆周卷积点数L为周期延拓后的信号,绿框为卷积核,当 L > = N + M − 1 L>=N+M-1 L>=N+M−1时,卷积核从左至右移动整过过程都不会与[-L, 0]、[L,2L]的周期接触,因此计算出来的结果就是与线性卷积结果相同的,没有混叠产生
而当圆周卷积点数 L < N + M − 1 L<N+M-1 L<N+M−1时,如第二行的图,卷积核会与[-L, 0]周期的信号接触,因此计算出来的值就是有混叠的 - 为什么混叠值只出现在前面,且后面没有?
还是上面的解释,卷积核会与[-L, 0]周期的信号接触,因此计算出来的前面值是有混叠的,而圆周卷积限定了只计算L点的值,也就是卷积核只会从左往右移动L各点,因此不会与[L,2L]]周期的信号接触,也就是后面的值没混叠
那为什么要讲线性卷积转化为循环卷积呢,那是因为时域中的循环卷积对应于其离散傅里叶变换的乘积,在两个卷积项非常长且长度相差不大时,转换到频域利用FFT计算量会大大减小。
当两个卷积项长度相差很大时,又该怎么办呢,这又引出了下一个问题,重叠相加法与重叠保留法