线性卷积
信号,系统脉冲响应
,把信号输入到系统,即做卷积
。
从直观的时间顺序来看,时间轴从左往右,则应该在
的左边,所以把
反转一下来展示,如下是0时刻的情况,只有
进入系统,则输出是
。
时间 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 |
信号 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | ||
系统 | 1 | 2 | 4 |
如下是1时刻的情况,只有和
进入系统,则输出是
。
时间 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 |
信号 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | ||
系统 | 1 | 2 | 4 |
同理可得其余输出,注意最有一个输出是只有在系统中的情况,因此输出是
。
用如下代码可以计算出以上结果:
import numpy as np
xn = np.array([i for i in range(1, 10)])
hn = np.array([1, 2, 4])
yn = np.convolve(xn, hn)
print(yn)
#输出:[ 1 4 11 18 25 32 39 46 53 50 36]
接下来不用np来实现这个操作。计算时无需反转。如下表,用
,得到下表的第一行,然后用
,得到下表的第二行;第三行同理。然后把前三行累加即可得到第四行。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | ||
4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | ||
1 | 4 | 11 | 18 | 25 | 32 | 39 | 46 | 53 | 50 | 36 |
实现代码如下:
import numpy as np
xn = np.array([i for i in range(1, 10)])
hn = np.array([1, 2, 4])
out_len = len(xn) + len(hn) - 1
out = np.array([0 for _ in range(out_len)])
for i, v in enumerate(hn):
tmp = xn * v
out[i:len(tmp)+i] += tmp
print(out)