3、学习使用python的矩阵乘法函数np.dot,按照定义,编程实现圆周卷积函数circonv(x1,x2,L),求出序列x1=和x2=[2,5,4,3]的线性卷积和L点圆周卷积,并分别绘图; L=13
时间: 2023-06-08 07:06:53 浏览: 147
好的,我已经理解了你的问题。以下是我的回答:
首先,让我们来理解一下线性卷积和圆周卷积的概念。给定长度为N的序列x和长度为M的序列y,它们的线性卷积可以定义为:
z[n] = sum(x[k] * y[n-k], k=0 to N-1)
其中n的范围为0到N+M-2。可以看出,线性卷积得到的结果是长度为N+M-1的序列。
而圆周卷积则是将x和y在循环移位的意义下做卷积。定义为:
z[n] = sum(x[k] * y[(n-k) mod L], k=0 to L-1)
其中L是圆周卷积的长度,n和k的范围都是0到L-1。可以看出,圆周卷积得到的结果是长度为L的序列。
接下来我们来编写圆周卷积函数。因为圆周卷积涉及到循环移位,因此我们可以使用numpy的roll函数来实现。具体代码如下:
```
import numpy as np
import matplotlib.pyplot as plt
def circonv(x1, x2, L):
N1 = len(x1)
N2 = len(x2)
x2 = np.pad(x2, (0, L-N2), 'wrap') # 补零并循环移位
y = np.zeros(L)
for n in range(L):
for k in range(N1):
y[n] += x1[k] * x2[(n-k) % L] # 按定义计算圆周卷积
return y
```
现在我们可以使用这个函数来计算x1和x2的线性卷积和圆周卷积了。代码如下:
```
x1 = [1, 2, 3, 4, 5]
x2 = [2, 5, 4, 3]
L = 13
# 计算线性卷积
y1 = np.convolve(x1, x2)
N = len(y1)
# 计算圆周卷积
y2 = circonv(x1, x2, L)
# 绘制图像
fig, axs = plt.subplots(2, 1, figsize=(8, 6))
axs[0].stem(range(N), y1)
axs[0].set_title('Linear Convolution')
axs[1].stem(range(L), y2)
axs[1].set_title('Circular Convolution (L={})'.format(L))
plt.tight_layout()
plt.show()
```
这个程序的输出结果是两个图像:一个是线性卷积的结果,一个是圆周卷积的结果。你可以看到,线性卷积得到的结果是长度为7的序列,而圆周卷积得到的结果是长度为13的序列。
阅读全文