ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

信号处理--线性卷积与循环卷积

2020-12-06 20:01:27  阅读:447  来源: 互联网

标签:卷积 DFT 信号处理 -- cdots 循环 序列 x1


文章目录

一、线性卷积

线性卷积(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))N​RN​(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−1​h(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点“循环卷积矩阵”,其特点是:

  1. 第一行是序列 { 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 个零后,再形成第一行的循环倒相序列;
  2. 第一行以后的各行均是前一行向右循环移1位形成的;
  3. 矩阵的各主对角线上的序列值均相等。

有了循环卷积矩阵,就可以写出计算循环卷积的矩阵形式:

[ 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−1​h(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−1​h(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−1​h(m)i=−∞∑∞​x(n−m+iL)]RL​(n)=[i=−∞∑∞​m=0∑N−1​h(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−1​h(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−1​h(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)]L​X(k)=DFT[x(n)]L​​0≤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);

5点循环卷积

% 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);

在这里插入图片描述

标签:卷积,DFT,信号处理,--,cdots,循环,序列,x1
来源: https://blog.csdn.net/qq_45732223/article/details/110526379

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有