文章目录
一、线性卷积
线性卷积(linear convolution)是在时域描述线性系统输入和输出之间关系的一种运算。
1. 应用背景
对于线性时不变离散时间系统来说,若序列 x ( n ) x(n) x(n)是系统的输入, h ( n ) h(n) h(n)是系统在单位脉冲作用下的单位脉冲响应,由于输入离散时间序列 x ( n ) x(n) x(n)可表示为一系列脉冲的线性组合,根据线性系统的齐次性和可加性, x ( n ) x(n) x(n)作用于系统所引起的零状态响应 y ( n ) y(n) y(n)就是序列 x ( n ) x(n) x(n)与 h ( n ) h(n) h(n)的卷积和。
2. 定义式
y ( n ) = x ( n ) ∗ h ( n ) = ∑ k = − ∞ ∞ x ( k ) h ( n − k ) y(n)=x(n)*h(n)=\sum_{k=-∞}^{∞}x(k)h(n-k) y(n)=x(n)∗h(n)=k=−∞∑∞x(k)h(n−k)
上式在运算过程中存在序列的翻转、移位、相乘和相加,所以称为卷积和。
3. 计算方法
3.1 定义式
3.2 作图法
- 步骤:
(1)将序列
x
(
n
)
x(n)
x(n)、
h
(
n
)
h(n)
h(n)的自变量用
k
k
k代换,然后将序列
h
(
k
)
h(k)
h(k)以纵坐标为轴线反转,成为
h
(
−
k
)
h(-k)
h(−k);
(2)序列
h
(
−
k
)
h(-k)
h(−k)沿
k
k
k轴正方向平移
n
n
n个单位,成为
h
(
n
−
k
)
h(n-k)
h(n−k);
(3)求乘积
x
(
k
)
h
(
n
−
k
)
x(k)h(n-k)
x(k)h(n−k);
(4)按定义式求各乘积之和。
3.3 列表法
由 y ( n ) = x ( n ) ∗ h ( n ) = ∑ k = − ∞ ∞ x ( k ) h ( n − k ) y(n)=x(n)*h(n)=\sum_{k=-∞}^{∞}x(k)h(n-k) y(n)=x(n)∗h(n)=k=−∞∑∞x(k)h(n−k)可见,求和符号内 x ( k ) x(k) x(k)的序号 k k k与 h ( n − k ) h(n-k) h(n−k)的序号 n − k n-k n−k之和`恰好等于 k k k。
沿斜线上各数值之和就是卷积和。
二、循环卷积
1. 序列的循环移位
设
x
(
n
)
x(n)
x(n)为有限长序列,长度为M,M≤N,则
x
(
n
)
x(n)
x(n)的循环移位定义为:
y
(
n
)
=
x
(
(
n
+
m
)
)
N
R
N
(
n
)
y(n)=x\big((n+m)\big)_N R_N(n)
y(n)=x((n+m))NRN(n)
该式表明,将
x
(
n
)
x(n)
x(n)以N为周期进行周期延拓得到
x
~
(
n
)
=
x
(
(
n
)
)
N
\tilde{x}(n)=x\big((n)\big)_N
x~(n)=x((n))N,再将
x
~
(
n
)
\tilde{x}(n)
x~(n)左移m得到
x
~
(
n
+
m
)
=
x
(
(
n
+
m
)
)
N
\tilde{x}(n+m)=x\big((n+m)\big)_N
x~(n+m)=x((n+m))N,最后取
x
~
(
n
+
m
)
\tilde{x}(n+m)
x~(n+m)的主值序列则得到有限长序列
x
(
n
)
x(n)
x(n)的循环移位序列
y
(
n
)
y(n)
y(n)。
y
(
n
)
y(n)
y(n)是长度为N的有限长序列。
2. 循环卷积的定义
设序列 h ( n ) h(n) h(n)和 x ( n ) x(n) x(n)的长度分别为N和M, h ( n ) h(n) h(n)与 x ( n ) x(n) x(n)的L点循环卷积定义为:
y c ( n ) = [ ∑ m = 0 L − 1 h ( m ) x ( ( n − m ) ) L ] R L ( n ) y_c(n)=\Big[\sum_{m=0}^{L-1}h(m)x\big((n-m)\big)_L\Big]R_L(n) yc(n)=[m=0∑L−1h(m)x((n−m))L]RL(n)
式中,L称为循环卷积区间长度, L ≥ m a x [ N , M ] L≥max[N,M] L≥max[N,M], x ( ( n − m ) ) L x\big((n-m)\big)_L x((n−m))L是以L为周期的周期信号,n和m的变化区间均是 [ 0 , L − 1 ] [0,L-1] [0,L−1]。
因此直接计算该式比较麻烦,计算机中采用矩阵相乘或FFT的方法计算循环卷积。
3. 用矩阵计算循环卷积的公式
当 n = 0 , 1 , 2 , ⋯ , L − 1 n=0,1,2,\cdots,L-1 n=0,1,2,⋯,L−1时,由 x ( n ) x(n) x(n)形成的序列为 { x ( 0 ) , x ( 1 ) , x ( 2 ) , ⋯ , x ( L − 1 ) } \{x(0),x(1),x(2),\cdots,x(L-1)\} {x(0),x(1),x(2),⋯,x(L−1)}。
令
n
=
0
,
m
=
0
,
1
,
2
,
⋯
,
L
−
1
n=0,m=0,1,2,\cdots,L-1
n=0,m=0,1,2,⋯,L−1,
x
(
(
n
−
m
)
)
L
x\big((n-m)\big)_L
x((n−m))L形成的序列为:
{
x
(
(
0
)
)
L
,
x
(
(
−
1
)
)
L
,
x
(
(
−
2
)
)
L
,
⋯
,
x
(
(
−
L
+
1
)
)
L
}
=
{
x
(
0
)
,
x
(
L
−
1
)
,
x
(
L
−
2
)
,
⋯
,
x
(
1
)
}
\begin{aligned} &\{x((0))_L,x((-1))_L,x((-2))_L,\cdots,x((-L+1))_L\}\\ &=\{x(0),x(L-1),x(L-2),\cdots,x(1)\} \end{aligned}
{x((0))L,x((−1))L,x((−2))L,⋯,x((−L+1))L}={x(0),x(L−1),x(L−2),⋯,x(1)}
与序列
x
(
n
)
x(n)
x(n)进行对比,相当于将第一个序列值
x
(
0
)
x(0)
x(0)保持不变,将后面的序列
{
x
(
1
)
,
x
(
2
)
,
⋯
,
x
(
L
−
1
)
}
\{x(1),x(2),\cdots,x(L-1)\}
{x(1),x(2),⋯,x(L−1)}反转180°再放到
x
(
0
)
x(0)
x(0)的后面。这样形成的序列称为
x
(
n
)
x(n)
x(n)的循环倒相序列。
令
n
=
1
,
m
=
0
,
1
,
2
,
⋯
,
L
−
1
n=1,m=0,1,2,\cdots,L-1
n=1,m=0,1,2,⋯,L−1,
x
(
(
n
−
m
)
)
L
x\big((n-m)\big)_L
x((n−m))L形成的序列为:
{
x
(
(
1
)
)
L
,
x
(
(
0
)
)
L
,
x
(
(
−
1
)
)
L
,
⋯
,
x
(
(
−
L
+
2
)
)
L
}
=
{
x
(
1
)
,
x
(
0
)
,
x
(
L
−
1
)
,
⋯
,
x
(
2
)
}
\begin{aligned} &\{x((1))_L,x((0))_L,x((-1))_L,\cdots,x((-L+2))_L\}\\ &=\{x(1),x(0),x(L-1),\cdots,x(2)\} \end{aligned}
{x((1))L,x((0))L,x((−1))L,⋯,x((−L+2))L}={x(1),x(0),x(L−1),⋯,x(2)}
观察上式等号右端序列,它相当于
x
(
n
)
x(n)
x(n)的循环倒相序列向右循环移一位,即向右移1位,移出区间
[
0
,
L
−
1
]
[0,L-1]
[0,L−1]的序列值再从左边移进。
依次类推,当 n 和 m 均从 0 变化到 L-1 时,得到一个关于
x
(
(
n
−
m
)
)
L
x((n-m))_L
x((n−m))L的矩阵:
[
x
(
0
)
x
(
L
−
1
)
x
(
L
−
2
)
⋯
x
(
1
)
x
(
1
)
x
(
0
)
x
(
L
−
1
)
⋯
x
(
2
)
x
(
2
)
x
(
1
)
x
(
0
)
⋯
x
(
3
)
⋮
⋮
⋮
⋮
⋮
x
(
L
−
1
)
x
(
L
−
2
)
x
(
L
−
3
)
⋯
x
(
0
)
]
\begin{bmatrix} x(0) & x(L-1) & x(L-2)& \cdots& x(1)\\ x(1)& x(0) & x(L-1) & \cdots & x(2)\\ x(2)&x(1)& x(0) & \cdots & x(3)\\ \vdots& \vdots &\vdots &\vdots& \vdots \\ x(L-1)&x(L-2)& x(L-3)& \cdots & x(0)\\ \end{bmatrix}
⎣⎢⎢⎢⎢⎢⎡x(0)x(1)x(2)⋮x(L−1)x(L−1)x(0)x(1)⋮x(L−2)x(L−2)x(L−1)x(0)⋮x(L−3)⋯⋯⋯⋮⋯x(1)x(2)x(3)⋮x(0)⎦⎥⎥⎥⎥⎥⎤
上面矩阵称为x(n)的L点“循环卷积矩阵”,其特点是:
- 第一行是序列 { x ( 0 ) , x ( 1 ) , x ( 2 ) , ⋯ , x ( L − 1 ) } \{x(0),x(1),x(2),\cdots,x(L-1)\} {x(0),x(1),x(2),⋯,x(L−1)}的循环倒相序列。注意,如果 x ( n ) x(n) x(n)的长度M<L,则需要在 x ( n ) x(n) x(n)末尾补 L-M 个零后,再形成第一行的循环倒相序列;
- 第一行以后的各行均是前一行向右循环移1位形成的;
- 矩阵的各主对角线上的序列值均相等。
有了循环卷积矩阵,就可以写出计算循环卷积的矩阵形式:
[ y c ( 0 ) y c ( 1 ) y c ( 2 ) ⋮ y c ( L − 1 ) ] = [ x ( 0 ) x ( L − 1 ) x ( L − 2 ) ⋯ x ( 1 ) x ( 1 ) x ( 0 ) x ( L − 1 ) ⋯ x ( 2 ) x ( 2 ) x ( 1 ) x ( 0 ) ⋯ x ( 3 ) ⋮ ⋮ ⋮ ⋮ ⋮ x ( L − 1 ) x ( L − 2 ) x ( L − 3 ) ⋯ x ( 0 ) ] [ h ( 0 ) h ( 1 ) h ( 2 ) ⋮ h ( L − 1 ) ] \begin{bmatrix} y_c(0)\\ y_c(1)\\ y_c(2)\\ \vdots\\ y_c(L-1)\\ \end{bmatrix} =\begin{bmatrix} x(0) & x(L-1) & x(L-2)& \cdots& x(1)\\ x(1)& x(0) & x(L-1) & \cdots & x(2)\\ x(2)&x(1)& x(0) & \cdots & x(3)\\ \vdots& \vdots &\vdots &\vdots& \vdots \\ x(L-1)&x(L-2)& x(L-3)& \cdots & x(0)\\ \end{bmatrix} \begin{bmatrix} h(0)\\ h(1)\\ h(2)\\ \vdots\\ h(L-1)\\ \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎡yc(0)yc(1)yc(2)⋮yc(L−1)⎦⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎡x(0)x(1)x(2)⋮x(L−1)x(L−1)x(0)x(1)⋮x(L−2)x(L−2)x(L−1)x(0)⋮x(L−3)⋯⋯⋯⋮⋯x(1)x(2)x(3)⋮x(0)⎦⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎡h(0)h(1)h(2)⋮h(L−1)⎦⎥⎥⎥⎥⎥⎤
上式中如果 h ( n ) h(n) h(n)的长度N<L,则需要在 h ( n ) h(n) h(n)末尾补上 L-N 个零。
三、线性卷积和循环卷积之间的关系
-
假设 h ( n ) h(n) h(n)和 x ( n ) x(n) x(n)都是有限长序列,长度分别为N和M。它们的线性卷积和循环卷积分别表示为:
y l ( n ) = h ( n ) ∗ x ( n ) = ∑ m = 0 N − 1 h ( m ) x ( n − m ) y_l(n)=h(n)*x(n)=\sum_{m=0}^{N-1}h(m)x(n-m) yl(n)=h(n)∗x(n)=m=0∑N−1h(m)x(n−m)
y c ( n ) = [ ∑ m = 0 L − 1 h ( m ) x ( ( n − m ) ) L ] R L ( n ) y_c(n)=\Big[\sum_{m=0}^{L-1}h(m)x\big((n-m)\big)_L\Big]R_L(n) yc(n)=[m=0∑L−1h(m)x((n−m))L]RL(n)
其中, L ≥ m a x [ N , M ] L≥max[N,M] L≥max[N,M], x ( ( n ) ) L = ∑ i = − ∞ ∞ x ( n + i L ) x((n))_L=\sum_{i=-∞}^{∞}x(n+iL) x((n))L=∑i=−∞∞x(n+iL)
所以 y c ( n ) = [ ∑ m = 0 N − 1 h ( m ) ∑ i = − ∞ ∞ x ( n − m + i L ) ] R L ( n ) = [ ∑ i = − ∞ ∞ ∑ m = 0 N − 1 h ( m ) x ( n + i L − m ) ] R L ( n ) \begin{aligned} y_c(n)&=\Big[\sum_{m=0}^{N-1}h(m)\sum_{i=-∞}^{∞}x(n-m+iL)\Big]R_L(n)\\ &=\Big[\sum_{i=-∞}^{∞}\sum_{m=0}^{N-1}h(m)x(n+iL-m)\Big]R_L(n) \end{aligned} yc(n)=[m=0∑N−1h(m)i=−∞∑∞x(n−m+iL)]RL(n)=[i=−∞∑∞m=0∑N−1h(m)x(n+iL−m)]RL(n)
与 y l ( n ) y_l(n) yl(n)式对照可以看出
∑ m = 0 N − 1 h ( m ) x ( n + i L − m ) = y l ( n + i L ) \sum_{m=0}^{N-1}h(m)x(n+iL-m)=y_l(n+iL) m=0∑N−1h(m)x(n+iL−m)=yl(n+iL)
即 y c ( n ) = [ ∑ i = − ∞ ∞ y l ( n + i L ) ] R L ( n ) y_c(n)=\Big[\sum_{i=-∞}^{∞}y_l(n+iL)\Big]R_L(n) yc(n)=[i=−∞∑∞yl(n+iL)]RL(n)
也就是说, y c ( n ) y_c(n) yc(n)等于 y l ( n ) y_l(n) yl(n)以L为周期的周期延拓序列的主值序列。 -
线性卷积与循环卷积相等的条件
-
y l ( n ) y_l(n) yl(n)的长度为N+M-1,因此只有当循环卷积长度L≥N+M-1时, y l ( n ) y_l(n) yl(n)以L为周期进行周期延拓时才无时域混叠现象,此时取其主值序列显然满足 y c ( n ) = y l ( n ) y_c(n)=y_l(n) yc(n)=yl(n)。
-
由此说明了循环卷积等于线性卷积的条件是L≥N+M-1。
四、用DFT计算循环卷积
设
h
(
n
)
h(n)
h(n)和
x
(
n
)
x(n)
x(n)的长度分别为N和M,其L点循环卷积为
y
c
(
n
)
=
[
∑
m
=
0
L
−
1
h
(
m
)
x
(
(
n
−
m
)
)
L
]
R
L
(
n
)
y_c(n)=\Big[\sum_{m=0}^{L-1}h(m)x\big((n-m)\big)_L\Big]R_L(n)
yc(n)=[m=0∑L−1h(m)x((n−m))L]RL(n)
且
{
H
(
k
)
=
D
F
T
[
h
(
n
)
]
L
X
(
k
)
=
D
F
T
[
x
(
n
)
]
L
0
≤
k
≤
L
−
1
,
L
≥
m
a
x
[
N
,
M
]
\begin{cases} H(k)=DFT[h(n)]_L\\ X(k)=DFT[x(n)]_L \end{cases}\qquad 0\leq k \leq L-1,L≥max[N,M]
{H(k)=DFT[h(n)]LX(k)=DFT[x(n)]L0≤k≤L−1,L≥max[N,M]
则由DFT的时域循环卷积定理有
Y
c
(
k
)
=
D
F
T
[
y
c
(
n
)
]
L
=
H
(
k
)
X
(
k
)
0
≤
k
≤
L
−
1
Y_c(k)=DFT[y_c(n)]_L=H(k)X(k) \qquad 0\leq k \leq L-1
Yc(k)=DFT[yc(n)]L=H(k)X(k)0≤k≤L−1
由此可见,循环卷积既可以在时域直接计算,也可以按照下面的计算框图在频域计算。
由于DFT有快速算法,当L很大时,在频域计算循环卷积的速度快得多,因而常用DFT(FFT)计算循环卷积。
DFT只能直接用来计算循环卷积,然而在实际应用中,为了分析时域离散线性时不变系统或者对序列进行滤波处理等,需要计算两个序列的线性卷积。与计算循环卷积一样,为了提高运算速度,也希望用DFT(FFT)计算线性卷积。
五、用DFT计算线性卷积
取L≥N+M-1,则可按照上述框图用DFT(FFT)计算线性卷积。
六、MATLAB实现
1. 利用MATLAB的conv()函数计算线性卷积
% x1的长度N=5,x2的长度M=3,那么x1与x2线性卷积的输出序列长度L=N+M-1=7
% 可以验证,输出结果与我们使用列表法得到的结果一致
x1=[1,1,3,4,2];
x2=[1,3,2];
y=conv(x1,x2);
2. 利用矩阵相乘原理计算循环卷积
function [y] = circle_convolution(x1,x2,L)
% circle_convolution 函数用于计算两个有限长序列的L点循环卷积
% x1: 长度为N的有限长序列
% x2: 长度为M的有限长序列
% L: 循环卷积的长度
% y: x1与x2的L点循环卷积结果,L≥max(N,M);
%********** 构造L点循环卷积矩阵 **********%
N=length(x1);
M=length(x2);
x_1=[x1 ,zeros(1,L-N)] ;
x_2=[x2 ,zeros(1,L-M)] ;
x=zeros(L,L);
h=circshift ( fliplr (x_1) ,1); % 得到x1(n)的循环倒相序列
for i=0:L-1
x(i+1,:)= circshift(h,i); % x即为L点循环卷积矩阵
end
%********** 矩阵相乘计算循环卷积 **********%
x_2=x_2'; % 将补零后的x2转置为列向量
y=x*x_2; % 矩阵相乘
end
% 调用circle_convolution函数计算循环卷积
x1=[1,1,3,4,2];
x2=[1,3,2];
L=7;
y=circle_convolution(x1,x2,L);
当L=9时,结果为:
当L=5时,结果为:这里也进一步验证了线性卷积和循环卷积的关系:
(1) 当L<N+M-1时,循环卷积是线性卷积长度为L的混叠;
(2) 当L=N+M-1时,循环卷积=线性卷积;
(3) 当L>N+M-1时,循环卷积是线性卷积末尾补L-(N+M-1)个零;
3. 调用fft()函数计算循环卷积与线性卷积
% 5点DFT
x1=[1,1,3,4,2];
x2=[1,3,2];
X1=fft(x1,5);
X2=fft(x2,5);
Y=X1.*X2;
y=ifft(Y);
% 7点DFT
x1=[1,1,3,4,2];
x2=[1,3,2];
X1=fft(x1,7);
X2=fft(x2,7);
Y=X1.*X2;
y=ifft(Y);
% 9点DFT
x1=[1,1,3,4,2];
x2=[1,3,2];
X1=fft(x1,9);
X2=fft(x2,9);
Y=X1.*X2;
y=ifft(Y);