在数字信号处理中经常会用到卷积计算,例如各种滤波器的设计。两个序列的卷积计算大体需要3步:1)翻转其中一个序列;2)移动翻转后的序列,并计算每次移动后两个序列的重叠面积;3)重复第2步,直至两个序列没有重叠部分。
def conv(lst1, lst2):
'''用来计算两个列表所表示的信号的卷积,返回一个列表'''
result = []
#翻转第一个列表
lst1.reverse()
length1 = len(lst1)
length2 = len(lst2)
#移动翻转后的第一个列表,直到“完全移入”
for i in range(1, length1+1):
t = lst1[length1-i:]
#计算重叠“面积”
v = sum((item1*item2 for item1, item2 in zip(t,lst2)))
result.append(v)
#继续移动翻转后的第一个列表,直到“完全移出”
for i in range(1, length2):
t = lst2[i:]
v = sum((item1*item2 for item1, item2 in zip(lst1,t)))
result.append(v)
return result
print(conv([1, 2, 3], [4, 5]))
当然,上面的代码主要是演示卷积的原理,在真正使用时,可以直接使用Python扩展库numpy和scipy来实现,例如下面的代码:
>>> import numpy as np
>>> import scipy.signal
>>> x = np.array([1,2,3])
>>> y = np.array([4, 5])
>>> scipy.signal.convolve(x, y)
array([ 4, 13, 22, 15])