数字信号处理知识点总结(一):卷积
本篇文章旨在详细阐述卷积的作用及其在计算机领域中从两个不同维度探讨了卷积在处理输入数据时所采用的不同方法:输入端算法 与 输出端算法。
目录
-
- 1. 冲激响应与卷积
- 2. 输入端算法
- 3. 输出端算法
1. 冲激响应与卷积
冲击响应被定义为输入信号施加δ函数时系统的输出反应;它通常用于表征线性系统的动态特性。具体而言,在不同领域中对这一现象的称呼有所差异:当系统是滤波器类型时,其冲击反应常被称为滤波器内核或卷积核;而在图像处理领域则统称为点扩散函数。
那么冲激响应与卷积之间存在怎样的关联呢?
通过分析系统的输入与输出之间的关系可以看出 冲激响应本质上是系统中各权值参数的集合 在处理过程中 卷积运算实质上是将输入信号与其对应的权值参数逐一相乘后再累加的过程 得到最终的输出结果这一过程揭示了一种严格的数学映射关系 在离散时间域中 当一个线性时不变系统接受一个包含 M 个采样点的输入序列时 经过与其权值参数集(包含 N 个采样点)进行卷积运算后 所得到的结果序列将具有 M+N-1 个采样点
在上述代码中所进行的操作相当于将输入信号x进行翻转后持续向右滑动,在所有满足h非零的索引位置上执行乘法运算后再累加
卷积的正式定义简写为y[n] = x[n]*h[n]
以下描述两种实现一维卷积运算的算法
2. 输入端算法
以输入信号的角度分析卷积,在时域上,卷积反映了输入信号各个采样点对输出序列多个采样点的影响,并行处理的方式使得每次计算都基于当前时刻的所有输入数据以及之前的运算结果来进行。以这种思路来理解卷积,则很难用一个具体的公式来表示其输出信号的具体表达式。以下给出了该算法对应的Matlab代码实现:
function [y] = input_conv(x, h)
%input_conv
%输入端版本的卷积实现,x为输入信号的一维数组形式,h为冲激响应的一维数组形式
y_length = length(x)+length(h)-1;
y = linspace(0,0,y_length);
for i=1:length(x)
for j=1:length(h)
y(i+j-1) = y(i+j-1) + x(i) * h(j);
end
end
end
3. 输出端算法
以输出信号为视角考察卷积,在时域上观察到的操作即是在空间域中进行的一种映射关系。换句话说,这是一种逐点计算的方式。从这一角度来看卷积,则可以用一个具体的数学表达式来描述:此时冲激响应h(也可视为核)与之前提到的那个h相比呈倒置关系。其中x是一个包含M个采样点的时间序列数据;而h则是一个长度为N的一维冲激响应序列。其对应的数学公式及其Matlab实现代码如下:
function [y] = output_conv(x, h)
%output_conv
%输出端版本的卷积实现(一),x为输入信号的一维数组形式,h为冲激响应的一维数组形式
y_length = length(x)+length(h)-1;
y = linspace(0,0,y_length);
for i=1:length(y)
for j=1:length(x)
if i-j+1>0 && i-j+1 <length(h)+1
y(i) = y(i) + x(j) * h(i-j+1); %若i-j+1的索引不在h样点的范围,则认为x所在点为0
end
end
end
基于卷积的特性,在实际计算中也无需对冲激响应h进行翻转。相反地,在这种情况下不仅需要对输入信号x进行翻转处理(即反转),而且在后续计算过程中还需要结合冲激响应h来进行相关运算。具体而言,在数学表达式中可以看到这一过程的具体实现方式:y[i] = \sum\limits_{j=0}^{N-1} x[i-j] * h[j]其中y[i]代表输出序列在第i个位置上的值;x[i-j]表示反转后的输入序列与h[j]按照特定的索引关系相乘后累加的结果。
function [y] = output_conv(x, h)
%output_conv
%输出端版本的卷积实现(二),x为输入信号的一维数组形式,h为冲激响应的一维数组形式
y_length = length(x)+length(h)-1;
y = linspace(0,0,y_length);
for i=1:length(y)
for j=1:length(h)
if i-j+1>0 && i-j+1 <length(x)+1
y(i) = y(i) + x(i-j+1) * h(j); %若i-j+1的索引不在x样点的范围,则认为h所在点为0
end
end
end
end
通过分析实现代码能够发现,在处理过程中存在两个不同的算法模式:一种是基于输入数据的处理方式(即当存在多个外层循环时),另一种则是基于输出结果的处理方式(即当仅有一个外层循环时)。具体来说,在存在多个外层循环的情况下(即当这些循环均基于输入数据执行时),该模式对应于"输入端"算法;而如果这些外层循环基于输出结果执行(即当它们用于生成最终结果时),则对应于"输出端"算法。
Steven W. Smith. 实用数字信号处理[M]. 人民邮电出版社,2010.12
