单位脉冲

        

python如何画脉冲函数 脉冲函数怎么读_convolution

函数(读作delta函数):delta函数也叫脉冲函数,如下图所示,他是一个脉冲序列,他只在0点处等于1,其他地方都为0。(有些地方也叫单位脉冲函数)

python如何画脉冲函数 脉冲函数怎么读_信号与系统_02

         他可以把任意一个N点的离散信号分解为N个子信号的和,每个子信号都是一个N点的脉冲信号。我们把这种信号的分解方式叫做信号的脉冲分解

python如何画脉冲函数 脉冲函数怎么读_卷积_03

 注意,图中所示的每一个脉冲信号都是一个“移动了的,且对单位脉冲的幅值进行了相应调整的

python如何画脉冲函数 脉冲函数怎么读_convolution

函数”。把这些分解后的子信号加在一起,就能得到原始信号。

冲击响应就是滤波器

        有了对信号的脉冲分解以后,我们就能对离散信号进行处理了:首先把输入信号分解成一个个脉冲子信号,然后再分别对这些子信号做相同的处理,最后把所有的处理结果加在一起就能得到最终的输出结果了。

        而每一个脉冲子信号的处理结果,就叫冲击响应。也就是说,对任何一个线性系统而言,当我们的输入信号是一个

python如何画脉冲函数 脉冲函数怎么读_convolution

函数,经过这个系统以后,输出的信号就是这个冲击函数对这个系统的响应,用h[n]来表示。

        

python如何画脉冲函数 脉冲函数怎么读_python如何画脉冲函数_06

        在不同的应用场景中,虽然我们使用的都是系统的冲激响应,但我们往往不会这么叫。而是叫他滤波器,卷积核(在信号处理中),或者是叫二维滤波器,二维卷积核,kernel,mask(在图像处理中)。 虽然叫法不同,但他们说的都是一个东西,即,输入是

python如何画脉冲函数 脉冲函数怎么读_convolution

函数时系统的输出。

卷积 

卷积的数学表达式: 

        就好像在数学中,加法让两个数相加得到了第三个数一样,在信号处理中,卷积,用两个信号合成了第三个信号。准确的说就是,系统的输出信号,等于输入信号和冲激响应的卷积。用数学公式来表示就是:

python如何画脉冲函数 脉冲函数怎么读_python如何画脉冲函数_08

        

python如何画脉冲函数 脉冲函数怎么读_数字信号处理_09

卷积的长度: 

        如果,输入信号x[n]的长度为M,冲击响应h[n]的长度为N,则输出信号的y[n]的长度L为:

L=M+N-1 

         正如前面提到的,在信号处理的领域中,大家很少会说冲激响应,而是说卷积核或者说的更多的滤波器

        下面举几个例子,说明卷积在信号处理中的应用,即,输出信号等于输入信号与冲激响应的卷积。

输入信号*冲激响应(滤波器)=输出信号,“ * ”表示卷积

      例如:

        下图中的输入信号是由正弦波的三个周期(高频部分)和一个缓慢上升的斜坡(低频部分)相加得到的,冲击响应(滤波器)则分别是一个低通滤波器和一个高通滤波器。可以看到,一个81个点的输入信号和一个31个点的低通滤波器卷积后,得到一个81+31-1=111点的输出信号,他把输入信号中的低频部分提取出来了。

python如何画脉冲函数 脉冲函数怎么读_convolution_10

        对于我们在上面提到的卷积公式,x[n]*h[n]=y[n],我们可以从两个角度来理解他,第一个角度,也是在型号与系统这一领域被广泛认可的理解方式,叫做从输入信号的角度来看卷积,而第二个角度,叫做从输出信号的角度来看卷积,这是一种单纯从数学计算公式的出发的视角。


Part I:

        这种看待卷积的视角是指,一次只对输入信号的一个点进行处理,得到每个输入点对应的冲击响应,最终把这些冲击响应叠加起来,得到最终的输出信号。

例子:

python如何画脉冲函数 脉冲函数怎么读_数字信号处理_11

         上图是一个9个点的输入信号X[n],通过和4个点的冲激响应h[n]卷积,得到了一个11个点的输出y[n]。从输入信号的角度来看卷积就是:首先是分解输入信号,把输入信号看成是一个个独立的脉冲信号,然后让这些输入信号分别通过系统,得到对应的输出,最终再把这些结果整合起来。其中,9个点的输入信号所拆分出来的每一个脉冲信号经过系统后的输出,都是一个经过一定移位和一定比例缩放后的冲击响应。将这些“改变后的”冲激响应都加起来,就是输出信号Y[n]。

        下图中显示了9个输入信号,分别作为脉冲信号经过系统后的冲击响应。注意,下图中除了X[0]和X[7]的输出为全零以外,其他输入的冲激响应的形状都很相似,因为他们都是(again)经过一定移位和一定比例缩放后的冲击响应(下图中用正方形表示,菱形表示输出信号中填充的0点)。

python如何画脉冲函数 脉冲函数怎么读_卷积_12

         对于图中的正中心的X[4]的输出而言,冲击响应h[n]变成了h[n-4],整个冲击响应向右移动了4位,同时,以x[4]为比例进行了缩放,也就是x[4]*h[n-4]。类似的还有x[3],x[5],x[6],又因为这些信号都是正数,所以他们的输出信号的波形和冲击响应h[n]大致一样。

        而,对于x[1],x[2]和x[8]而言,这些输入信号是负数,所以他们的输出波形是反的,是冲击响应的倒影。

        最后,对于输入x[0]和x[7]而言,因为输入是0,所以,最终输出的也是这个结果是四个全零的方块。

        把上述所9个位置不同,且形状也不同的冲击响应加在一起,就能得到最后的输出y[n].

python如何画脉冲函数 脉冲函数怎么读_convolution_13

卷积是可以交换的

        同样是从输入信号的角度来看卷积,对于刚才的例子,我们可以交换输入信号和冲击响应的位置,让原来的冲击响应h[n]作为输入x[n],让原来的输入信号x[n]作为冲击响应h[n],他的的输出结果是一样的。即:

python如何画脉冲函数 脉冲函数怎么读_卷积_14

        交换两者后的卷积如下图所示,注意,4个点的x[n]和9个点的h[n]卷积,得到了一个11个点的输出,这个结果和上面的一致。

python如何画脉冲函数 脉冲函数怎么读_信号与系统_15


Part II:

        在前一个视角中,我们关注的是输入信号中的每一个点通过系统后的响应。而从输出信号的角度看卷积,则是把注意力放在输出信号的每一个点上,分析一下当前输出信号中的某一点是输入信号中的哪些点经过系统后合成的

        

python如何画脉冲函数 脉冲函数怎么读_信号与系统_16

         我们以输出信号的点y[6]为例,如上图所示,我们可以把冲击响应h[n]看成是一个卷积器,当我们要计算y[6]的输出时,卷机器(宽度为4)正好移动到x[3]~x[6]的位置。他们分别与卷积器中的冲激响应相乘后,得到如下结果,其中只有方块处有值,其他菱形处的值都等于0。

python如何画脉冲函数 脉冲函数怎么读_convolution_17

         把这些结果加在一起的和,就是输出信号y[6]处的值。用数学公式来表示就是:

python如何画脉冲函数 脉冲函数怎么读_数字信号处理_18

        也就是说,输出信号y[6]是由x[3]~x[6]这四个输入信号确定的,如果我们要计算y[7]的输出,只需要把卷积器右移一位,卷积器就会计算x[4]~x[7]对y[7]的贡献。

         但这样一来也会遇到一些问题,比如说,当我们要计算y[0]处和y[8]处的值时,卷积器的一部分就会落在输入信号的外面,而那些位置的输入信号的值是未知的。比如说,当我们要计算y[0]点的值时,卷积器就需要x[-3],x[-2],x[-1],x[0]处的值,而,x[-3],x[-2],x[-1]处的值是不存在的。如下图所示:

python如何画脉冲函数 脉冲函数怎么读_python如何画脉冲函数_19

python如何画脉冲函数 脉冲函数怎么读_卷积_20

         解决这一问题的办法就是在输入信号x[n]中,人为的去添加对应数量的点,添加不同的值,就会对应不同的输出结果,一般情况下会用0来添加,叫做零填充。这样一来,当卷积器移动到信号边缘时,所接收到的就不再是一些不存在的信号,而是0。

        但这也只能解决部分问题,因为,为了保证卷积器可以正常使用,而添加的0点,是对位置信号的一种假设。所以,基于这些点所产生的输出是不准确的。如果冲击响应的长度为M,那么输出信号的前M-1个点和最后的M-1个点是都是不准确的。这种现象在信号处理中叫“末端效应”,在图像处理中叫“边界效应”。

 (全文完)

作者 --- 松下J27

参考文献(鸣谢):

1,实用数字信号处理 --- 从原理到应用.

2,The Scientist and Engineer's Guide to DSP, Second Edition --- Steven W.Smith

格言摘抄:

日月之行,若出其中;
星汉灿烂,若出其里。

--- 曹丞相

python如何画脉冲函数 脉冲函数怎么读_convolution_21